@mnaoumov/typescript-lib 1.4.0 → 1.5.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/README.md CHANGED
@@ -49,12 +49,15 @@ export const COUNTER_API_CONTRACT = defineApiContract<CounterApi>({
49
49
  - `createTypeGuardSchema({ expected, typeGuard, vendor })` validates one value.
50
50
  - `BOOLEAN_GUARD`, `NUMBER_GUARD`, `STRING_GUARD`, `STRING_ARRAY_GUARD` and `UNDEFINED_GUARD` are ready-made guards, `optionalGuard` and `nullableGuard` widen one, and a spread renames what it expects.
51
51
  - `arrayGuard`, `literalGuard`, `unionGuard` and `instanceOfGuard` build a guard together with what it expects, and `createExpectedTypeGuard(expected, typeGuard)` pairs any other type guard with its text.
52
+ - `objectGuard<T>({ ... }, { description })` builds an object guard from one such guard per property, expecting `description: { key: expected; ... }`. `optionsGuard<T>` does the same for an all-optional options bag: each guard describes a present option, and an absent or `undefined` one passes.
52
53
  - The schema `vendor` defaults to `@mnaoumov/typescript-lib`. `createApiContractSchemaBuilders(vendor)` binds it once: destructure `createArgumentsSchema` and `createTypeGuardSchema` from it, and no call passes the vendor again.
53
54
 
54
- The guards for an API's own shapes come from `@mnaoumov/typescript-lib/type-guards`, whose combinators work on bare type guards: `objectTypeGuard<T>({ ... })` takes one guard per property of `T` and none may be missing (`{ shouldRejectUnknownKeys: true }` refuses extra keys), and `arrayTypeGuard`, `literalTypeGuard`, `unionTypeGuard`, `optionalTypeGuard`, `nullableTypeGuard`, `instanceOfTypeGuard` and `functionTypeGuard` build the rest. A name ending in `TypeGuard` returns a bare type guard; the `api-contract` name without `Type` returns the same guard paired with its `expected` text.
55
+ The guards for an API's own shapes come from `@mnaoumov/typescript-lib/type-guards`, whose combinators work on bare type guards: `objectTypeGuard<T>({ ... })` takes one guard per property of `T` and none may be missing (`{ shouldRejectUnknownKeys: true }` refuses extra keys, and `{ exactOptionalKeys: { ... } }`, listing every optional key, reads own keys only and refuses an optional key present as `undefined`), and `arrayTypeGuard`, `literalTypeGuard`, `unionTypeGuard`, `optionalTypeGuard`, `nullableTypeGuard`, `instanceOfTypeGuard` and `functionTypeGuard` build the rest. A name ending in `TypeGuard` returns a bare type guard; the `api-contract` name without `Type` returns the same guard paired with its `expected` text.
55
56
 
56
57
  Running the schemas belongs to whoever owns the call path. `@mnaoumov/obsidian-lib`'s plugin API registry runs them while its debugger is on.
57
58
 
59
+ A contract's own test can use `@mnaoumov/typescript-lib/api-contract-verifier`. `verifyApiContract(contract, { cases, vendor })` takes valid and invalid sample payloads for each half of each method and returns every violation it finds: a method the contract and the cases disagree on, a missing schema, a wrong vendor, a valid payload refused or an invalid one accepted. It returns a list rather than asserting, so it works under any test runner: `expect(await verifyApiContract(...)).toEqual([])`. `validateSync(schema, value)` runs a schema that must answer synchronously, and throws when it answers with a promise.
60
+
58
61
  ## License
59
62
 
60
63
  © [Michael Naumov](https://github.com/mnaoumov/)
@@ -0,0 +1,88 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var api_contract_verifier_exports = {};
25
+ __export(api_contract_verifier_exports, {
26
+ validateSync: () => validateSync,
27
+ verifyApiContract: () => verifyApiContract
28
+ });
29
+ module.exports = __toCommonJS(api_contract_verifier_exports);
30
+ function validateSync(schema, value) {
31
+ const result = schema["~standard"].validate(value);
32
+ if (result instanceof Promise) {
33
+ throw new TypeError("Expected a synchronous schema, got one that answers with a promise.");
34
+ }
35
+ return result;
36
+ }
37
+ async function verifyApiContract(contract, options) {
38
+ const violations = [];
39
+ const looseContract = contract;
40
+ const cases = options.cases;
41
+ for (const methodName of Object.keys(looseContract)) {
42
+ if (!Object.hasOwn(cases, methodName)) {
43
+ violations.push(`${methodName}: the contract has the method, but no cases are given for it.`);
44
+ }
45
+ }
46
+ for (const [methodName, methodCases] of Object.entries(cases)) {
47
+ const methodContract = looseContract[methodName];
48
+ if (methodContract === void 0) {
49
+ violations.push(`${methodName}: cases are given, but the contract has no such method.`);
50
+ continue;
51
+ }
52
+ for (const half of ["input", "output"]) {
53
+ const schema = methodContract[half];
54
+ if (schema === void 0) {
55
+ violations.push(`${methodName} ${half}: the contract has no schema.`);
56
+ continue;
57
+ }
58
+ const { vendor } = schema["~standard"];
59
+ const version = schema["~standard"].version;
60
+ if (vendor !== options.vendor || version !== 1) {
61
+ violations.push(`${methodName} ${half}: the schema reports vendor '${vendor}' and version ${String(version)}, expected '${options.vendor}' and 1.`);
62
+ }
63
+ const { invalid, valid } = methodCases[half];
64
+ for (const [index, value] of valid.entries()) {
65
+ const result = await schema["~standard"].validate(value);
66
+ if (result.issues !== void 0) {
67
+ violations.push(`${methodName} ${half}: valid case ${String(index)} was refused: ${formatIssues(result.issues)}`);
68
+ }
69
+ }
70
+ for (const [index, value] of invalid.entries()) {
71
+ const result = await schema["~standard"].validate(value);
72
+ if (result.issues === void 0 || result.issues.length === 0) {
73
+ violations.push(`${methodName} ${half}: invalid case ${String(index)} was accepted.`);
74
+ }
75
+ }
76
+ }
77
+ }
78
+ return violations;
79
+ }
80
+ function formatIssues(issues) {
81
+ return issues.map((issue) => issue.message).join(" ");
82
+ }
83
+ // Annotate the CommonJS export names for ESM import in node:
84
+ 0 && (module.exports = {
85
+ validateSync,
86
+ verifyApiContract
87
+ });
88
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC12ZXJpZmllci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENoZWNrcyBhbiB7QGxpbmsgQXBpQ29udHJhY3R9IGFnYWluc3Qgc2FtcGxlIHBheWxvYWRzLCBmb3IgYSBjb250cmFjdCdzIG93biB0ZXN0OiBldmVyeSBtZXRob2QgaGFzIGJvdGggc2NoZW1hcyxcbiAqIGV2ZXJ5IHNjaGVtYSByZXBvcnRzIHRoZSBleHBlY3RlZCB2ZW5kb3IsIGFuZCBlYWNoIHNjaGVtYSBhY2NlcHRzIGV2ZXJ5IHZhbGlkIHBheWxvYWQgYW5kIHJlZnVzZXMgZXZlcnkgaW52YWxpZCBvbmUuXG4gKlxuICogSXQgcmV0dXJucyB3aGF0IGl0IGZvdW5kIHJhdGhlciB0aGFuIGFzc2VydGluZywgc28gaXQgcnVucyB1bmRlciBhbnkgdGVzdCBmcmFtZXdvcms6XG4gKlxuICogYGBgdHNcbiAqIGV4cGVjdChhd2FpdCB2ZXJpZnlBcGlDb250cmFjdChNWV9BUElfQ09OVFJBQ1QsIHsgY2FzZXMsIHZlbmRvcjogJ215LXBsdWdpbicgfSkpLnRvRXF1YWwoW10pO1xuICogYGBgXG4gKlxuICogSXQgbGl2ZXMgYXBhcnQgZnJvbSBgYXBpLWNvbnRyYWN0LnRzYCBiZWNhdXNlIGEgY29udHJhY3QgYSBjb25zdW1lciBjb3BpZXMgaW1wb3J0cyB0aGF0IG1vZHVsZSBpbnRvIGl0cyBwbHVnaW4sXG4gKiBhbmQgbm90aGluZyBoZXJlIGlzIG5lZWRlZCBhdCBydW50aW1lLlxuICovXG5cbmltcG9ydCB0eXBlIHsgU3RhbmRhcmRTY2hlbWFWMSB9IGZyb20gJ0BzdGFuZGFyZC1zY2hlbWEvc3BlYyc7XG5cbmltcG9ydCB0eXBlIHsgQXBpQ29udHJhY3QgfSBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5cbi8qKlxuICogVGhlIHNhbXBsZSBwYXlsb2FkcyBvZiBvbmUgbWV0aG9kLCBmb3IgZWFjaCBoYWxmIG9mIGl0cyBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNZXRob2RDYXNlcyB7XG4gIC8qKlxuICAgKiBTYW1wbGUgYXJndW1lbnQgbGlzdHMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dDogUGF5bG9hZENhc2VzO1xuXG4gIC8qKlxuICAgKiBTYW1wbGUgcmV0dXJuIHZhbHVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogUGF5bG9hZENhc2VzO1xufVxuXG4vKipcbiAqIFNhbXBsZSBwYXlsb2FkcyBmb3Igb25lIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlsb2FkQ2FzZXMge1xuICAvKipcbiAgICogUGF5bG9hZHMgdGhlIHNjaGVtYSBtdXN0IHJlZnVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGludmFsaWQ6IHJlYWRvbmx5IHVua25vd25bXTtcblxuICAvKipcbiAgICogUGF5bG9hZHMgdGhlIHNjaGVtYSBtdXN0IGFjY2VwdC5cbiAgICovXG4gIHJlYWRvbmx5IHZhbGlkOiByZWFkb25seSB1bmtub3duW107XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHZlcmlmeUFwaUNvbnRyYWN0fS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRDb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBcGlDb250cmFjdE9wdGlvbnM8VENvbnRyYWN0IGV4dGVuZHMgQXBpQ29udHJhY3Q+IHtcbiAgLyoqXG4gICAqIFRoZSBzYW1wbGUgcGF5bG9hZHMsIG9uZSBlbnRyeSBwZXIgbWV0aG9kIG9mIHRoZSBjb250cmFjdC5cbiAgICovXG4gIHJlYWRvbmx5IGNhc2VzOiBSZWFkb25seTxSZWNvcmQ8a2V5b2YgVENvbnRyYWN0ICYgc3RyaW5nLCBBcGlNZXRob2RDYXNlcz4+O1xuXG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIGV2ZXJ5IHNjaGVtYSBtdXN0IHJlcG9ydC5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJ1bnMgYSBTdGFuZGFyZCBTY2hlbWEgdGhhdCBtdXN0IGJlIHN5bmNocm9ub3VzLiBBIHNjaGVtYSBndWFyZGluZyBhIGNhbGwgaXQgY2Fubm90IGRlbGF5LCBhcyBhIGNvbnRyYWN0J3Mgc2NoZW1hc1xuICogZG8sIGhhcyB0byBhbnN3ZXIgYmVmb3JlIHRoYXQgY2FsbCByZXR1cm5zLlxuICpcbiAqIEB0eXBlUGFyYW0gVE91dHB1dCAtIFRoZSB0eXBlIHRoZSBzY2hlbWEgcHJvZHVjZXMuXG4gKiBAcGFyYW0gc2NoZW1hIC0gVGhlIHNjaGVtYS5cbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byB2YWxpZGF0ZS5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEncyByZXN1bHQuXG4gKiBAdGhyb3dzIElmIHRoZSBzY2hlbWEgYW5zd2VycyB3aXRoIGEgcHJvbWlzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU3luYzxUT3V0cHV0PihzY2hlbWE6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVE91dHB1dD4sIHZhbHVlOiB1bmtub3duKTogU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VE91dHB1dD4ge1xuICBjb25zdCByZXN1bHQgPSBzY2hlbWFbJ35zdGFuZGFyZCddLnZhbGlkYXRlKHZhbHVlKTtcbiAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhIHN5bmNocm9ub3VzIHNjaGVtYSwgZ290IG9uZSB0aGF0IGFuc3dlcnMgd2l0aCBhIHByb21pc2UuJyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENoZWNrcyBhIGNvbnRyYWN0IGFnYWluc3Qgc2FtcGxlIHBheWxvYWRzOiB0aGUgY29udHJhY3QgaGFzIGV4YWN0bHkgdGhlIG1ldGhvZHMgdGhlIGNhc2VzIG5hbWUsIGVhY2ggd2l0aCBib3RoXG4gKiBzY2hlbWFzLCBldmVyeSBzY2hlbWEgcmVwb3J0cyB0aGUgZ2l2ZW4gdmVuZG9yIGFuZCBTdGFuZGFyZCBTY2hlbWEgdmVyc2lvbiAxLCBhbmQgZWFjaCBzY2hlbWEgYWNjZXB0cyBldmVyeSB2YWxpZFxuICogcGF5bG9hZCBhbmQgcmVmdXNlcyBldmVyeSBpbnZhbGlkIG9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRDb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEBwYXJhbSBjb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHNhbXBsZSBwYXlsb2FkcyBhbmQgdGhlIGV4cGVjdGVkIHZlbmRvci5cbiAqIEByZXR1cm5zIE9uZSBtZXNzYWdlIHBlciB2aW9sYXRpb24sIGVtcHR5IHdoZW4gdGhlIGNvbnRyYWN0IHBhc3Nlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFwaUNvbnRyYWN0PFRDb250cmFjdCBleHRlbmRzIEFwaUNvbnRyYWN0Pihjb250cmFjdDogVENvbnRyYWN0LCBvcHRpb25zOiBWZXJpZnlBcGlDb250cmFjdE9wdGlvbnM8VENvbnRyYWN0Pik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3QgdmlvbGF0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbG9vc2VDb250cmFjdDogQXBpQ29udHJhY3QgPSBjb250cmFjdDtcbiAgY29uc3QgY2FzZXM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEFwaU1ldGhvZENhc2VzPj4gPSBvcHRpb25zLmNhc2VzO1xuXG4gIGZvciAoY29uc3QgbWV0aG9kTmFtZSBvZiBPYmplY3Qua2V5cyhsb29zZUNvbnRyYWN0KSkge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihjYXNlcywgbWV0aG9kTmFtZSkpIHtcbiAgICAgIHZpb2xhdGlvbnMucHVzaChgJHttZXRob2ROYW1lfTogdGhlIGNvbnRyYWN0IGhhcyB0aGUgbWV0aG9kLCBidXQgbm8gY2FzZXMgYXJlIGdpdmVuIGZvciBpdC5gKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBtZXRob2RDYXNlc10gb2YgT2JqZWN0LmVudHJpZXMoY2FzZXMpKSB7XG4gICAgY29uc3QgbWV0aG9kQ29udHJhY3QgPSBsb29zZUNvbnRyYWN0W21ldGhvZE5hbWVdO1xuICAgIGlmIChtZXRob2RDb250cmFjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB2aW9sYXRpb25zLnB1c2goYCR7bWV0aG9kTmFtZX06IGNhc2VzIGFyZSBnaXZlbiwgYnV0IHRoZSBjb250cmFjdCBoYXMgbm8gc3VjaCBtZXRob2QuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGhhbGYgb2YgWydpbnB1dCcsICdvdXRwdXQnXSBhcyBjb25zdCkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gbWV0aG9kQ29udHJhY3RbaGFsZl07XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlvbGF0aW9ucy5wdXNoKGAke21ldGhvZE5hbWV9ICR7aGFsZn06IHRoZSBjb250cmFjdCBoYXMgbm8gc2NoZW1hLmApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCBhcyBhIG51bWJlcjogdGhlIHR5cGUgc2F5cyAxLCBidXQgYSBzY2hlbWEgZnJvbSBhbm90aGVyIGxpYnJhcnkgbWF5IHNwZWFrIGEgbGF0ZXIgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHsgdmVuZG9yIH0gPSBzY2hlbWFbJ35zdGFuZGFyZCddO1xuICAgICAgY29uc3QgdmVyc2lvbjogbnVtYmVyID0gc2NoZW1hWyd+c3RhbmRhcmQnXS52ZXJzaW9uO1xuICAgICAgaWYgKHZlbmRvciAhPT0gb3B0aW9ucy52ZW5kb3IgfHwgdmVyc2lvbiAhPT0gMSkge1xuICAgICAgICB2aW9sYXRpb25zLnB1c2goYCR7bWV0aG9kTmFtZX0gJHtoYWxmfTogdGhlIHNjaGVtYSByZXBvcnRzIHZlbmRvciAnJHt2ZW5kb3J9JyBhbmQgdmVyc2lvbiAke1N0cmluZyh2ZXJzaW9uKX0sIGV4cGVjdGVkICcke29wdGlvbnMudmVuZG9yfScgYW5kIDEuYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaW52YWxpZCwgdmFsaWQgfSA9IG1ldGhvZENhc2VzW2hhbGZdO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIHZhbHVlXSBvZiB2YWxpZC5lbnRyaWVzKCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2NoZW1hWyd+c3RhbmRhcmQnXS52YWxpZGF0ZSh2YWx1ZSk7XG4gICAgICAgIGlmIChyZXN1bHQuaXNzdWVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2aW9sYXRpb25zLnB1c2goYCR7bWV0aG9kTmFtZX0gJHtoYWxmfTogdmFsaWQgY2FzZSAke1N0cmluZyhpbmRleCl9IHdhcyByZWZ1c2VkOiAke2Zvcm1hdElzc3VlcyhyZXN1bHQuaXNzdWVzKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIGludmFsaWQuZW50cmllcygpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNjaGVtYVsnfnN0YW5kYXJkJ10udmFsaWRhdGUodmFsdWUpO1xuICAgICAgICBpZiAocmVzdWx0Lmlzc3VlcyA9PT0gdW5kZWZpbmVkIHx8IHJlc3VsdC5pc3N1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKGAke21ldGhvZE5hbWV9ICR7aGFsZn06IGludmFsaWQgY2FzZSAke1N0cmluZyhpbmRleCl9IHdhcyBhY2NlcHRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB2aW9sYXRpb25zO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRJc3N1ZXMoaXNzdWVzOiByZWFkb25seSBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXNzdWVzLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpLmpvaW4oJyAnKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBNkVPLFNBQVMsYUFBc0IsUUFBNEMsT0FBa0Q7QUFDbEksUUFBTSxTQUFTLE9BQU8sV0FBVyxFQUFFLFNBQVMsS0FBSztBQUNqRCxNQUFJLGtCQUFrQixTQUFTO0FBQzdCLFVBQU0sSUFBSSxVQUFVLHFFQUFxRTtBQUFBLEVBQzNGO0FBRUEsU0FBTztBQUNUO0FBWUEsZUFBc0Isa0JBQWlELFVBQXFCLFNBQWlFO0FBQzNKLFFBQU0sYUFBdUIsQ0FBQztBQUM5QixRQUFNLGdCQUE2QjtBQUNuQyxRQUFNLFFBQWtELFFBQVE7QUFFaEUsYUFBVyxjQUFjLE9BQU8sS0FBSyxhQUFhLEdBQUc7QUFDbkQsUUFBSSxDQUFDLE9BQU8sT0FBTyxPQUFPLFVBQVUsR0FBRztBQUNyQyxpQkFBVyxLQUFLLEdBQUcsVUFBVSwrREFBK0Q7QUFBQSxJQUM5RjtBQUFBLEVBQ0Y7QUFFQSxhQUFXLENBQUMsWUFBWSxXQUFXLEtBQUssT0FBTyxRQUFRLEtBQUssR0FBRztBQUM3RCxVQUFNLGlCQUFpQixjQUFjLFVBQVU7QUFDL0MsUUFBSSxtQkFBbUIsUUFBVztBQUNoQyxpQkFBVyxLQUFLLEdBQUcsVUFBVSx5REFBeUQ7QUFDdEY7QUFBQSxJQUNGO0FBRUEsZUFBVyxRQUFRLENBQUMsU0FBUyxRQUFRLEdBQVk7QUFDL0MsWUFBTSxTQUFTLGVBQWUsSUFBSTtBQUNsQyxVQUFJLFdBQVcsUUFBVztBQUN4QixtQkFBVyxLQUFLLEdBQUcsVUFBVSxJQUFJLElBQUksK0JBQStCO0FBQ3BFO0FBQUEsTUFDRjtBQUdBLFlBQU0sRUFBRSxPQUFPLElBQUksT0FBTyxXQUFXO0FBQ3JDLFlBQU0sVUFBa0IsT0FBTyxXQUFXLEVBQUU7QUFDNUMsVUFBSSxXQUFXLFFBQVEsVUFBVSxZQUFZLEdBQUc7QUFDOUMsbUJBQVcsS0FBSyxHQUFHLFVBQVUsSUFBSSxJQUFJLGdDQUFnQyxNQUFNLGlCQUFpQixPQUFPLE9BQU8sQ0FBQyxlQUFlLFFBQVEsTUFBTSxVQUFVO0FBQUEsTUFDcEo7QUFFQSxZQUFNLEVBQUUsU0FBUyxNQUFNLElBQUksWUFBWSxJQUFJO0FBQzNDLGlCQUFXLENBQUMsT0FBTyxLQUFLLEtBQUssTUFBTSxRQUFRLEdBQUc7QUFDNUMsY0FBTSxTQUFTLE1BQU0sT0FBTyxXQUFXLEVBQUUsU0FBUyxLQUFLO0FBQ3ZELFlBQUksT0FBTyxXQUFXLFFBQVc7QUFDL0IscUJBQVcsS0FBSyxHQUFHLFVBQVUsSUFBSSxJQUFJLGdCQUFnQixPQUFPLEtBQUssQ0FBQyxpQkFBaUIsYUFBYSxPQUFPLE1BQU0sQ0FBQyxFQUFFO0FBQUEsUUFDbEg7QUFBQSxNQUNGO0FBRUEsaUJBQVcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLFFBQVEsR0FBRztBQUM5QyxjQUFNLFNBQVMsTUFBTSxPQUFPLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFDdkQsWUFBSSxPQUFPLFdBQVcsVUFBYSxPQUFPLE9BQU8sV0FBVyxHQUFHO0FBQzdELHFCQUFXLEtBQUssR0FBRyxVQUFVLElBQUksSUFBSSxrQkFBa0IsT0FBTyxLQUFLLENBQUMsZ0JBQWdCO0FBQUEsUUFDdEY7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGFBQWEsUUFBbUQ7QUFDdkUsU0FBTyxPQUFPLElBQUksQ0FBQyxVQUFVLE1BQU0sT0FBTyxFQUFFLEtBQUssR0FBRztBQUN0RDsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,81 @@
1
+ /// <reference path="./library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Checks an {@link ApiContract} against sample payloads, for a contract's own test: every method has both schemas,
6
+ * every schema reports the expected vendor, and each schema accepts every valid payload and refuses every invalid one.
7
+ *
8
+ * It returns what it found rather than asserting, so it runs under any test framework:
9
+ *
10
+ * ```ts
11
+ * expect(await verifyApiContract(MY_API_CONTRACT, { cases, vendor: 'my-plugin' })).toEqual([]);
12
+ * ```
13
+ *
14
+ * It lives apart from `api-contract.ts` because a contract a consumer copies imports that module into its plugin,
15
+ * and nothing here is needed at runtime.
16
+ */
17
+ import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution-mode': 'import' };
18
+ import type { ApiContract } from './api-contract.cjs';
19
+ /**
20
+ * The sample payloads of one method, for each half of its contract.
21
+ */
22
+ export interface ApiMethodCases {
23
+ /**
24
+ * Sample argument lists.
25
+ */
26
+ readonly input: PayloadCases;
27
+ /**
28
+ * Sample return values.
29
+ */
30
+ readonly output: PayloadCases;
31
+ }
32
+ /**
33
+ * Sample payloads for one schema.
34
+ */
35
+ export interface PayloadCases {
36
+ /**
37
+ * Payloads the schema must refuse.
38
+ */
39
+ readonly invalid: readonly unknown[];
40
+ /**
41
+ * Payloads the schema must accept.
42
+ */
43
+ readonly valid: readonly unknown[];
44
+ }
45
+ /**
46
+ * Options for {@link verifyApiContract}.
47
+ *
48
+ * @typeParam TContract - The contract.
49
+ */
50
+ export interface VerifyApiContractOptions<TContract extends ApiContract> {
51
+ /**
52
+ * The sample payloads, one entry per method of the contract.
53
+ */
54
+ readonly cases: Readonly<Record<keyof TContract & string, ApiMethodCases>>;
55
+ /**
56
+ * The Standard Schema `vendor` every schema must report.
57
+ */
58
+ readonly vendor: string;
59
+ }
60
+ /**
61
+ * Runs a Standard Schema that must be synchronous. A schema guarding a call it cannot delay, as a contract's schemas
62
+ * do, has to answer before that call returns.
63
+ *
64
+ * @typeParam TOutput - The type the schema produces.
65
+ * @param schema - The schema.
66
+ * @param value - The value to validate.
67
+ * @returns The schema's result.
68
+ * @throws If the schema answers with a promise.
69
+ */
70
+ export declare function validateSync<TOutput>(schema: StandardSchemaV1<unknown, TOutput>, value: unknown): StandardSchemaV1.Result<TOutput>;
71
+ /**
72
+ * Checks a contract against sample payloads: the contract has exactly the methods the cases name, each with both
73
+ * schemas, every schema reports the given vendor and Standard Schema version 1, and each schema accepts every valid
74
+ * payload and refuses every invalid one.
75
+ *
76
+ * @typeParam TContract - The contract.
77
+ * @param contract - The contract.
78
+ * @param options - The sample payloads and the expected vendor.
79
+ * @returns One message per violation, empty when the contract passes.
80
+ */
81
+ export declare function verifyApiContract<TContract extends ApiContract>(contract: TContract, options: VerifyApiContractOptions<TContract>): Promise<string[]>;
@@ -37,7 +37,9 @@ __export(api_contract_exports, {
37
37
  instanceOfGuard: () => instanceOfGuard,
38
38
  literalGuard: () => literalGuard,
39
39
  nullableGuard: () => nullableGuard,
40
+ objectGuard: () => objectGuard,
40
41
  optionalGuard: () => optionalGuard,
42
+ optionsGuard: () => optionsGuard,
41
43
  unionGuard: () => unionGuard
42
44
  });
43
45
  module.exports = __toCommonJS(api_contract_exports);
@@ -96,12 +98,29 @@ function nullableGuard(guard) {
96
98
  typeGuard: (value) => value === null || guard.typeGuard(value)
97
99
  };
98
100
  }
101
+ function objectGuard(propertyGuards, options) {
102
+ const guards = (0, import_object_utils.castTo)(propertyGuards);
103
+ const exactOptionalKeys = options?.exactOptionalKeys ?? {};
104
+ return createExpectedTypeGuard(
105
+ describeObject(options?.description, guards, (key) => Object.hasOwn(exactOptionalKeys, key)),
106
+ (0, import_type_guards.objectTypeGuard)((0, import_object_utils.castTo)(mapGuards(guards, (guard) => guard.typeGuard)), options)
107
+ );
108
+ }
99
109
  function optionalGuard(guard) {
100
110
  return {
101
111
  expected: `${guard.expected} or undefined`,
102
112
  typeGuard: (value) => value === void 0 || guard.typeGuard(value)
103
113
  };
104
114
  }
115
+ function optionsGuard(optionGuards, options) {
116
+ const guards = (0, import_object_utils.castTo)(optionGuards);
117
+ return createExpectedTypeGuard(
118
+ describeObject(options?.description, guards, () => true),
119
+ (0, import_type_guards.objectTypeGuard)((0, import_object_utils.castTo)(mapGuards(guards, (guard) => (0, import_type_guards.optionalTypeGuard)(guard.typeGuard))), {
120
+ shouldRejectUnknownKeys: options?.shouldRejectUnknownKeys ?? false
121
+ })
122
+ );
123
+ }
105
124
  function unionGuard(...guards) {
106
125
  return createExpectedTypeGuard(
107
126
  guards.map((guard) => guard.expected).join(" or "),
@@ -117,6 +136,11 @@ function createSchema(validate, vendor) {
117
136
  }
118
137
  };
119
138
  }
139
+ function describeObject(description, guards, isOptional) {
140
+ const entries = Object.entries(guards);
141
+ const properties = entries.length === 0 ? "{}" : `{ ${entries.map(([key, guard]) => `${key}${isOptional(key) ? "?" : ""}: ${guard.expected}`).join("; ")} }`;
142
+ return description === void 0 ? properties : `${description}: ${properties}`;
143
+ }
120
144
  function formatLiteral(literal) {
121
145
  if ((0, import_type_guards.isString)(literal)) {
122
146
  return `'${literal}'`;
@@ -126,6 +150,9 @@ function formatLiteral(literal) {
126
150
  function isReadonlyArray(value) {
127
151
  return Array.isArray(value);
128
152
  }
153
+ function mapGuards(guards, toTypeGuard) {
154
+ return Object.fromEntries(Object.entries(guards).map(([key, guard]) => [key, toTypeGuard(guard)]));
155
+ }
129
156
  // Annotate the CommonJS export names for ESM import in node:
130
157
  0 && (module.exports = {
131
158
  BOOLEAN_GUARD,
@@ -142,7 +169,9 @@ function isReadonlyArray(value) {
142
169
  instanceOfGuard,
143
170
  literalGuard,
144
171
  nullableGuard,
172
+ objectGuard,
145
173
  optionalGuard,
174
+ optionsGuard,
146
175
  unionGuard
147
176
  });
148
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHR5cGUge1xuICBHdWFyZGVkVHlwZSxcbiAgTGl0ZXJhbCxcbiAgVHlwZUd1YXJkXG59IGZyb20gJy4vdHlwZS1ndWFyZHMudHMnO1xuXG5pbXBvcnQgeyBMSUJSQVJZX05BTUUgfSBmcm9tICcuL2xpYnJhcnkudHMnO1xuaW1wb3J0IHsgY2FzdFRvIH0gZnJvbSAnLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHtcbiAgYXJyYXlUeXBlR3VhcmQsXG4gIGluc3RhbmNlT2ZUeXBlR3VhcmQsXG4gIGlzQm9vbGVhbixcbiAgaXNOdW1iZXIsXG4gIGlzU3RyaW5nLFxuICBpc1N0cmluZ0FycmF5LFxuICBpc1VuZGVmaW5lZCxcbiAgbGl0ZXJhbFR5cGVHdWFyZCxcbiAgdW5pb25UeXBlR3VhcmRcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogVGhlIGNvbnRyYWN0IGFuIEFQSSBkZWNsYXJlczogZXZlcnkga2V5IGlzIGEgbWV0aG9kIHRoZSBBUEkgcHJvbWlzZXMgdG8gZXhwb3NlLCBhbmQgaXRzIHZhbHVlIG9wdGlvbmFsbHlcbiAqIGNhcnJpZXMgdGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgdGhhdCBtZXRob2QuXG4gKlxuICogVHlwZWQgb3ZlciB0aGUgQVBJIHdoZW4gb25lIGlzIG5hbWVkOiBgQXBpQ29udHJhY3Q8TXlBcGk+YCBoYXMgZXhhY3RseSBvbmUgZW50cnkgcGVyIGZ1bmN0aW9uIG1lbWJlciBvZlxuICogYE15QXBpYCAoYSBtaXNzaW5nIG1ldGhvZCwgYW4gZXh0cmEgb25lIG9yIGEgbWlzc3BlbGxlZCBvbmUgZG9lcyBub3QgY29tcGlsZSksIGFuZCBlYWNoIGVudHJ5J3Mgc2NoZW1hcyBtdXN0XG4gKiBwcm9kdWNlIHRoYXQgbWV0aG9kJ3MgcGFyYW1ldGVycyBhbmQgYXdhaXRlZCByZXR1cm4gdmFsdWUuIFdpdGhvdXQgYSB0eXBlIGFyZ3VtZW50LCBvciBmb3IgYG9iamVjdGAsIGl0IGlzIHRoZVxuICogbG9vc2UgcmVjb3JkIGEgcmVhZGVyIHRoYXQga25vd3Mgbm90aGluZyBhYm91dCB0aGUgQVBJIHNlZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLiBgb2JqZWN0YCwgdGhlIGRlZmF1bHQsIG1lYW5zIFwibm90IHR5cGVkXCIuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+ID0gb2JqZWN0IGV4dGVuZHMgVEFwaSA/IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEFwaU1ldGhvZENvbnRyYWN0Pj5cbiAgOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+O1xuXG4vKipcbiAqIFRoZSBzY2hlbWEgYnVpbGRlcnMgb2YgdGhpcyBtb2R1bGUgd2l0aCB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIGFscmVhZHkgYm91bmQsIGFzXG4gKiB7QGxpbmsgY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVyc30gcmV0dXJucyB0aGVtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnMge1xuICAvKipcbiAgICoge0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0sIHJlcG9ydGluZyB0aGUgYm91bmQgdmVuZG9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFRQYXJhbWV0ZXJzIC0gVGhlIG1ldGhvZCdzIHBhcmFtZXRlcnMsIGluZmVycmVkIGZyb20gdGhlIGd1YXJkcyBvciBmcm9tIHRoZSBjb250cmFjdCBlbnRyeS5cbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPbmUgZ3VhcmQgcGVyIHBhcmFtZXRlciwgaW4gb3JkZXIuXG4gICAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gICAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPlxuICApID0+IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj47XG5cbiAgLyoqXG4gICAqIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9LCByZXBvcnRpbmcgdGhlIGJvdW5kIHZlbmRvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gICAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCBhbmQgd2hhdCBpdCBleHBlY3RzLlxuICAgKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlVHlwZUd1YXJkU2NoZW1hOiA8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KSA9PiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+O1xufVxuXG4vKipcbiAqIFRoZSBwYXlsb2FkIHNjaGVtYXMgZm9yIGEgc2luZ2xlIEFQSSBtZXRob2QuIEJvdGggaGFsdmVzIGFyZSBvcHRpb25hbDogYSBtZXRob2QgbWF5IGRlY2xhcmUgb25seSBpdHMgaW5wdXQsXG4gKiBvbmx5IGl0cyBvdXRwdXQsIG5laXRoZXIgKHRoZSBlbnRyeSB0aGVuIGp1c3QgZGVjbGFyZXMgdGhhdCB0aGUgbWV0aG9kIG11c3QgZXhpc3QpLCBvciBib3RoLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgYXMgYSB0dXBsZSwgd2hpY2ggdGhlIGlucHV0IHNjaGVtYSBtdXN0IHByb2R1Y2UuXG4gKiBAdHlwZVBhcmFtIFRSZXR1cm5WYWx1ZSAtIFRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIGF3YWl0ZWQsIHdoaWNoIHRoZSBvdXRwdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycyA9IHVua25vd24sIFRSZXR1cm5WYWx1ZSA9IHVua25vd24+IHtcbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgYXJndW1lbnRzLCBhcyBhbiBhcnJheS5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUGFyYW1ldGVycz47XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgbWV0aG9kJ3MgcmV0dXJuIHZhbHVlLCBvciwgd2hlbiB0aGUgbWV0aG9kIHJldHVybnMgYSB0aGVuYWJsZSwgdGhlIHZhbHVlIGl0IHJlc29sdmVzIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0PzogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUUmV0dXJuVmFsdWU+O1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEksIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBrZXlzIGEgdHlwZWQge0BsaW5rIEFwaUNvbnRyYWN0fSBoYXMuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kTmFtZTxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IGtleW9mIEFwaU1ldGhvZHM8VEFwaT4gJiBzdHJpbmc7XG5cbi8qKlxuICogVGhlIGZ1bmN0aW9uIG1lbWJlcnMgb2YgYW4gQVBJLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkuXG4gKi9cbmV4cG9ydCB0eXBlIEFwaU1ldGhvZHM8VEFwaSBleHRlbmRzIG9iamVjdD4gPSB7XG4gIFtUS2V5IGluIGtleW9mIFRBcGkgYXMgVEFwaVtUS2V5XSBleHRlbmRzICguLi5hcmd1bWVudHNfOiBuZXZlcikgPT4gdW5rbm93biA/IFRLZXkgOiBuZXZlcl06IFRBcGlbVEtleV07XG59O1xuXG4vKipcbiAqIE9uZSB0eXBlIGd1YXJkIHBlciBwYXJhbWV0ZXIgb2YgYSBtZXRob2QsIGluIG9yZGVyLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHtcbiAgcmVhZG9ubHkgW1RJbmRleCBpbiBrZXlvZiBUUGFyYW1ldGVyc106IEV4cGVjdGVkVHlwZUd1YXJkPFRQYXJhbWV0ZXJzW1RJbmRleF0+O1xufTtcbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXJndW1lbnRzU2NoZW1hT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlVHlwZUd1YXJkU2NoZW1hfTogdGhlIGd1YXJkLCB3aGF0IGl0IGV4cGVjdHMsIGFuZCBvcHRpb25hbGx5IHRoZSBzY2hlbWEncyB2ZW5kb3IuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVHlwZUd1YXJkU2NoZW1hUGFyYW1zPFQ+IGV4dGVuZHMgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogVGhlIFN0YW5kYXJkIFNjaGVtYSBgdmVuZG9yYCB0aGUgc2NoZW1hIHJlcG9ydHMuIERlZmF1bHRzIHRvIHRoaXMgbGlicmFyeSdzIG5hbWUuXG4gICAqL1xuICByZWFkb25seSB2ZW5kb3I/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIHZhbHVlIGEgc2NoZW1hIGFjY2VwdHMsIGRlc2NyaWJlZCBieSBhIHR5cGUgZ3VhcmQgYW5kIGJ5IHdoYXQgaXQgZXhwZWN0cywgZm9yIHRoZSBpc3N1ZSBtZXNzYWdlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgLyoqXG4gICAqIFdoYXQgdGhlIHZhbHVlIHNob3VsZCBoYXZlIGJlZW4sIHBocmFzZWQgdG8gZm9sbG93IFwiRXhwZWN0ZWRcIiwgZS5nLiBgJ2Egc3RyaW5nJ2AuXG4gICAqL1xuICByZWFkb25seSBleHBlY3RlZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlIHZhbHVlIGlzIGFjY2VwdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgdmFsdWUgaXMgYSBgVGAuXG4gICAqL1xuICByZWFkb25seSB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bikgPT4gdmFsdWUgaXMgVDtcbn1cblxuLyoqXG4gKiBUaGUge0BsaW5rIEFwaUNvbnRyYWN0fSBvZiBhIG5hbWVkIEFQSTogb25lIGVudHJ5IHBlciBmdW5jdGlvbiBtZW1iZXIsIGVhY2ggdHlwZWQgYWdhaW5zdCB0aGF0IG1lbWJlci4gQm90aFxuICogc2NoZW1hcyBhcmUgUkVRVUlSRUQgaGVyZSwgc28gYSB0eXBlZCBjb250cmFjdCBpcyBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgZXZlcnkgc2lnbmF0dXJlIGFuZCBhIGB7fWAgZW50cnkgZG9lc1xuICogbm90IGNvbXBpbGUuIE9ubHkgdGhlIGxvb3NlIGZvcm0gbGVhdmVzIHRoZW0gb3B0aW9uYWwuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSSB0aGUgY29udHJhY3QgZGVzY3JpYmVzLlxuICovXG5leHBvcnQgdHlwZSBUeXBlZEFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBBcGlNZXRob2ROYW1lPFRBcGk+XS0/OiBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IGluZmVyIFRQYXJhbWV0ZXJzKSA9PiBpbmZlciBUUmV0dXJuVmFsdWUgPyBSZXF1aXJlZDxBcGlNZXRob2RDb250cmFjdDxUUGFyYW1ldGVycywgQXdhaXRlZDxUUmV0dXJuVmFsdWU+Pj5cbiAgICA6IG5ldmVyO1xufTtcblxudHlwZSBNdXRhYmxlVHVwbGU8VFR1cGxlIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPiA9IHsgLXJlYWRvbmx5IFtUSW5kZXggaW4ga2V5b2YgVFR1cGxlXTogVFR1cGxlW1RJbmRleF0gfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgYm9vbGVhbi5cbiAqL1xuZXhwb3J0IGNvbnN0IEJPT0xFQU5fR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPGJvb2xlYW4+ID0geyBleHBlY3RlZDogJ2EgYm9vbGVhbicsIHR5cGVHdWFyZDogaXNCb29sZWFuIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIG51bWJlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE5VTUJFUl9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8bnVtYmVyPiA9IHsgZXhwZWN0ZWQ6ICdhIG51bWJlcicsIHR5cGVHdWFyZDogaXNOdW1iZXIgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGEgc3RyaW5nLiBTcHJlYWQgaXQgdG8gc2F5IHdoYXQgdGhlIHN0cmluZyBpczogYHsgLi4uU1RSSU5HX0dVQVJELCBleHBlY3RlZDogJ2EgcGF0aCcgfWAuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHN0cmluZz4gPSB7IGV4cGVjdGVkOiAnYSBzdHJpbmcnLCB0eXBlR3VhcmQ6IGlzU3RyaW5nIH07XG5cbi8qKlxuICogQWNjZXB0cyBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICovXG5leHBvcnQgY29uc3QgU1RSSU5HX0FSUkFZX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxzdHJpbmdbXT4gPSB7IGV4cGVjdGVkOiAnYW4gYXJyYXkgb2Ygc3RyaW5ncycsIHR5cGVHdWFyZDogaXNTdHJpbmdBcnJheSB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHRoZSBvdXRwdXQgb2YgYSBtZXRob2QgcmV0dXJuaW5nIGB2b2lkYCBvciBgUHJvbWlzZTx2b2lkPmAuXG4gKi9cbmV4cG9ydCBjb25zdCBVTkRFRklORURfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPHVuZGVmaW5lZD4gPSB7IGV4cGVjdGVkOiAndW5kZWZpbmVkJywgdHlwZUd1YXJkOiBpc1VuZGVmaW5lZCB9O1xuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFuIGFycmF5IHdob3NlIGV2ZXJ5IGl0ZW0gYGl0ZW1HdWFyZGAgYWNjZXB0cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBhbiBpdGVtLlxuICogQHBhcmFtIGl0ZW1HdWFyZCAtIFRoZSBndWFyZCBmb3Igb25lIGl0ZW0uXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUd1YXJkPFQ+KGl0ZW1HdWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxUW10+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIGlzICR7aXRlbUd1YXJkLmV4cGVjdGVkfWAsIGFycmF5VHlwZUd1YXJkKGl0ZW1HdWFyZC50eXBlR3VhcmQpKTtcbn1cblxuLyoqXG4gKiBCaW5kcyB0aGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIG9uY2UsIHNvIGEgY29udHJhY3QgZG9lcyBub3QgcGFzcyBpdCB0byBldmVyeSBzY2hlbWEgYnVpbGRlci4gRGVzdHJ1Y3R1cmUgdGhlXG4gKiByZXN1bHQgdW5kZXIgdGhlIGJ1aWxkZXJzJyBvd24gbmFtZXMgYW5kIHRoZSBjYWxscyByZWFkIGV4YWN0bHkgYXMgdGhlIHVuYm91bmQgb25lcyBkbzpcbiAqXG4gKiBgYGB0c1xuICogY29uc3QgeyBjcmVhdGVBcmd1bWVudHNTY2hlbWEsIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSB9ID0gY3JlYXRlQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycygnbXktcGx1Z2luJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmVuZG9yIC0gVGhlIHZlbmRvciBldmVyeSBzY2hlbWEgcmVwb3J0cy5cbiAqIEByZXR1cm5zIFRoZSBib3VuZCBidWlsZGVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnModmVuZG9yOiBzdHJpbmcpOiBBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzIHtcbiAgcmV0dXJuIHtcbiAgICBjcmVhdGVBcmd1bWVudHNTY2hlbWE6IDxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4ocGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPikgPT4gY3JlYXRlQXJndW1lbnRzU2NoZW1hKHBhcmFtZXRlcnMsIHsgdmVuZG9yIH0pLFxuICAgIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTogPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPikgPT4gY3JlYXRlVHlwZUd1YXJkU2NoZW1hKHsgLi4uZ3VhcmQsIHZlbmRvciB9KVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgaW5wdXQgc2NoZW1hIG9mIGEgbWV0aG9kIGNvbnRyYWN0OiBhIHNjaGVtYSBvdmVyIHRoZSBtZXRob2QncyBBUkdVTUVOVCBMSVNULCBvbmUgdHlwZSBndWFyZCBwZXJcbiAqIHBhcmFtZXRlci4gQW4gYXJndW1lbnQgdGhhdCBmYWlscyBpdHMgZ3VhcmQgaXMgcmVwb3J0ZWQgd2l0aCBpdHMgaW5kZXggYXMgdGhlIGlzc3VlIHBhdGgsIGFuZCBhbiBhcmd1bWVudCBsaXN0XG4gKiBsb25nZXIgdGhhbiB0aGUgcGFyYW1ldGVyIGxpc3QgaXMgcmVmdXNlZC4gQSBtaXNzaW5nIGFyZ3VtZW50IHJlYWNoZXMgaXRzIGd1YXJkIGFzIGB1bmRlZmluZWRgLCBzbyBhbiBvcHRpb25hbFxuICogcGFyYW1ldGVyJ3MgZ3VhcmQgYWNjZXB0cyBgdW5kZWZpbmVkYCAoc2VlIHtAbGluayBvcHRpb25hbEd1YXJkfSkuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBpbmZlcnJlZCBmcm9tIHRoZSBndWFyZHMgb3IgZnJvbSB0aGUgY29udHJhY3QgZW50cnkuXG4gKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9uZSBndWFyZCBwZXIgcGFyYW1ldGVyLCBpbiBvcmRlci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBzY2hlbWEuXG4gKiBAcmV0dXJucyBUaGUgc2NoZW1hLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXJndW1lbnRzU2NoZW1hPGNvbnN0IFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihcbiAgcGFyYW1ldGVyczogQXJndW1lbnRUeXBlR3VhcmRzPFRQYXJhbWV0ZXJzPixcbiAgb3B0aW9ucz86IENyZWF0ZUFyZ3VtZW50c1NjaGVtYU9wdGlvbnNcbik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgTXV0YWJsZVR1cGxlPFRQYXJhbWV0ZXJzPj4ge1xuICBjb25zdCBwYXJhbWV0ZXJMaXN0ID0gY2FzdFRvPHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KHBhcmFtZXRlcnMpO1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKCh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+ID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBpc3N1ZXM6IFt7IG1lc3NhZ2U6ICdFeHBlY3RlZCBhbiBhcmd1bWVudCBsaXN0LicgfV0gfTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUubGVuZ3RoID4gcGFyYW1ldGVyTGlzdC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IGlzc3VlczogW3sgbWVzc2FnZTogYEV4cGVjdGVkIGF0IG1vc3QgJHtTdHJpbmcocGFyYW1ldGVyTGlzdC5sZW5ndGgpfSBhcmd1bWVudChzKSwgZ290ICR7U3RyaW5nKHZhbHVlLmxlbmd0aCl9LmAgfV0gfTtcbiAgICB9XG5cbiAgICBjb25zdCBpc3N1ZXMgPSBwYXJhbWV0ZXJMaXN0LmZsYXRNYXAoKHBhcmFtZXRlciwgaW5kZXgpOiBTdGFuZGFyZFNjaGVtYVYxLklzc3VlW10gPT4gcGFyYW1ldGVyLnR5cGVHdWFyZCh2YWx1ZVtpbmRleF0pID8gW10gOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbWV0ZXIuZXhwZWN0ZWR9LmAsIHBhdGg6IFtpbmRleF0gfV0pO1xuICAgIHJldHVybiBpc3N1ZXMubGVuZ3RoID09PSAwID8geyB2YWx1ZTogY2FzdFRvPE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+KHZhbHVlKSB9IDogeyBpc3N1ZXMgfTtcbiAgfSwgb3B0aW9ucz8udmVuZG9yKTtcbn1cblxuLyoqXG4gKiBQYWlycyBhIHR5cGUgZ3VhcmQgd2l0aCB3aGF0IGl0IGV4cGVjdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZXhwZWN0ZWQgLSBXaGF0IHRoZSB2YWx1ZSBzaG91bGQgaGF2ZSBiZWVuLCBwaHJhc2VkIHRvIGZvbGxvdyBcIkV4cGVjdGVkXCIsIGUuZy4gYCdhIHN0cmluZydgLlxuICogQHBhcmFtIHR5cGVHdWFyZCAtIFRoZSBndWFyZC5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkPFQ+KGV4cGVjdGVkOiBzdHJpbmcsIHR5cGVHdWFyZDogVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICByZXR1cm4geyBleHBlY3RlZCwgdHlwZUd1YXJkIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgc2NoZW1hIG92ZXIgb25lIHZhbHVlIGZyb20gYSB0eXBlIGd1YXJkOiB0aGUgb3V0cHV0IHNjaGVtYSBvZiBhIG1ldGhvZCBjb250cmFjdCwgdHlwaWNhbGx5LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBndWFyZCwgd2hhdCBpdCBleHBlY3RzLCBhbmQgb3B0aW9uYWxseSB0aGUgc2NoZW1hJ3MgdmVuZG9yLlxuICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYTxUPihwYXJhbXM6IENyZWF0ZVR5cGVHdWFyZFNjaGVtYVBhcmFtczxUPik6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4gY3JlYXRlU2NoZW1hKFxuICAgICh2YWx1ZTogdW5rbm93bik6IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+ID0+IHBhcmFtcy50eXBlR3VhcmQodmFsdWUpID8geyB2YWx1ZSB9IDogeyBpc3N1ZXM6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCAke3BhcmFtcy5leHBlY3RlZH0uYCB9XSB9LFxuICAgIHBhcmFtcy52ZW5kb3JcbiAgKTtcbn1cblxuLyoqXG4gKiBTdGF0ZXMgYSBjb250cmFjdCBhZ2FpbnN0IGFuIEFQSSB0eXBlLCBzbyBldmVyeSBlbnRyeSBpcyBjaGVja2VkIGFnYWluc3QgaXRzIG1ldGhvZCBhbmQgdGhlIHNjaGVtYSBidWlsZGVyc1xuICogaW5zaWRlIGl0IGluZmVyIHRoZWlyIHR5cGVzIGZyb20gdGhlIG1ldGhvZCByYXRoZXIgdGhhbiBmcm9tIGEgcmVzdGF0ZWQgdHVwbGUuIEl0IHJldHVybnMgdGhlIGNvbnRyYWN0IGFzIGlzLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIGNvbnRyYWN0IGRlc2NyaWJlcy5cbiAqIEBwYXJhbSBjb250cmFjdCAtIFRoZSBjb250cmFjdC5cbiAqIEByZXR1cm5zIFRoZSBzYW1lIGNvbnRyYWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdD4oY29udHJhY3Q6IFR5cGVkQXBpQ29udHJhY3Q8Tm9JbmZlcjxUQXBpPj4pOiBUeXBlZEFwaUNvbnRyYWN0PFRBcGk+IHtcbiAgcmV0dXJuIGNvbnRyYWN0O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLCBvciBvZiBhIGNsYXNzIGRlcml2ZWQgZnJvbSBpdCwgZXhwZWN0aW5nIGBhbiBpbnN0YW5jZSBvZmAgdGhlXG4gKiBjbGFzcydzIG5hbWUuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gY29uc3RydWN0b3IgLSBUaGUgY2xhc3MuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YW5jZU9mR3VhcmQ8VD4oY29uc3RydWN0b3I6IGFic3RyYWN0IG5ldyAoLi4uYXJndW1lbnRzXzogbmV2ZXJbXSkgPT4gVCk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBhbiBpbnN0YW5jZSBvZiAke2NvbnN0cnVjdG9yLm5hbWV9YCwgaW5zdGFuY2VPZlR5cGVHdWFyZChjb25zdHJ1Y3RvcikpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBrZXlzIG9mIGEgcmVjb3JkLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS4gVHlwaW5nIHRoZSByZWNvcmQgb3ZlciBhIHVuaW9uXG4gKiBtYWtlcyBhIG1lbWJlciBsYXRlciBhZGRlZCB0byB0aGUgdW5pb24gZmFpbCB0byBjb21waWxlIHVudGlsIGl0IGlzIGxpc3RlZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIEEgcmVjb3JkIHdob3NlIGtleXMgYXJlIHRoZSBhY2NlcHRlZCBzdHJpbmdzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbEd1YXJkPFQgZXh0ZW5kcyBzdHJpbmc+KGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8VCwgdHJ1ZT4+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD47XG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBleGFjdGx5IHRoZSBsaXN0ZWQgdmFsdWVzLCBleHBlY3RpbmcgYG9uZSBvZmAgdGhlbS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxpdGVyYWxzIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxHdWFyZDxUIGV4dGVuZHMgTGl0ZXJhbD4obGl0ZXJhbHM6IHJlYWRvbmx5IFRbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBUaGUgYWNjZXB0ZWQgdmFsdWVzLCBhcyBhIGxpc3Qgb3IgYXMgdGhlIGtleXMgb2YgYSByZWNvcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsR3VhcmQobGl0ZXJhbHM6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHRydWU+PiB8IHJlYWRvbmx5IExpdGVyYWxbXSk6IEV4cGVjdGVkVHlwZUd1YXJkPExpdGVyYWw+IHtcbiAgY29uc3QgbGl0ZXJhbExpc3Q6IHJlYWRvbmx5IExpdGVyYWxbXSA9IGlzUmVhZG9ubHlBcnJheShsaXRlcmFscykgPyBsaXRlcmFscyA6IE9iamVjdC5rZXlzKGxpdGVyYWxzKTtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKGBvbmUgb2YgJHtsaXRlcmFsTGlzdC5tYXAoKGxpdGVyYWwpID0+IGZvcm1hdExpdGVyYWwobGl0ZXJhbCkpLmpvaW4oJywgJyl9YCwgbGl0ZXJhbFR5cGVHdWFyZChsaXRlcmFsTGlzdCkpO1xufVxuXG4vKipcbiAqIFdpZGVucyBhIGd1YXJkIHRvIGFsc28gYWNjZXB0IGBudWxsYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBudWxsYWJsZUd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPG51bGwgfCBUPiB7XG4gIHJldHVybiB7XG4gICAgZXhwZWN0ZWQ6IGAke2d1YXJkLmV4cGVjdGVkfSBvciBudWxsYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCBUID0+IHZhbHVlID09PSBudWxsIHx8IGd1YXJkLnR5cGVHdWFyZCh2YWx1ZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgdW5kZWZpbmVkYCwgd2hpY2ggaXMgd2hhdCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgd2hlbiBpdCBpcyBsZWZ0IG91dC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBndWFyZCAtIFRoZSBndWFyZCB0byB3aWRlbi5cbiAqIEByZXR1cm5zIEEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYGd1YXJkYCBhY2NlcHRzLCBvciBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsR3VhcmQ8VD4oZ3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VCB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgdW5kZWZpbmVkYCxcbiAgICB0eXBlR3VhcmQ6ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFQgfCB1bmRlZmluZWQgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIHdoYXQgYW55IG9mIHRoZSBnaXZlbiBndWFyZHMgYWNjZXB0cywgZXhwZWN0aW5nIHRoZWlyIGBleHBlY3RlZGAgdGV4dHMgam9pbmVkIGJ5IGBvcmAuXG4gKlxuICogQHR5cGVQYXJhbSBUR3VhcmRzIC0gVGhlIGd1YXJkcy5cbiAqIEBwYXJhbSBndWFyZHMgLSBUaGUgZ3VhcmRzLCB0cmllZCBpbiBvcmRlci5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuaW9uR3VhcmQ8Y29uc3QgVEd1YXJkcyBleHRlbmRzIHJlYWRvbmx5IEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+W10+KFxuICAuLi5ndWFyZHM6IFRHdWFyZHNcbik6IEV4cGVjdGVkVHlwZUd1YXJkPEd1YXJkZWRUeXBlPFRHdWFyZHNbbnVtYmVyXVsndHlwZUd1YXJkJ10+PiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChcbiAgICBndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQuZXhwZWN0ZWQpLmpvaW4oJyBvciAnKSxcbiAgICB1bmlvblR5cGVHdWFyZCguLi5ndWFyZHMubWFwKChndWFyZCkgPT4gZ3VhcmQudHlwZUd1YXJkKSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlU2NoZW1hPFQ+KHZhbGlkYXRlOiAodmFsdWU6IHVua25vd24pID0+IFN0YW5kYXJkU2NoZW1hVjEuUmVzdWx0PFQ+LCB2ZW5kb3I6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD4ge1xuICByZXR1cm4ge1xuICAgICd+c3RhbmRhcmQnOiB7XG4gICAgICB2YWxpZGF0ZSxcbiAgICAgIHZlbmRvcjogdmVuZG9yID8/IExJQlJBUllfTkFNRSxcbiAgICAgIHZlcnNpb246IDFcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdExpdGVyYWwobGl0ZXJhbDogTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChpc1N0cmluZyhsaXRlcmFsKSkge1xuICAgIHJldHVybiBgJyR7bGl0ZXJhbH0nYDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2YgbGl0ZXJhbCA9PT0gJ2JpZ2ludCcgPyBgJHtTdHJpbmcobGl0ZXJhbCl9bmAgOiBTdHJpbmcobGl0ZXJhbCk7XG59XG5cbmZ1bmN0aW9uIGlzUmVhZG9ubHlBcnJheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHJlYWRvbmx5IHVua25vd25bXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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
177
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FwaS1jb250cmFjdC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBjb250cmFjdCBvZiBhbiBBUEkgb25lIG1vZHVsZSBleHBvc2VzIHRvIGFub3RoZXI6IHdoaWNoIG1ldGhvZHMgaXQgcHJvbWlzZXMsIGFuZCBhXG4gKiB7QGxpbmsgaHR0cHM6Ly9zdGFuZGFyZHNjaGVtYS5kZXYgfCBTdGFuZGFyZCBTY2hlbWF9IG92ZXIgZWFjaCBtZXRob2QncyBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZS5cbiAqXG4gKiBUaGUgc2NoZW1hcyBhcmUgcGxhaW4gb2JqZWN0cyBvdmVyIHBsYWluIGZ1bmN0aW9ucywgd2hpY2ggYSB0eXBlIGd1YXJkIGFscmVhZHkgaXMsIHNvIGEgY29udHJhY3QgY2FuIGNyb3NzIGFcbiAqIGJvdW5kYXJ5IGJldHdlZW4gdHdvIGNvcGllcyBvZiBhIGxpYnJhcnkgYW5kIHN0aWxsIGJlIHJ1biBieSB3aGljaGV2ZXIgY29weSByZWFkcyBpdC4gVGhlIGJ1aWxkZXJzIGhlcmUgdHVyblxuICogdGhlIGd1YXJkcyBhIG1vZHVsZSBhbHJlYWR5IGhhcyBpbnRvIHRoZSB0d28gc2hhcGVzIGEgbWV0aG9kIGNvbnRyYWN0IG5lZWRzOiBvbmUgdmFsdWUgKGFuIG91dHB1dCkgYW5kIG9uZVxuICogYXJndW1lbnQgbGlzdCAoYW4gaW5wdXQpLiB6b2QgLyB2YWxpYm90IC8gYXJrdHlwZSBzY2hlbWFzIHBsdWcgaW50byB0aGUgc2FtZSBzbG90cyB1bmNoYW5nZWQ7IHRoaXMgbW9kdWxlIGp1c3RcbiAqIGRvZXMgbm90IG1ha2UgZXZlcnkgcHJvdmlkZXIgYnVuZGxlIG9uZSB0byBkZXNjcmliZSB0d28gYXJndW1lbnRzLlxuICpcbiAqIFJ1bm5pbmcgdGhlIHNjaGVtYXMgaXMgbGVmdCB0byB3aG9ldmVyIG93bnMgdGhlIGNhbGwgcGF0aCwgc2luY2UgdGhhdCBpcyB3aGVyZSBhbiBpc3N1ZSBjYW4gYmUgcmVwb3J0ZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBTdGFuZGFyZFNjaGVtYVYxIH0gZnJvbSAnQHN0YW5kYXJkLXNjaGVtYS9zcGVjJztcblxuaW1wb3J0IHR5cGUge1xuICBHdWFyZGVkVHlwZSxcbiAgTGl0ZXJhbCxcbiAgT2JqZWN0VHlwZUd1YXJkT3B0aW9ucyxcbiAgUHJvcGVydHlUeXBlR3VhcmRzLFxuICBUeXBlR3VhcmRcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbmltcG9ydCB7IExJQlJBUllfTkFNRSB9IGZyb20gJy4vbGlicmFyeS50cyc7XG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICcuL29iamVjdC11dGlscy50cyc7XG5pbXBvcnQge1xuICBhcnJheVR5cGVHdWFyZCxcbiAgaW5zdGFuY2VPZlR5cGVHdWFyZCxcbiAgaXNCb29sZWFuLFxuICBpc051bWJlcixcbiAgaXNTdHJpbmcsXG4gIGlzU3RyaW5nQXJyYXksXG4gIGlzVW5kZWZpbmVkLFxuICBsaXRlcmFsVHlwZUd1YXJkLFxuICBvYmplY3RUeXBlR3VhcmQsXG4gIG9wdGlvbmFsVHlwZUd1YXJkLFxuICB1bmlvblR5cGVHdWFyZFxufSBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcblxuLyoqXG4gKiBUaGUgY29udHJhY3QgYW4gQVBJIGRlY2xhcmVzOiBldmVyeSBrZXkgaXMgYSBtZXRob2QgdGhlIEFQSSBwcm9taXNlcyB0byBleHBvc2UsIGFuZCBpdHMgdmFsdWUgb3B0aW9uYWxseVxuICogY2FycmllcyB0aGUgcGF5bG9hZCBzY2hlbWFzIGZvciB0aGF0IG1ldGhvZC5cbiAqXG4gKiBUeXBlZCBvdmVyIHRoZSBBUEkgd2hlbiBvbmUgaXMgbmFtZWQ6IGBBcGlDb250cmFjdDxNeUFwaT5gIGhhcyBleGFjdGx5IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyIG9mXG4gKiBgTXlBcGlgIChhIG1pc3NpbmcgbWV0aG9kLCBhbiBleHRyYSBvbmUgb3IgYSBtaXNzcGVsbGVkIG9uZSBkb2VzIG5vdCBjb21waWxlKSwgYW5kIGVhY2ggZW50cnkncyBzY2hlbWFzIG11c3RcbiAqIHByb2R1Y2UgdGhhdCBtZXRob2QncyBwYXJhbWV0ZXJzIGFuZCBhd2FpdGVkIHJldHVybiB2YWx1ZS4gV2l0aG91dCBhIHR5cGUgYXJndW1lbnQsIG9yIGZvciBgb2JqZWN0YCwgaXQgaXMgdGhlXG4gKiBsb29zZSByZWNvcmQgYSByZWFkZXIgdGhhdCBrbm93cyBub3RoaW5nIGFib3V0IHRoZSBBUEkgc2Vlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuIGBvYmplY3RgLCB0aGUgZGVmYXVsdCwgbWVhbnMgXCJub3QgdHlwZWRcIi5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpQ29udHJhY3Q8VEFwaSBleHRlbmRzIG9iamVjdCA9IG9iamVjdD4gPSBvYmplY3QgZXh0ZW5kcyBUQXBpID8gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgQXBpTWV0aG9kQ29udHJhY3Q+PlxuICA6IFR5cGVkQXBpQ29udHJhY3Q8VEFwaT47XG5cbi8qKlxuICogVGhlIHNjaGVtYSBidWlsZGVycyBvZiB0aGlzIG1vZHVsZSB3aXRoIHRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgYWxyZWFkeSBib3VuZCwgYXNcbiAqIHtAbGluayBjcmVhdGVBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzfSByZXR1cm5zIHRoZW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycyB7XG4gIC8qKlxuICAgKiB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfSwgcmVwb3J0aW5nIHRoZSBib3VuZCB2ZW5kb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgaW5mZXJyZWQgZnJvbSB0aGUgZ3VhcmRzIG9yIGZyb20gdGhlIGNvbnRyYWN0IGVudHJ5LlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIE9uZSBndWFyZCBwZXIgcGFyYW1ldGVyLCBpbiBvcmRlci5cbiAgICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTogPGNvbnN0IFRQYXJhbWV0ZXJzIGV4dGVuZHMgcmVhZG9ubHkgdW5rbm93bltdPihcbiAgICBwYXJhbWV0ZXJzOiBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnM+XG4gICkgPT4gU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PjtcblxuICAvKipcbiAgICoge0BsaW5rIGNyZWF0ZVR5cGVHdWFyZFNjaGVtYX0sIHJlcG9ydGluZyB0aGUgYm91bmQgdmVuZG9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAgICogQHBhcmFtIGd1YXJkIC0gVGhlIGd1YXJkIGFuZCB3aGF0IGl0IGV4cGVjdHMuXG4gICAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVUeXBlR3VhcmRTY2hlbWE6IDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pID0+IFN0YW5kYXJkU2NoZW1hVjE8dW5rbm93biwgVD47XG59XG5cbi8qKlxuICogVGhlIHBheWxvYWQgc2NoZW1hcyBmb3IgYSBzaW5nbGUgQVBJIG1ldGhvZC4gQm90aCBoYWx2ZXMgYXJlIG9wdGlvbmFsOiBhIG1ldGhvZCBtYXkgZGVjbGFyZSBvbmx5IGl0cyBpbnB1dCxcbiAqIG9ubHkgaXRzIG91dHB1dCwgbmVpdGhlciAodGhlIGVudHJ5IHRoZW4ganVzdCBkZWNsYXJlcyB0aGF0IHRoZSBtZXRob2QgbXVzdCBleGlzdCksIG9yIGJvdGguXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLCBhcyBhIHR1cGxlLCB3aGljaCB0aGUgaW5wdXQgc2NoZW1hIG11c3QgcHJvZHVjZS5cbiAqIEB0eXBlUGFyYW0gVFJldHVyblZhbHVlIC0gVGhlIG1ldGhvZCdzIHJldHVybiB2YWx1ZSwgYXdhaXRlZCwgd2hpY2ggdGhlIG91dHB1dCBzY2hlbWEgbXVzdCBwcm9kdWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaU1ldGhvZENvbnRyYWN0PFRQYXJhbWV0ZXJzID0gdW5rbm93biwgVFJldHVyblZhbHVlID0gdW5rbm93bj4ge1xuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyBhcmd1bWVudHMsIGFzIGFuIGFycmF5LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRQYXJhbWV0ZXJzPjtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBtZXRob2QncyByZXR1cm4gdmFsdWUsIG9yLCB3aGVuIHRoZSBtZXRob2QgcmV0dXJucyBhIHRoZW5hYmxlLCB0aGUgdmFsdWUgaXQgcmVzb2x2ZXMgdG8uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ/OiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFRSZXR1cm5WYWx1ZT47XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBmdW5jdGlvbiBtZW1iZXJzIG9mIGFuIEFQSSwgd2hpY2ggYXJlIGV4YWN0bHkgdGhlIGtleXMgYSB0eXBlZCB7QGxpbmsgQXBpQ29udHJhY3R9IGhhcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJLlxuICovXG5leHBvcnQgdHlwZSBBcGlNZXRob2ROYW1lPFRBcGkgZXh0ZW5kcyBvYmplY3Q+ID0ga2V5b2YgQXBpTWV0aG9kczxUQXBpPiAmIHN0cmluZztcblxuLyoqXG4gKiBUaGUgZnVuY3Rpb24gbWVtYmVycyBvZiBhbiBBUEkuXG4gKlxuICogQHR5cGVQYXJhbSBUQXBpIC0gVGhlIEFQSS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBpTWV0aG9kczxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW1RLZXkgaW4ga2V5b2YgVEFwaSBhcyBUQXBpW1RLZXldIGV4dGVuZHMgKC4uLmFyZ3VtZW50c186IG5ldmVyKSA9PiB1bmtub3duID8gVEtleSA6IG5ldmVyXTogVEFwaVtUS2V5XTtcbn07XG5cbi8qKlxuICogT25lIHR5cGUgZ3VhcmQgcGVyIHBhcmFtZXRlciBvZiBhIG1ldGhvZCwgaW4gb3JkZXIuXG4gKlxuICogQHR5cGVQYXJhbSBUUGFyYW1ldGVycyAtIFRoZSBtZXRob2QncyBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgdHlwZSBBcmd1bWVudFR5cGVHdWFyZHM8VFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+ID0ge1xuICByZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRQYXJhbWV0ZXJzXTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFBhcmFtZXRlcnNbVEluZGV4XT47XG59O1xuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY3JlYXRlQXJndW1lbnRzU2NoZW1hfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBTdGFuZGFyZCBTY2hlbWEgYHZlbmRvcmAgdGhlIHNjaGVtYSByZXBvcnRzLiBEZWZhdWx0cyB0byB0aGlzIGxpYnJhcnkncyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVuZG9yPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjcmVhdGVUeXBlR3VhcmRTY2hlbWF9OiB0aGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4gZXh0ZW5kcyBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIC8qKlxuICAgKiBUaGUgU3RhbmRhcmQgU2NoZW1hIGB2ZW5kb3JgIHRoZSBzY2hlbWEgcmVwb3J0cy4gRGVmYXVsdHMgdG8gdGhpcyBsaWJyYXJ5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHZlbmRvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgdmFsdWUgYSBzY2hlbWEgYWNjZXB0cywgZGVzY3JpYmVkIGJ5IGEgdHlwZSBndWFyZCBhbmQgYnkgd2hhdCBpdCBleHBlY3RzLCBmb3IgdGhlIGlzc3VlIG1lc3NhZ2UuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAgICovXG4gIHJlYWRvbmx5IGV4cGVjdGVkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciB0aGUgdmFsdWUgaXMgYWNjZXB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIGBUYC5cbiAgICovXG4gIHJlYWRvbmx5IHR5cGVHdWFyZDogKHZhbHVlOiB1bmtub3duKSA9PiB2YWx1ZSBpcyBUO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvYmplY3RHdWFyZH0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIG9iamVjdCB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9iamVjdEd1YXJkT3B0aW9uczxUIGV4dGVuZHMgb2JqZWN0PiBleHRlbmRzIE9iamVjdFR5cGVHdWFyZE9wdGlvbnM8VD4ge1xuICAvKipcbiAgICogV2hhdCB0aGUgb2JqZWN0IGlzLCBwdXQgYmVmb3JlIGl0cyBwcm9wZXJ0aWVzIGluIGBleHBlY3RlZGAsIGUuZy4gYCd0aGUgb3B0aW9ucyBvZiB0aGUgbGluaydgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT25lIGd1YXJkIHBlciBvcHRpb24gb2YgYW4gYWxsLW9wdGlvbmFsIG9iamVjdCB0eXBlLCBhcyB7QGxpbmsgb3B0aW9uc0d1YXJkfSB0YWtlcyB0aGVtOiBlYWNoIGRlc2NyaWJlcyBhXG4gKiBQUkVTRU5UIG9wdGlvbiwgc28gaXQgZG9lcyBub3QgYWNjZXB0IGB1bmRlZmluZWRgLiBBIHJlcXVpcmVkIHByb3BlcnR5IG9mIGBUYCB0YWtlcyBgbmV2ZXJgLCBzbyBhIHR5cGUgdGhhdCBpc1xuICogbm90IGFsbC1vcHRpb25hbCBkb2VzIG5vdCBjb21waWxlLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSBvYmplY3QgdHlwZS5cbiAqL1xuZXhwb3J0IHR5cGUgT3B0aW9uR3VhcmRzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBrZXlvZiBUXS0/OiBQYXJ0aWFsPFBpY2s8VCwgVEtleT4+IGV4dGVuZHMgUGljazxULCBUS2V5PiA/IEV4cGVjdGVkVHlwZUd1YXJkPEV4Y2x1ZGU8VFtUS2V5XSwgdW5kZWZpbmVkPj4gOiBuZXZlcjtcbn07XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIG9wdGlvbnNHdWFyZH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9uc0d1YXJkT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvcHRpb25zIGFyZSwgcHV0IGJlZm9yZSB0aGVtIGluIGBleHBlY3RlZGAsIGUuZy4gYCdzZWxlY3Qgb3B0aW9ucydgLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB2YWx1ZSBjYXJyeWluZyBhbiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5IHRoYXQgbm8gb3B0aW9uIGd1YXJkIG5hbWVzIGlzIHJlZnVzZWQuIExldHRpbmcgaXQgdGhyb3VnaCxcbiAgICogdGhlIGRlZmF1bHQsIGxldHMgYSBjb25zdW1lciBjb21waWxlZCBhZ2FpbnN0IGEgbGF0ZXIgdmVyc2lvbiBvZiB0aGUgb3B0aW9ucyBwYXNzIG9uZSB0aGlzIHZlcnNpb24gZG9lcyBub3Qga25vdy5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVqZWN0VW5rbm93bktleXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9uZSBndWFyZCBwZXIgcHJvcGVydHkgb2YgYW4gb2JqZWN0IHR5cGUsIGFzIHtAbGluayBvYmplY3RHdWFyZH0gdGFrZXMgdGhlbSwgdHlwZWQgYXMge0BsaW5rIFByb3BlcnR5VHlwZUd1YXJkc31cbiAqIHR5cGVzIHRoZSBiYXJlIGd1YXJkcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb2JqZWN0IHR5cGUuXG4gKi9cbmV4cG9ydCB0eXBlIFByb3BlcnR5R3VhcmRzPFQgZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICByZWFkb25seSBbVEtleSBpbiBrZXlvZiBUXS0/OiBFeHBlY3RlZFR5cGVHdWFyZDxQYXJ0aWFsPFBpY2s8VCwgVEtleT4+IGV4dGVuZHMgUGljazxULCBUS2V5PiA/IFRbVEtleV0gfCB1bmRlZmluZWQgOiBUW1RLZXldPjtcbn07XG5cbi8qKlxuICogVGhlIHtAbGluayBBcGlDb250cmFjdH0gb2YgYSBuYW1lZCBBUEk6IG9uZSBlbnRyeSBwZXIgZnVuY3Rpb24gbWVtYmVyLCBlYWNoIHR5cGVkIGFnYWluc3QgdGhhdCBtZW1iZXIuIEJvdGhcbiAqIHNjaGVtYXMgYXJlIFJFUVVJUkVEIGhlcmUsIHNvIGEgdHlwZWQgY29udHJhY3QgaXMgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIGV2ZXJ5IHNpZ25hdHVyZSBhbmQgYSBge31gIGVudHJ5IGRvZXNcbiAqIG5vdCBjb21waWxlLiBPbmx5IHRoZSBsb29zZSBmb3JtIGxlYXZlcyB0aGVtIG9wdGlvbmFsLlxuICpcbiAqIEB0eXBlUGFyYW0gVEFwaSAtIFRoZSBBUEkgdGhlIGNvbnRyYWN0IGRlc2NyaWJlcy5cbiAqL1xuZXhwb3J0IHR5cGUgVHlwZWRBcGlDb250cmFjdDxUQXBpIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgcmVhZG9ubHkgW1RLZXkgaW4gQXBpTWV0aG9kTmFtZTxUQXBpPl0tPzogVEFwaVtUS2V5XSBleHRlbmRzICguLi5hcmd1bWVudHNfOiBpbmZlciBUUGFyYW1ldGVycykgPT4gaW5mZXIgVFJldHVyblZhbHVlID8gUmVxdWlyZWQ8QXBpTWV0aG9kQ29udHJhY3Q8VFBhcmFtZXRlcnMsIEF3YWl0ZWQ8VFJldHVyblZhbHVlPj4+XG4gICAgOiBuZXZlcjtcbn07XG5cbnR5cGUgTXV0YWJsZVR1cGxlPFRUdXBsZSBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4gPSB7IC1yZWFkb25seSBbVEluZGV4IGluIGtleW9mIFRUdXBsZV06IFRUdXBsZVtUSW5kZXhdIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIGJvb2xlYW4uXG4gKi9cbmV4cG9ydCBjb25zdCBCT09MRUFOX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxib29sZWFuPiA9IHsgZXhwZWN0ZWQ6ICdhIGJvb2xlYW4nLCB0eXBlR3VhcmQ6IGlzQm9vbGVhbiB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYSBudW1iZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBOVU1CRVJfR1VBUkQ6IEV4cGVjdGVkVHlwZUd1YXJkPG51bWJlcj4gPSB7IGV4cGVjdGVkOiAnYSBudW1iZXInLCB0eXBlR3VhcmQ6IGlzTnVtYmVyIH07XG5cbi8qKlxuICogQWNjZXB0cyBhIHN0cmluZy4gU3ByZWFkIGl0IHRvIHNheSB3aGF0IHRoZSBzdHJpbmcgaXM6IGB7IC4uLlNUUklOR19HVUFSRCwgZXhwZWN0ZWQ6ICdhIHBhdGgnIH1gLlxuICovXG5leHBvcnQgY29uc3QgU1RSSU5HX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDxzdHJpbmc+ID0geyBleHBlY3RlZDogJ2Egc3RyaW5nJywgdHlwZUd1YXJkOiBpc1N0cmluZyB9O1xuXG4vKipcbiAqIEFjY2VwdHMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqL1xuZXhwb3J0IGNvbnN0IFNUUklOR19BUlJBWV9HVUFSRDogRXhwZWN0ZWRUeXBlR3VhcmQ8c3RyaW5nW10+ID0geyBleHBlY3RlZDogJ2FuIGFycmF5IG9mIHN0cmluZ3MnLCB0eXBlR3VhcmQ6IGlzU3RyaW5nQXJyYXkgfTtcblxuLyoqXG4gKiBBY2NlcHRzIGB1bmRlZmluZWRgLCB3aGljaCBpcyB0aGUgb3V0cHV0IG9mIGEgbWV0aG9kIHJldHVybmluZyBgdm9pZGAgb3IgYFByb21pc2U8dm9pZD5gLlxuICovXG5leHBvcnQgY29uc3QgVU5ERUZJTkVEX0dVQVJEOiBFeHBlY3RlZFR5cGVHdWFyZDx1bmRlZmluZWQ+ID0geyBleHBlY3RlZDogJ3VuZGVmaW5lZCcsIHR5cGVHdWFyZDogaXNVbmRlZmluZWQgfTtcblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbiBhcnJheSB3aG9zZSBldmVyeSBpdGVtIGBpdGVtR3VhcmRgIGFjY2VwdHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgYW4gaXRlbS5cbiAqIEBwYXJhbSBpdGVtR3VhcmQgLSBUaGUgZ3VhcmQgZm9yIG9uZSBpdGVtLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlHdWFyZDxUPihpdGVtR3VhcmQ6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+KTogRXhwZWN0ZWRUeXBlR3VhcmQ8VFtdPiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChgYW4gYXJyYXkgd2hvc2UgZXZlcnkgaXRlbSBpcyAke2l0ZW1HdWFyZC5leHBlY3RlZH1gLCBhcnJheVR5cGVHdWFyZChpdGVtR3VhcmQudHlwZUd1YXJkKSk7XG59XG5cbi8qKlxuICogQmluZHMgdGhlIFN0YW5kYXJkIFNjaGVtYSBgdmVuZG9yYCBvbmNlLCBzbyBhIGNvbnRyYWN0IGRvZXMgbm90IHBhc3MgaXQgdG8gZXZlcnkgc2NoZW1hIGJ1aWxkZXIuIERlc3RydWN0dXJlIHRoZVxuICogcmVzdWx0IHVuZGVyIHRoZSBidWlsZGVycycgb3duIG5hbWVzIGFuZCB0aGUgY2FsbHMgcmVhZCBleGFjdGx5IGFzIHRoZSB1bmJvdW5kIG9uZXMgZG86XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHsgY3JlYXRlQXJndW1lbnRzU2NoZW1hLCBjcmVhdGVUeXBlR3VhcmRTY2hlbWEgfSA9IGNyZWF0ZUFwaUNvbnRyYWN0U2NoZW1hQnVpbGRlcnMoJ215LXBsdWdpbicpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZlbmRvciAtIFRoZSB2ZW5kb3IgZXZlcnkgc2NoZW1hIHJlcG9ydHMuXG4gKiBAcmV0dXJucyBUaGUgYm91bmQgYnVpbGRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVBcGlDb250cmFjdFNjaGVtYUJ1aWxkZXJzKHZlbmRvcjogc3RyaW5nKTogQXBpQ29udHJhY3RTY2hlbWFCdWlsZGVycyB7XG4gIHJldHVybiB7XG4gICAgY3JlYXRlQXJndW1lbnRzU2NoZW1hOiA8Y29uc3QgVFBhcmFtZXRlcnMgZXh0ZW5kcyByZWFkb25seSB1bmtub3duW10+KHBhcmFtZXRlcnM6IEFyZ3VtZW50VHlwZUd1YXJkczxUUGFyYW1ldGVycz4pID0+IGNyZWF0ZUFyZ3VtZW50c1NjaGVtYShwYXJhbWV0ZXJzLCB7IHZlbmRvciB9KSxcbiAgICBjcmVhdGVUeXBlR3VhcmRTY2hlbWE6IDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pID0+IGNyZWF0ZVR5cGVHdWFyZFNjaGVtYSh7IC4uLmd1YXJkLCB2ZW5kb3IgfSlcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGlucHV0IHNjaGVtYSBvZiBhIG1ldGhvZCBjb250cmFjdDogYSBzY2hlbWEgb3ZlciB0aGUgbWV0aG9kJ3MgQVJHVU1FTlQgTElTVCwgb25lIHR5cGUgZ3VhcmQgcGVyXG4gKiBwYXJhbWV0ZXIuIEFuIGFyZ3VtZW50IHRoYXQgZmFpbHMgaXRzIGd1YXJkIGlzIHJlcG9ydGVkIHdpdGggaXRzIGluZGV4IGFzIHRoZSBpc3N1ZSBwYXRoLCBhbmQgYW4gYXJndW1lbnQgbGlzdFxuICogbG9uZ2VyIHRoYW4gdGhlIHBhcmFtZXRlciBsaXN0IGlzIHJlZnVzZWQuIEEgbWlzc2luZyBhcmd1bWVudCByZWFjaGVzIGl0cyBndWFyZCBhcyBgdW5kZWZpbmVkYCwgc28gYW4gb3B0aW9uYWxcbiAqIHBhcmFtZXRlcidzIGd1YXJkIGFjY2VwdHMgYHVuZGVmaW5lZGAgKHNlZSB7QGxpbmsgb3B0aW9uYWxHdWFyZH0pLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBhcmFtZXRlcnMgLSBUaGUgbWV0aG9kJ3MgcGFyYW1ldGVycywgaW5mZXJyZWQgZnJvbSB0aGUgZ3VhcmRzIG9yIGZyb20gdGhlIGNvbnRyYWN0IGVudHJ5LlxuICogQHBhcmFtIHBhcmFtZXRlcnMgLSBPbmUgZ3VhcmQgcGVyIHBhcmFtZXRlciwgaW4gb3JkZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgc2NoZW1hLlxuICogQHJldHVybnMgVGhlIHNjaGVtYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFyZ3VtZW50c1NjaGVtYTxjb25zdCBUUGFyYW1ldGVycyBleHRlbmRzIHJlYWRvbmx5IHVua25vd25bXT4oXG4gIHBhcmFtZXRlcnM6IEFyZ3VtZW50VHlwZUd1YXJkczxUUGFyYW1ldGVycz4sXG4gIG9wdGlvbnM/OiBDcmVhdGVBcmd1bWVudHNTY2hlbWFPcHRpb25zXG4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIE11dGFibGVUdXBsZTxUUGFyYW1ldGVycz4+IHtcbiAgY29uc3QgcGFyYW1ldGVyTGlzdCA9IGNhc3RUbzxyZWFkb25seSBFeHBlY3RlZFR5cGVHdWFyZDx1bmtub3duPltdPihwYXJhbWV0ZXJzKTtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYSgodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+PiA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHsgaXNzdWVzOiBbeyBtZXNzYWdlOiAnRXhwZWN0ZWQgYW4gYXJndW1lbnQgbGlzdC4nIH1dIH07XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlLmxlbmd0aCA+IHBhcmFtZXRlckxpc3QubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyBpc3N1ZXM6IFt7IG1lc3NhZ2U6IGBFeHBlY3RlZCBhdCBtb3N0ICR7U3RyaW5nKHBhcmFtZXRlckxpc3QubGVuZ3RoKX0gYXJndW1lbnQocyksIGdvdCAke1N0cmluZyh2YWx1ZS5sZW5ndGgpfS5gIH1dIH07XG4gICAgfVxuXG4gICAgY29uc3QgaXNzdWVzID0gcGFyYW1ldGVyTGlzdC5mbGF0TWFwKChwYXJhbWV0ZXIsIGluZGV4KTogU3RhbmRhcmRTY2hlbWFWMS5Jc3N1ZVtdID0+IHBhcmFtZXRlci50eXBlR3VhcmQodmFsdWVbaW5kZXhdKSA/IFtdIDogW3sgbWVzc2FnZTogYEV4cGVjdGVkICR7cGFyYW1ldGVyLmV4cGVjdGVkfS5gLCBwYXRoOiBbaW5kZXhdIH1dKTtcbiAgICByZXR1cm4gaXNzdWVzLmxlbmd0aCA9PT0gMCA/IHsgdmFsdWU6IGNhc3RUbzxNdXRhYmxlVHVwbGU8VFBhcmFtZXRlcnM+Pih2YWx1ZSkgfSA6IHsgaXNzdWVzIH07XG4gIH0sIG9wdGlvbnM/LnZlbmRvcik7XG59XG5cbi8qKlxuICogUGFpcnMgYSB0eXBlIGd1YXJkIHdpdGggd2hhdCBpdCBleHBlY3RzLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIHRoZSBndWFyZCBuYXJyb3dzIHRvLlxuICogQHBhcmFtIGV4cGVjdGVkIC0gV2hhdCB0aGUgdmFsdWUgc2hvdWxkIGhhdmUgYmVlbiwgcGhyYXNlZCB0byBmb2xsb3cgXCJFeHBlY3RlZFwiLCBlLmcuIGAnYSBzdHJpbmcnYC5cbiAqIEBwYXJhbSB0eXBlR3VhcmQgLSBUaGUgZ3VhcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZDxUPihleHBlY3RlZDogc3RyaW5nLCB0eXBlR3VhcmQ6IFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgcmV0dXJuIHsgZXhwZWN0ZWQsIHR5cGVHdWFyZCB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHNjaGVtYSBvdmVyIG9uZSB2YWx1ZSBmcm9tIGEgdHlwZSBndWFyZDogdGhlIG91dHB1dCBzY2hlbWEgb2YgYSBtZXRob2QgY29udHJhY3QsIHR5cGljYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSB0aGUgZ3VhcmQgbmFycm93cyB0by5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZ3VhcmQsIHdoYXQgaXQgZXhwZWN0cywgYW5kIG9wdGlvbmFsbHkgdGhlIHNjaGVtYSdzIHZlbmRvci5cbiAqIEByZXR1cm5zIFRoZSBzY2hlbWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlR3VhcmRTY2hlbWE8VD4ocGFyYW1zOiBDcmVhdGVUeXBlR3VhcmRTY2hlbWFQYXJhbXM8VD4pOiBTdGFuZGFyZFNjaGVtYVYxPHVua25vd24sIFQ+IHtcbiAgcmV0dXJuIGNyZWF0ZVNjaGVtYShcbiAgICAodmFsdWU6IHVua25vd24pOiBTdGFuZGFyZFNjaGVtYVYxLlJlc3VsdDxUPiA9PiBwYXJhbXMudHlwZUd1YXJkKHZhbHVlKSA/IHsgdmFsdWUgfSA6IHsgaXNzdWVzOiBbeyBtZXNzYWdlOiBgRXhwZWN0ZWQgJHtwYXJhbXMuZXhwZWN0ZWR9LmAgfV0gfSxcbiAgICBwYXJhbXMudmVuZG9yXG4gICk7XG59XG5cbi8qKlxuICogU3RhdGVzIGEgY29udHJhY3QgYWdhaW5zdCBhbiBBUEkgdHlwZSwgc28gZXZlcnkgZW50cnkgaXMgY2hlY2tlZCBhZ2FpbnN0IGl0cyBtZXRob2QgYW5kIHRoZSBzY2hlbWEgYnVpbGRlcnNcbiAqIGluc2lkZSBpdCBpbmZlciB0aGVpciB0eXBlcyBmcm9tIHRoZSBtZXRob2QgcmF0aGVyIHRoYW4gZnJvbSBhIHJlc3RhdGVkIHR1cGxlLiBJdCByZXR1cm5zIHRoZSBjb250cmFjdCBhcyBpcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRBcGkgLSBUaGUgQVBJIHRoZSBjb250cmFjdCBkZXNjcmliZXMuXG4gKiBAcGFyYW0gY29udHJhY3QgLSBUaGUgY29udHJhY3QuXG4gKiBAcmV0dXJucyBUaGUgc2FtZSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUFwaUNvbnRyYWN0PFRBcGkgZXh0ZW5kcyBvYmplY3Q+KGNvbnRyYWN0OiBUeXBlZEFwaUNvbnRyYWN0PE5vSW5mZXI8VEFwaT4+KTogVHlwZWRBcGlDb250cmFjdDxUQXBpPiB7XG4gIHJldHVybiBjb250cmFjdDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcywgb3Igb2YgYSBjbGFzcyBkZXJpdmVkIGZyb20gaXQsIGV4cGVjdGluZyBgYW4gaW5zdGFuY2Ugb2ZgIHRoZVxuICogY2xhc3MncyBuYW1lLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGFuIGluc3RhbmNlLlxuICogQHBhcmFtIGNvbnN0cnVjdG9yIC0gVGhlIGNsYXNzLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdGFuY2VPZkd1YXJkPFQ+KGNvbnN0cnVjdG9yOiBhYnN0cmFjdCBuZXcgKC4uLmFyZ3VtZW50c186IG5ldmVyW10pID0+IFQpOiBFeHBlY3RlZFR5cGVHdWFyZDxUPiB7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChgYW4gaW5zdGFuY2Ugb2YgJHtjb25zdHJ1Y3Rvci5uYW1lfWAsIGluc3RhbmNlT2ZUeXBlR3VhcmQoY29uc3RydWN0b3IpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUga2V5cyBvZiBhIHJlY29yZCwgZXhwZWN0aW5nIGBvbmUgb2ZgIHRoZW0uIFR5cGluZyB0aGUgcmVjb3JkIG92ZXIgYSB1bmlvblxuICogbWFrZXMgYSBtZW1iZXIgbGF0ZXIgYWRkZWQgdG8gdGhlIHVuaW9uIGZhaWwgdG8gY29tcGlsZSB1bnRpbCBpdCBpcyBsaXN0ZWQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGFjY2VwdGVkIHN0cmluZ3MuXG4gKiBAcGFyYW0gbGl0ZXJhbHMgLSBBIHJlY29yZCB3aG9zZSBrZXlzIGFyZSB0aGUgYWNjZXB0ZWQgc3RyaW5ncy5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpdGVyYWxHdWFyZDxUIGV4dGVuZHMgc3RyaW5nPihsaXRlcmFsczogUmVhZG9ubHk8UmVjb3JkPFQsIHRydWU+Pik6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+O1xuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgZXhhY3RseSB0aGUgbGlzdGVkIHZhbHVlcywgZXhwZWN0aW5nIGBvbmUgb2ZgIHRoZW0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIGFjY2VwdGVkIHZhbHVlcy5cbiAqIEBwYXJhbSBsaXRlcmFscyAtIFRoZSBhY2NlcHRlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXRlcmFsR3VhcmQ8VCBleHRlbmRzIExpdGVyYWw+KGxpdGVyYWxzOiByZWFkb25seSBUW10pOiBFeHBlY3RlZFR5cGVHdWFyZDxUPjtcbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGV4YWN0bHkgdGhlIGxpc3RlZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIGxpdGVyYWxzIC0gVGhlIGFjY2VwdGVkIHZhbHVlcywgYXMgYSBsaXN0IG9yIGFzIHRoZSBrZXlzIG9mIGEgcmVjb3JkLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGl0ZXJhbEd1YXJkKGxpdGVyYWxzOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB0cnVlPj4gfCByZWFkb25seSBMaXRlcmFsW10pOiBFeHBlY3RlZFR5cGVHdWFyZDxMaXRlcmFsPiB7XG4gIGNvbnN0IGxpdGVyYWxMaXN0OiByZWFkb25seSBMaXRlcmFsW10gPSBpc1JlYWRvbmx5QXJyYXkobGl0ZXJhbHMpID8gbGl0ZXJhbHMgOiBPYmplY3Qua2V5cyhsaXRlcmFscyk7XG4gIHJldHVybiBjcmVhdGVFeHBlY3RlZFR5cGVHdWFyZChgb25lIG9mICR7bGl0ZXJhbExpc3QubWFwKChsaXRlcmFsKSA9PiBmb3JtYXRMaXRlcmFsKGxpdGVyYWwpKS5qb2luKCcsICcpfWAsIGxpdGVyYWxUeXBlR3VhcmQobGl0ZXJhbExpc3QpKTtcbn1cblxuLyoqXG4gKiBXaWRlbnMgYSBndWFyZCB0byBhbHNvIGFjY2VwdCBgbnVsbGAuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVHdWFyZDxUPihndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4pOiBFeHBlY3RlZFR5cGVHdWFyZDxudWxsIHwgVD4ge1xuICByZXR1cm4ge1xuICAgIGV4cGVjdGVkOiBgJHtndWFyZC5leHBlY3RlZH0gb3IgbnVsbGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgVCA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBndWFyZC50eXBlR3VhcmQodmFsdWUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgZ3VhcmQgYWNjZXB0aW5nIGFuIG9iamVjdCB3aG9zZSBldmVyeSBsaXN0ZWQgcHJvcGVydHkgaXRzIGd1YXJkIGFjY2VwdHMsIGFzIHtAbGluayBvYmplY3RUeXBlR3VhcmR9IGRvZXMsXG4gKiBleHBlY3RpbmcgdGhlIHByb3BlcnRpZXMgYW5kIHdoYXQgZWFjaCBleHBlY3RzOiBgeyBhbGlhcz86IGEgc3RyaW5nOyBwYXRoOiBhIHN0cmluZyB9YCwgYWZ0ZXIgdGhlXG4gKiB7QGxpbmsgT2JqZWN0R3VhcmRPcHRpb25zLmRlc2NyaXB0aW9ufSB3aGVuIG9uZSBpcyBnaXZlbi4gQSBrZXkgaXMgbWFya2VkIG9wdGlvbmFsIHdoZW4gaXQgaXMgbGlzdGVkIGluXG4gKiB7QGxpbmsgT2JqZWN0VHlwZUd1YXJkT3B0aW9ucy5leGFjdE9wdGlvbmFsS2V5c307IHdpdGhvdXQgdGhhdCBsaXN0LCBhbiBvcHRpb25hbCBwcm9wZXJ0eSdzIGd1YXJkIHNheXNcbiAqIGBvciB1bmRlZmluZWRgIGl0c2VsZi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb2JqZWN0IHR5cGUuXG4gKiBAcGFyYW0gcHJvcGVydHlHdWFyZHMgLSBPbmUgZ3VhcmQgcGVyIHByb3BlcnR5IG9mIGBUYC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSBndWFyZC5cbiAqIEByZXR1cm5zIFRoZSBndWFyZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9iamVjdEd1YXJkPFQgZXh0ZW5kcyBvYmplY3Q+KHByb3BlcnR5R3VhcmRzOiBQcm9wZXJ0eUd1YXJkczxUPiwgb3B0aW9ucz86IE9iamVjdEd1YXJkT3B0aW9uczxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQ+IHtcbiAgY29uc3QgZ3VhcmRzID0gY2FzdFRvPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIEV4cGVjdGVkVHlwZUd1YXJkPHVua25vd24+Pj4+KHByb3BlcnR5R3VhcmRzKTtcbiAgY29uc3QgZXhhY3RPcHRpb25hbEtleXM6IG9iamVjdCA9IG9wdGlvbnM/LmV4YWN0T3B0aW9uYWxLZXlzID8/IHt9O1xuICByZXR1cm4gY3JlYXRlRXhwZWN0ZWRUeXBlR3VhcmQoXG4gICAgZGVzY3JpYmVPYmplY3Qob3B0aW9ucz8uZGVzY3JpcHRpb24sIGd1YXJkcywgKGtleSkgPT4gT2JqZWN0Lmhhc093bihleGFjdE9wdGlvbmFsS2V5cywga2V5KSksXG4gICAgb2JqZWN0VHlwZUd1YXJkPFQ+KGNhc3RUbzxQcm9wZXJ0eVR5cGVHdWFyZHM8VD4+KG1hcEd1YXJkcyhndWFyZHMsIChndWFyZCkgPT4gZ3VhcmQudHlwZUd1YXJkKSksIG9wdGlvbnMpXG4gICk7XG59XG5cbi8qKlxuICogV2lkZW5zIGEgZ3VhcmQgdG8gYWxzbyBhY2NlcHQgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHdoYXQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHJlY2VpdmVzIHdoZW4gaXQgaXMgbGVmdCBvdXQuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgdGhlIGd1YXJkIG5hcnJvd3MgdG8uXG4gKiBAcGFyYW0gZ3VhcmQgLSBUaGUgZ3VhcmQgdG8gd2lkZW4uXG4gKiBAcmV0dXJucyBBIGd1YXJkIGFjY2VwdGluZyB3aGF0IGBndWFyZGAgYWNjZXB0cywgb3IgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbEd1YXJkPFQ+KGd1YXJkOiBFeHBlY3RlZFR5cGVHdWFyZDxUPik6IEV4cGVjdGVkVHlwZUd1YXJkPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHtcbiAgICBleHBlY3RlZDogYCR7Z3VhcmQuZXhwZWN0ZWR9IG9yIHVuZGVmaW5lZGAsXG4gICAgdHlwZUd1YXJkOiAodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUIHwgdW5kZWZpbmVkID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgZ3VhcmQudHlwZUd1YXJkKHZhbHVlKVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGd1YXJkIGFjY2VwdGluZyBhbiBvcHRpb25zIGJhZzogYW4gb2JqZWN0IHdob3NlIGV2ZXJ5IG9wdGlvbiBtYXkgYmUgYWJzZW50LCBvciBgdW5kZWZpbmVkYCwgYW5kIG11c3RcbiAqIG90aGVyd2lzZSBwYXNzIGl0cyBndWFyZC4gQSBrZXkgbm8gZ3VhcmQgbmFtZXMgaXMgbGV0IHRocm91Z2ggdW5sZXNzXG4gKiB7QGxpbmsgT3B0aW9uc0d1YXJkT3B0aW9ucy5zaG91bGRSZWplY3RVbmtub3duS2V5c30gaXMgc2V0LiBJdCBleHBlY3RzIHRoZSBvcHRpb25zIGFuZCB3aGF0IGVhY2ggZXhwZWN0czpcbiAqIGB7IHByZWZpeD86IGEgc3RyaW5nOyBpc0hpZGRlbj86IGEgYm9vbGVhbiB9YCwgYWZ0ZXIgdGhlIHtAbGluayBPcHRpb25zR3VhcmRPcHRpb25zLmRlc2NyaXB0aW9ufSB3aGVuIG9uZSBpcyBnaXZlbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgb3B0aW9ucyB0eXBlLCBldmVyeSBwcm9wZXJ0eSBvZiB3aGljaCBpcyBvcHRpb25hbC5cbiAqIEBwYXJhbSBvcHRpb25HdWFyZHMgLSBPbmUgZ3VhcmQgcGVyIG9wdGlvbiBvZiBgVGAsIGZvciBhIHByZXNlbnQgdmFsdWUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgZ3VhcmQuXG4gKiBAcmV0dXJucyBUaGUgZ3VhcmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25zR3VhcmQ8VCBleHRlbmRzIG9iamVjdD4ob3B0aW9uR3VhcmRzOiBPcHRpb25HdWFyZHM8VD4sIG9wdGlvbnM/OiBPcHRpb25zR3VhcmRPcHRpb25zKTogRXhwZWN0ZWRUeXBlR3VhcmQ8VD4ge1xuICBjb25zdCBndWFyZHMgPSBjYXN0VG88UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4+Pj4ob3B0aW9uR3VhcmRzKTtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKFxuICAgIGRlc2NyaWJlT2JqZWN0KG9wdGlvbnM/LmRlc2NyaXB0aW9uLCBndWFyZHMsICgpID0+IHRydWUpLFxuICAgIG9iamVjdFR5cGVHdWFyZDxUPihjYXN0VG88UHJvcGVydHlUeXBlR3VhcmRzPFQ+PihtYXBHdWFyZHMoZ3VhcmRzLCAoZ3VhcmQpID0+IG9wdGlvbmFsVHlwZUd1YXJkKGd1YXJkLnR5cGVHdWFyZCkpKSwge1xuICAgICAgc2hvdWxkUmVqZWN0VW5rbm93bktleXM6IG9wdGlvbnM/LnNob3VsZFJlamVjdFVua25vd25LZXlzID8/IGZhbHNlXG4gICAgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBndWFyZCBhY2NlcHRpbmcgd2hhdCBhbnkgb2YgdGhlIGdpdmVuIGd1YXJkcyBhY2NlcHRzLCBleHBlY3RpbmcgdGhlaXIgYGV4cGVjdGVkYCB0ZXh0cyBqb2luZWQgYnkgYG9yYC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRHdWFyZHMgLSBUaGUgZ3VhcmRzLlxuICogQHBhcmFtIGd1YXJkcyAtIFRoZSBndWFyZHMsIHRyaWVkIGluIG9yZGVyLlxuICogQHJldHVybnMgVGhlIGd1YXJkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25HdWFyZDxjb25zdCBUR3VhcmRzIGV4dGVuZHMgcmVhZG9ubHkgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj5bXT4oXG4gIC4uLmd1YXJkczogVEd1YXJkc1xuKTogRXhwZWN0ZWRUeXBlR3VhcmQ8R3VhcmRlZFR5cGU8VEd1YXJkc1tudW1iZXJdWyd0eXBlR3VhcmQnXT4+IHtcbiAgcmV0dXJuIGNyZWF0ZUV4cGVjdGVkVHlwZUd1YXJkKFxuICAgIGd1YXJkcy5tYXAoKGd1YXJkKSA9PiBndWFyZC5leHBlY3RlZCkuam9pbignIG9yICcpLFxuICAgIHVuaW9uVHlwZUd1YXJkKC4uLmd1YXJkcy5tYXAoKGd1YXJkKSA9PiBndWFyZC50eXBlR3VhcmQpKVxuICApO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTY2hlbWE8VD4odmFsaWRhdGU6ICh2YWx1ZTogdW5rbm93bikgPT4gU3RhbmRhcmRTY2hlbWFWMS5SZXN1bHQ8VD4sIHZlbmRvcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogU3RhbmRhcmRTY2hlbWFWMTx1bmtub3duLCBUPiB7XG4gIHJldHVybiB7XG4gICAgJ35zdGFuZGFyZCc6IHtcbiAgICAgIHZhbGlkYXRlLFxuICAgICAgdmVuZG9yOiB2ZW5kb3IgPz8gTElCUkFSWV9OQU1FLFxuICAgICAgdmVyc2lvbjogMVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVPYmplY3QoXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGd1YXJkczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4+PixcbiAgaXNPcHRpb25hbDogKGtleTogc3RyaW5nKSA9PiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZ3VhcmRzKTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGVudHJpZXMubGVuZ3RoID09PSAwXG4gICAgPyAne30nXG4gICAgOiBgeyAke2VudHJpZXMubWFwKChba2V5LCBndWFyZF0pID0+IGAke2tleX0ke2lzT3B0aW9uYWwoa2V5KSA/ICc/JyA6ICcnfTogJHtndWFyZC5leHBlY3RlZH1gKS5qb2luKCc7ICcpfSB9YDtcbiAgcmV0dXJuIGRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0aWVzIDogYCR7ZGVzY3JpcHRpb259OiAke3Byb3BlcnRpZXN9YDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbChsaXRlcmFsOiBMaXRlcmFsKTogc3RyaW5nIHtcbiAgaWYgKGlzU3RyaW5nKGxpdGVyYWwpKSB7XG4gICAgcmV0dXJuIGAnJHtsaXRlcmFsfSdgO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVvZiBsaXRlcmFsID09PSAnYmlnaW50JyA/IGAke1N0cmluZyhsaXRlcmFsKX1uYCA6IFN0cmluZyhsaXRlcmFsKTtcbn1cblxuZnVuY3Rpb24gaXNSZWFkb25seUFycmF5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgcmVhZG9ubHkgdW5rbm93bltdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBtYXBHdWFyZHMoXG4gIGd1YXJkczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4+PixcbiAgdG9UeXBlR3VhcmQ6IChndWFyZDogRXhwZWN0ZWRUeXBlR3VhcmQ8dW5rbm93bj4pID0+IFR5cGVHdWFyZDx1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgVHlwZUd1YXJkPHVua25vd24+PiB7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZ3VhcmRzKS5tYXAoKFtrZXksIGd1YXJkXSkgPT4gW2tleSwgdG9UeXBlR3VhcmQoZ3VhcmQpXSkpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXlCQSxxQkFBNkI7QUFDN0IsMEJBQXVCO0FBQ3ZCLHlCQVlPO0FBbU1BLE1BQU0sZ0JBQTRDLEVBQUUsVUFBVSxhQUFhLFdBQVcsNkJBQVU7QUFLaEcsTUFBTSxlQUEwQyxFQUFFLFVBQVUsWUFBWSxXQUFXLDRCQUFTO0FBSzVGLE1BQU0sZUFBMEMsRUFBRSxVQUFVLFlBQVksV0FBVyw0QkFBUztBQUs1RixNQUFNLHFCQUFrRCxFQUFFLFVBQVUsdUJBQXVCLFdBQVcsaUNBQWM7QUFLcEgsTUFBTSxrQkFBZ0QsRUFBRSxVQUFVLGFBQWEsV0FBVywrQkFBWTtBQVN0RyxTQUFTLFdBQWMs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
@@ -14,7 +14,7 @@
14
14
  * Running the schemas is left to whoever owns the call path, since that is where an issue can be reported.
15
15
  */
16
16
  import type { StandardSchemaV1 } from '@standard-schema/spec' with { 'resolution-mode': 'import' };
17
- import type { GuardedType, Literal, TypeGuard } from './type-guards.cjs';
17
+ import type { GuardedType, Literal, ObjectTypeGuardOptions, TypeGuard } from './type-guards.cjs';
18
18
  /**
19
19
  * The contract an API declares: every key is a method the API promises to expose, and its value optionally
20
20
  * carries the payload schemas for that method.
@@ -126,6 +126,52 @@ export interface ExpectedTypeGuard<T> {
126
126
  */
127
127
  readonly typeGuard: (value: unknown) => value is T;
128
128
  }
129
+ /**
130
+ * Options for {@link objectGuard}.
131
+ *
132
+ * @typeParam T - The object type the guard narrows to.
133
+ */
134
+ export interface ObjectGuardOptions<T extends object> extends ObjectTypeGuardOptions<T> {
135
+ /**
136
+ * What the object is, put before its properties in `expected`, e.g. `'the options of the link'`.
137
+ */
138
+ readonly description?: string;
139
+ }
140
+ /**
141
+ * One guard per option of an all-optional object type, as {@link optionsGuard} takes them: each describes a
142
+ * PRESENT option, so it does not accept `undefined`. A required property of `T` takes `never`, so a type that is
143
+ * not all-optional does not compile.
144
+ *
145
+ * @typeParam T - The object type.
146
+ */
147
+ export type OptionGuards<T extends object> = {
148
+ readonly [TKey in keyof T]-?: Partial<Pick<T, TKey>> extends Pick<T, TKey> ? ExpectedTypeGuard<Exclude<T[TKey], undefined>> : never;
149
+ };
150
+ /**
151
+ * Options for {@link optionsGuard}.
152
+ */
153
+ export interface OptionsGuardOptions {
154
+ /**
155
+ * What the options are, put before them in `expected`, e.g. `'select options'`.
156
+ */
157
+ readonly description?: string;
158
+ /**
159
+ * Whether a value carrying an own enumerable string key that no option guard names is refused. Letting it through,
160
+ * the default, lets a consumer compiled against a later version of the options pass one this version does not know.
161
+ *
162
+ * @default `false`
163
+ */
164
+ readonly shouldRejectUnknownKeys?: boolean;
165
+ }
166
+ /**
167
+ * One guard per property of an object type, as {@link objectGuard} takes them, typed as {@link PropertyTypeGuards}
168
+ * types the bare guards.
169
+ *
170
+ * @typeParam T - The object type.
171
+ */
172
+ export type PropertyGuards<T extends object> = {
173
+ readonly [TKey in keyof T]-?: ExpectedTypeGuard<Partial<Pick<T, TKey>> extends Pick<T, TKey> ? T[TKey] | undefined : T[TKey]>;
174
+ };
129
175
  /**
130
176
  * The {@link ApiContract} of a named API: one entry per function member, each typed against that member. Both
131
177
  * schemas are REQUIRED here, so a typed contract is a full description of every signature and a `{}` entry does
@@ -251,6 +297,19 @@ export declare function literalGuard<T extends Literal>(literals: readonly T[]):
251
297
  * @returns A guard accepting what `guard` accepts, or `null`.
252
298
  */
253
299
  export declare function nullableGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedTypeGuard<null | T>;
300
+ /**
301
+ * Builds a guard accepting an object whose every listed property its guard accepts, as {@link objectTypeGuard} does,
302
+ * expecting the properties and what each expects: `{ alias?: a string; path: a string }`, after the
303
+ * {@link ObjectGuardOptions.description} when one is given. A key is marked optional when it is listed in
304
+ * {@link ObjectTypeGuardOptions.exactOptionalKeys}; without that list, an optional property's guard says
305
+ * `or undefined` itself.
306
+ *
307
+ * @typeParam T - The object type.
308
+ * @param propertyGuards - One guard per property of `T`.
309
+ * @param options - The options for the guard.
310
+ * @returns The guard.
311
+ */
312
+ export declare function objectGuard<T extends object>(propertyGuards: PropertyGuards<T>, options?: ObjectGuardOptions<T>): ExpectedTypeGuard<T>;
254
313
  /**
255
314
  * Widens a guard to also accept `undefined`, which is what an optional parameter receives when it is left out.
256
315
  *
@@ -259,6 +318,18 @@ export declare function nullableGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedT
259
318
  * @returns A guard accepting what `guard` accepts, or `undefined`.
260
319
  */
261
320
  export declare function optionalGuard<T>(guard: ExpectedTypeGuard<T>): ExpectedTypeGuard<T | undefined>;
321
+ /**
322
+ * Builds a guard accepting an options bag: an object whose every option may be absent, or `undefined`, and must
323
+ * otherwise pass its guard. A key no guard names is let through unless
324
+ * {@link OptionsGuardOptions.shouldRejectUnknownKeys} is set. It expects the options and what each expects:
325
+ * `{ prefix?: a string; isHidden?: a boolean }`, after the {@link OptionsGuardOptions.description} when one is given.
326
+ *
327
+ * @typeParam T - The options type, every property of which is optional.
328
+ * @param optionGuards - One guard per option of `T`, for a present value.
329
+ * @param options - The options for the guard.
330
+ * @returns The guard.
331
+ */
332
+ export declare function optionsGuard<T extends object>(optionGuards: OptionGuards<T>, options?: OptionsGuardOptions): ExpectedTypeGuard<T>;
262
333
  /**
263
334
  * Builds a guard accepting what any of the given guards accepts, expecting their `expected` texts joined by `or`.
264
335
  *
@@ -36,6 +36,7 @@ __export(index_exports, {
36
36
  "abort-controller": () => abort_controller,
37
37
  "aggregate-error": () => aggregate_error,
38
38
  "api-contract": () => api_contract,
39
+ "api-contract-verifier": () => api_contract_verifier,
39
40
  array: () => array,
40
41
  "array-buffer": () => array_buffer,
41
42
  async: () => async,
@@ -71,6 +72,7 @@ __export(index_exports, {
71
72
  module.exports = __toCommonJS(index_exports);
72
73
  var abort_controller = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./abort-controller.cjs')), 1);
73
74
  var aggregate_error = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./aggregate-error.cjs')), 1);
75
+ var api_contract_verifier = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./api-contract-verifier.cjs')), 1);
74
76
  var api_contract = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./api-contract.cjs')), 1);
75
77
  var array_buffer = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./array-buffer.cjs')), 1);
76
78
  var array = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./array.cjs')), 1);
@@ -108,6 +110,7 @@ var value_wrapper = __toESM(((module) => module && module.__esModule && 'default
108
110
  "abort-controller": null,
109
111
  "aggregate-error": null,
110
112
  "api-contract": null,
113
+ "api-contract-verifier": null,
111
114
  array,
112
115
  "array-buffer": null,
113
116
  async,
@@ -140,4 +143,4 @@ var value_wrapper = __toESM(((module) => module && module.__esModule && 'default
140
143
  "value-provider": null,
141
144
  "value-wrapper": null
142
145
  });
143
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYWdncmVnYXRlLWVycm9yJyBmcm9tICcuL2FnZ3JlZ2F0ZS1lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0JyBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXktYnVmZmVyJyBmcm9tICcuL2FycmF5LWJ1ZmZlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLW9wZXJhdGlvbi1ob29rJyBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdieXRlcycgZnJvbSAnLi9ieXRlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1Zy1zd2l0Y2hlcycgZnJvbSAnLi9kZWJ1Zy1zd2l0Y2hlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWcnIGZyb20gJy4vZGVidWcudHMnO1xuZXhwb3J0ICogYXMgJ2Rlc2t0b3AtemlwLWV4dHJhY3RvcicgZnJvbSAnLi9kZXNrdG9wLXppcC1leHRyYWN0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUnIGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5leHBvcnQgKiBhcyAnZW51bScgZnJvbSAnLi9lbnVtLnRzJztcbmV4cG9ydCAqIGFzICdlcnJvcicgZnJvbSAnLi9lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnZnVuY3Rpb24nIGZyb20gJy4vZnVuY3Rpb24udHMnO1xuZXhwb3J0ICogYXMgJ2h0bWwtZWxlbWVudCcgZnJvbSAnLi9odG1sLWVsZW1lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2pwZWctbWV0YWRhdGEnIGZyb20gJy4vanBlZy1tZXRhZGF0YS50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeScgZnJvbSAnLi9saWJyYXJ5LnRzJztcbmV4cG9ydCAqIGFzICdvYmplY3QtdXRpbHMnIGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdwYXRoJyBmcm9tICcuL3BhdGgudHMnO1xuZXhwb3J0ICogYXMgJ3JlZy1leHAnIGZyb20gJy4vcmVnLWV4cC50cyc7XG5leHBvcnQgKiBhcyAnc3RyaW5nJyBmcm9tICcuL3N0cmluZy50cyc7XG5leHBvcnQgKiBhcyAndHJhbnNmb3JtZXJzJyBmcm9tICcuL3RyYW5zZm9ybWVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndHdvLXdheS1tYXAnIGZyb20gJy4vdHdvLXdheS1tYXAudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUtZ3VhcmRzJyBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmV4cG9ydCAqIGFzICd0eXBlJyBmcm9tICcuL3R5cGUudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGVzY3JpcHQtbGliLXN0YXRlJyBmcm9tICcuL3R5cGVzY3JpcHQtbGliLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICd1cmwnIGZyb20gJy4vdXJsLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS1wcm92aWRlcicgZnJvbSAnLi92YWx1ZS1wcm92aWRlci50cyc7XG5leHBvcnQgKiBhcyAndmFsdWUtd3JhcHBlcicgZnJvbSAnLi92YWx1ZS13cmFwcGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSw0QkFBQUE7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQTtBQUFBLHdCQUFBQztBQUFBLEVBQUE7QUFBQSx3QkFBQUM7QUFBQSxFQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSw0QkFBQUM7QUFBQSxFQUFBLHdCQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQTtBQUFBLGNBQUFDO0FBQUEsRUFBQTtBQUFBLGtCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSx1QkFBQUM7QUFBQSxFQUFBO0FBQUEsd0JBQUFDO0FBQUEsRUFBQTtBQUFBLG1CQUFBQztBQUFBLEVBQUE7QUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUE7QUFBQSx1QkFBQUM7QUFBQSxFQUFBLDhCQUFBQztBQUFBLEVBQUE7QUFBQSwwQkFBQUM7QUFBQSxFQUFBLHVCQUFBQztBQUFBO0FBQUE7QUFFQSxJQUFBbkIsbUJBQW9DO0FBQ3BDLElBQUFDLGtCQUFtQztBQUNuQyxJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyxlQUFnQztBQUNoQyxZQUF5QjtBQUN6QixJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyx1QkFBd0M7QUFDeEMsWUFBeUI7QUFDekIsYUFBMEI7QUFDMUIsV0FBd0I7QUFDeEIsWUFBeUI7QUFDekIsSUFBQUMsbUJBQW9DO0FBQ3BDLElBQUFDLGlCQUFrQztBQUNsQyxZQUF5QjtBQUN6QixJQUFBQyx3QkFBeUM7QUFDekMsaUJBQThCO0FBQzlCLElBQUFDLFFBQXdCO0FBQ3hCLFlBQXlCO0FBQ3pCLElBQUFDLFlBQTRCO0FBQzVCLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFDLGdCQUFpQztBQUNqQyxjQUEyQjtBQUMzQixJQUFBQyxlQUFnQztBQUNoQyxXQUF3QjtBQUN4QixJQUFBQyxVQUEyQjtBQUMzQixhQUEwQjtBQUMxQixtQkFBZ0M7QUFDaEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsY0FBK0I7QUFDL0IsV0FBd0I7QUFDeEIsSUFBQUMsdUJBQXdDO0FBQ3hDLFVBQXVCO0FBQ3ZCLElBQUFDLGlCQUFrQztBQUNsQyxJQUFBQyxnQkFBaUM7IiwKICAibmFtZXMiOiBbImFib3J0LWNvbnRyb2xsZXIiLCAiYWdncmVnYXRlLWVycm9yIiwgImFwaS1jb250cmFjdCIsICJhcnJheS1idWZmZXIiLCAiYXN5bmMtZXZlbnRzIiwgImFzeW5jLW9wZXJhdGlvbi1ob29rIiwgImRlYnVnLWNvbnRyb2xsZXIiLCAiZGVidWctc3dpdGNoZXMiLCAiZGVza3RvcC16aXAtZXh0cmFjdG9yIiwgImVudW0iLCAiZnVuY3Rpb24iLCAiaHRtbC1lbGVtZW50IiwgImpwZWctbWV0YWRhdGEiLCAib2JqZWN0LXV0aWxzIiwgInJlZy1leHAiLCAidHdvLXdheS1tYXAiLCAidHlwZS1ndWFyZHMiLCAidHlwZXNjcmlwdC1saWItc3RhdGUiLCAidmFsdWUtcHJvdmlkZXIiLCAidmFsdWUtd3JhcHBlciJdCn0K
146
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgJ2Fib3J0LWNvbnRyb2xsZXInIGZyb20gJy4vYWJvcnQtY29udHJvbGxlci50cyc7XG5leHBvcnQgKiBhcyAnYWdncmVnYXRlLWVycm9yJyBmcm9tICcuL2FnZ3JlZ2F0ZS1lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0LXZlcmlmaWVyJyBmcm9tICcuL2FwaS1jb250cmFjdC12ZXJpZmllci50cyc7XG5leHBvcnQgKiBhcyAnYXBpLWNvbnRyYWN0JyBmcm9tICcuL2FwaS1jb250cmFjdC50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXktYnVmZmVyJyBmcm9tICcuL2FycmF5LWJ1ZmZlci50cyc7XG5leHBvcnQgKiBhcyAnYXJyYXknIGZyb20gJy4vYXJyYXkudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLWV2ZW50cycgZnJvbSAnLi9hc3luYy1ldmVudHMudHMnO1xuZXhwb3J0ICogYXMgJ2FzeW5jLW9wZXJhdGlvbi1ob29rJyBmcm9tICcuL2FzeW5jLW9wZXJhdGlvbi1ob29rLnRzJztcbmV4cG9ydCAqIGFzICdhc3luYycgZnJvbSAnLi9hc3luYy50cyc7XG5leHBvcnQgKiBhcyAnYmVlcGVyJyBmcm9tICcuL2JlZXBlci50cyc7XG5leHBvcnQgKiBhcyAnYmxvYicgZnJvbSAnLi9ibG9iLnRzJztcbmV4cG9ydCAqIGFzICdieXRlcycgZnJvbSAnLi9ieXRlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWctY29udHJvbGxlcicgZnJvbSAnLi9kZWJ1Zy1jb250cm9sbGVyLnRzJztcbmV4cG9ydCAqIGFzICdkZWJ1Zy1zd2l0Y2hlcycgZnJvbSAnLi9kZWJ1Zy1zd2l0Y2hlcy50cyc7XG5leHBvcnQgKiBhcyAnZGVidWcnIGZyb20gJy4vZGVidWcudHMnO1xuZXhwb3J0ICogYXMgJ2Rlc2t0b3AtemlwLWV4dHJhY3RvcicgZnJvbSAnLi9kZXNrdG9wLXppcC1leHRyYWN0b3IudHMnO1xuZXhwb3J0ICogYXMgJ2Rpc3Bvc2FibGUnIGZyb20gJy4vZGlzcG9zYWJsZS50cyc7XG5leHBvcnQgKiBhcyAnZW51bScgZnJvbSAnLi9lbnVtLnRzJztcbmV4cG9ydCAqIGFzICdlcnJvcicgZnJvbSAnLi9lcnJvci50cyc7XG5leHBvcnQgKiBhcyAnZnVuY3Rpb24nIGZyb20gJy4vZnVuY3Rpb24udHMnO1xuZXhwb3J0ICogYXMgJ2h0bWwtZWxlbWVudCcgZnJvbSAnLi9odG1sLWVsZW1lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2pwZWctbWV0YWRhdGEnIGZyb20gJy4vanBlZy1tZXRhZGF0YS50cyc7XG5leHBvcnQgKiBhcyAnbGlicmFyeScgZnJvbSAnLi9saWJyYXJ5LnRzJztcbmV4cG9ydCAqIGFzICdvYmplY3QtdXRpbHMnIGZyb20gJy4vb2JqZWN0LXV0aWxzLnRzJztcbmV4cG9ydCAqIGFzICdwYXRoJyBmcm9tICcuL3BhdGgudHMnO1xuZXhwb3J0ICogYXMgJ3JlZy1leHAnIGZyb20gJy4vcmVnLWV4cC50cyc7XG5leHBvcnQgKiBhcyAnc3RyaW5nJyBmcm9tICcuL3N0cmluZy50cyc7XG5leHBvcnQgKiBhcyAndHJhbnNmb3JtZXJzJyBmcm9tICcuL3RyYW5zZm9ybWVycy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyAndHdvLXdheS1tYXAnIGZyb20gJy4vdHdvLXdheS1tYXAudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGUtZ3VhcmRzJyBmcm9tICcuL3R5cGUtZ3VhcmRzLnRzJztcbmV4cG9ydCAqIGFzICd0eXBlJyBmcm9tICcuL3R5cGUudHMnO1xuZXhwb3J0ICogYXMgJ3R5cGVzY3JpcHQtbGliLXN0YXRlJyBmcm9tICcuL3R5cGVzY3JpcHQtbGliLXN0YXRlLnRzJztcbmV4cG9ydCAqIGFzICd1cmwnIGZyb20gJy4vdXJsLnRzJztcbmV4cG9ydCAqIGFzICd2YWx1ZS1wcm92aWRlcicgZnJvbSAnLi92YWx1ZS1wcm92aWRlci50cyc7XG5leHBvcnQgKiBhcyAndmFsdWUtd3JhcHBlcicgZnJvbSAnLi92YWx1ZS13cmFwcGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSw0QkFBQUE7QUFBQSxFQUFBLHlCQUFBQztBQUFBLEVBQUEsc0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUEsd0JBQUFDO0FBQUEsRUFBQTtBQUFBLHdCQUFBQztBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLDRCQUFBQztBQUFBLEVBQUEsd0JBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBO0FBQUEsY0FBQUM7QUFBQSxFQUFBO0FBQUEsa0JBQUFDO0FBQUEsRUFBQSxzQkFBQUM7QUFBQSxFQUFBLHVCQUFBQztBQUFBLEVBQUE7QUFBQSx3QkFBQUM7QUFBQSxFQUFBO0FBQUEsbUJBQUFDO0FBQUEsRUFBQTtBQUFBO0FBQUEsdUJBQUFDO0FBQUEsRUFBQTtBQUFBLHVCQUFBQztBQUFBLEVBQUEsOEJBQUFDO0FBQUEsRUFBQTtBQUFBLDBCQUFBQztBQUFBLEVBQUEsdUJBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUFwQixtQkFBb0M7QUFDcEMsSUFBQUMsa0JBQW1DO0FBQ25DLElBQUFFLHdCQUF5QztBQUN6QyxJQUFBRCxlQUFnQztBQUNoQyxJQUFBRSxlQUFnQztBQUNoQyxZQUF5QjtBQUN6QixJQUFBQyxlQUFnQztBQUNoQyxJQUFBQyx1QkFBd0M7QUFDeEMsWUFBeUI7QUFDekIsYUFBMEI7QUFDMUIsV0FBd0I7QUFDeEIsWUFBeUI7QUFDekIsSUFBQUMsbUJBQW9DO0FBQ3BDLElBQUFDLGlCQUFrQztBQUNsQyxZQUF5QjtBQUN6QixJQUFBQyx3QkFBeUM7QUFDekMsaUJBQThCO0FBQzlCLElBQUFDLFFBQXdCO0FBQ3hCLFlBQXlCO0FBQ3pCLElBQUFDLFlBQTRCO0FBQzVCLElBQUFDLGVBQWdDO0FBQ2hDLElBQUFDLGdCQUFpQztBQUNqQyxjQUEyQjtBQUMzQixJQUFBQyxlQUFnQztBQUNoQyxXQUF3QjtBQUN4QixJQUFBQyxVQUEyQjtBQUMzQixhQUEwQjtBQUMxQixtQkFBZ0M7QUFDaEMsSUFBQUMsY0FBK0I7QUFDL0IsSUFBQUMsY0FBK0I7QUFDL0IsV0FBd0I7QUFDeEIsSUFBQUMsdUJBQXdDO0FBQ3hDLFVBQXVCO0FBQ3ZCLElBQUFDLGlCQUFrQztBQUNsQyxJQUFBQyxnQkFBaUM7IiwKICAibmFtZXMiOiBbImFib3J0LWNvbnRyb2xsZXIiLCAiYWdncmVnYXRlLWVycm9yIiwgImFwaS1jb250cmFjdCIsICJhcGktY29udHJhY3QtdmVyaWZpZXIiLCAiYXJyYXktYnVmZmVyIiwgImFzeW5jLWV2ZW50cyIsICJhc3luYy1vcGVyYXRpb24taG9vayIsICJkZWJ1Zy1jb250cm9sbGVyIiwgImRlYnVnLXN3aXRjaGVzIiwgImRlc2t0b3AtemlwLWV4dHJhY3RvciIsICJlbnVtIiwgImZ1bmN0aW9uIiwgImh0bWwtZWxlbWVudCIsICJqcGVnLW1ldGFkYXRhIiwgIm9iamVjdC11dGlscyIsICJyZWctZXhwIiwgInR3by13YXktbWFwIiwgInR5cGUtZ3VhcmRzIiwgInR5cGVzY3JpcHQtbGliLXN0YXRlIiwgInZhbHVlLXByb3ZpZGVyIiwgInZhbHVlLXdyYXBwZXIiXQp9Cg==
@@ -1,6 +1,7 @@
1
1
  /// <reference path="./library-references.d.cts" />
2
2
  export * as 'abort-controller' from './abort-controller.cjs';
3
3
  export * as 'aggregate-error' from './aggregate-error.cjs';
4
+ export * as 'api-contract-verifier' from './api-contract-verifier.cjs';
4
5
  export * as 'api-contract' from './api-contract.cjs';
5
6
  export * as 'array-buffer' from './array-buffer.cjs';
6
7
  export * as 'array' from './array.cjs';