@stemy/backend 5.2.1 → 6.0.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/commands/clear-command.d.ts +6 -6
- package/commands/fixtures-command.d.ts +9 -9
- package/commands/index.d.ts +2 -2
- package/common-types.d.ts +325 -326
- package/esm2020/services/assets.mjs +2 -2
- package/esm2022/commands/clear-command.mjs +15 -0
- package/esm2022/commands/fixtures-command.mjs +26 -0
- package/esm2022/commands/index.mjs +7 -0
- package/esm2022/common-types.mjs +26 -0
- package/esm2022/fixtures/index.mjs +5 -0
- package/esm2022/fixtures/ttl.fixture.mjs +23 -0
- package/esm2022/public_api.mjs +378 -0
- package/esm2022/requests/asset-image-params.mjs +60 -0
- package/esm2022/rest-controllers/assets.controller.mjs +177 -0
- package/esm2022/rest-controllers/auth.controller.mjs +57 -0
- package/esm2022/rest-controllers/gallery.controller.mjs +27 -0
- package/esm2022/rest-controllers/progresses.controller.mjs +38 -0
- package/esm2022/rest-controllers/terminal-styles.mjs +67 -0
- package/esm2022/rest-controllers/terminal.controller.mjs +132 -0
- package/esm2022/rest-middlewares/container.middleware.mjs +22 -0
- package/esm2022/rest-middlewares/error-handler.middleware.mjs +79 -0
- package/esm2022/rest-middlewares/language.middleware.mjs +21 -0
- package/esm2022/rest-middlewares/request-ended.middleware.mjs +26 -0
- package/esm2022/rest-middlewares/request-started.middleware.mjs +25 -0
- package/esm2022/services/asset-processor.mjs +90 -0
- package/esm2022/services/asset-resolver.mjs +36 -0
- package/esm2022/services/assets.mjs +154 -0
- package/esm2022/services/backend-provider.mjs +83 -0
- package/esm2022/services/cache-processor.mjs +16 -0
- package/esm2022/services/cache.mjs +70 -0
- package/esm2022/services/configuration.mjs +68 -0
- package/esm2022/services/drivers/asset-grid.driver.mjs +27 -0
- package/esm2022/services/drivers/asset-local.driver.mjs +41 -0
- package/esm2022/services/endpoint-provider.mjs +13 -0
- package/esm2022/services/entities/asset.mjs +61 -0
- package/esm2022/services/entities/base-entity.mjs +32 -0
- package/esm2022/services/entities/lazy-asset.mjs +87 -0
- package/esm2022/services/entities/progress.mjs +182 -0
- package/esm2022/services/entities/temp-asset.mjs +53 -0
- package/esm2022/services/fixtures.mjs +38 -0
- package/esm2022/services/gallery-cache.mjs +29 -0
- package/esm2022/services/gallery-image.mjs +42 -0
- package/esm2022/services/gallery.mjs +124 -0
- package/esm2022/services/id-generator.mjs +49 -0
- package/esm2022/services/job-manager.mjs +198 -0
- package/esm2022/services/lazy-assets.mjs +68 -0
- package/esm2022/services/logger.mjs +26 -0
- package/esm2022/services/mail-sender.mjs +42 -0
- package/esm2022/services/memory-cache.mjs +61 -0
- package/esm2022/services/mongo-connector.mjs +36 -0
- package/esm2022/services/open-api.mjs +124 -0
- package/esm2022/services/progresses.mjs +93 -0
- package/esm2022/services/template-renderer.mjs +71 -0
- package/esm2022/services/terminal-manager.mjs +88 -0
- package/esm2022/services/token-generator.mjs +37 -0
- package/esm2022/services/translation-provider.mjs +39 -0
- package/esm2022/services/translator.mjs +67 -0
- package/esm2022/services/user-manager.mjs +27 -0
- package/esm2022/socket-controllers/progress.controller.mjs +63 -0
- package/esm2022/socket-controllers/terminal.controller.mjs +61 -0
- package/esm2022/socket-controllers/terminal.mjs +89 -0
- package/esm2022/socket-middlewares/compression.middleware.mjs +14 -0
- package/esm2022/static.mjs +23 -0
- package/esm2022/stemy-backend.mjs +5 -0
- package/esm2022/utilities/base-doc.mjs +33 -0
- package/esm2022/utilities/decorators.mjs +51 -0
- package/esm2022/utilities/di-container.mjs +88 -0
- package/esm2022/utilities/empty-job.mjs +13 -0
- package/esm2022/utilities/lazy-asset-generator.mjs +38 -0
- package/esm2022/utilities/mongoose.mjs +216 -0
- package/esm2022/utilities/tree.mjs +119 -0
- package/esm2022/utils.mjs +726 -0
- package/esm2022/validators.mjs +46 -0
- package/fesm2015/stemy-backend.mjs +1 -1
- package/fesm2015/stemy-backend.mjs.map +1 -1
- package/fesm2020/stemy-backend.mjs +1 -1
- package/fesm2020/stemy-backend.mjs.map +1 -1
- package/fesm2022/stemy-backend.mjs +4690 -0
- package/fesm2022/stemy-backend.mjs.map +1 -0
- package/fixtures/index.d.ts +2 -2
- package/fixtures/ttl.fixture.d.ts +7 -7
- package/index.d.ts +5 -5
- package/package.json +43 -49
- package/public_api.d.ts +44 -44
- package/requests/asset-image-params.d.ts +12 -12
- package/rest-controllers/assets.controller.d.ts +25 -27
- package/rest-controllers/auth.controller.d.ts +14 -14
- package/rest-controllers/gallery.controller.d.ts +6 -7
- package/rest-controllers/progresses.controller.d.ts +9 -9
- package/rest-controllers/terminal-styles.d.ts +2 -2
- package/rest-controllers/terminal.controller.d.ts +10 -10
- package/rest-middlewares/container.middleware.d.ts +8 -8
- package/rest-middlewares/error-handler.middleware.d.ts +13 -13
- package/rest-middlewares/language.middleware.d.ts +8 -8
- package/rest-middlewares/request-ended.middleware.d.ts +8 -8
- package/rest-middlewares/request-started.middleware.d.ts +8 -8
- package/services/asset-processor.d.ts +10 -11
- package/services/asset-resolver.d.ts +10 -10
- package/services/assets.d.ts +24 -26
- package/services/backend-provider.d.ts +19 -20
- package/services/cache-processor.d.ts +4 -4
- package/services/cache.d.ts +23 -23
- package/services/configuration.d.ts +15 -15
- package/services/drivers/asset-grid.driver.d.ts +11 -11
- package/services/drivers/asset-local.driver.d.ts +10 -11
- package/services/endpoint-provider.d.ts +4 -4
- package/services/entities/asset.d.ts +19 -21
- package/services/entities/base-entity.d.ts +13 -13
- package/services/entities/lazy-asset.d.ts +25 -25
- package/services/entities/progress.d.ts +49 -49
- package/services/entities/temp-asset.d.ts +20 -22
- package/services/fixtures.d.ts +8 -8
- package/services/gallery-cache.d.ts +8 -9
- package/services/gallery-image.d.ts +10 -11
- package/services/gallery.d.ts +13 -13
- package/services/id-generator.d.ts +11 -11
- package/services/job-manager.d.ts +35 -35
- package/services/lazy-assets.d.ts +22 -22
- package/services/logger.d.ts +8 -8
- package/services/mail-sender.d.ts +20 -20
- package/services/memory-cache.d.ts +10 -10
- package/services/mongo-connector.d.ts +12 -12
- package/services/open-api.d.ts +13 -13
- package/services/progresses.d.ts +20 -20
- package/services/template-renderer.d.ts +14 -14
- package/services/terminal-manager.d.ts +15 -15
- package/services/token-generator.d.ts +6 -6
- package/services/translation-provider.d.ts +9 -9
- package/services/translator.d.ts +15 -15
- package/services/user-manager.d.ts +6 -6
- package/socket-controllers/progress.controller.d.ts +10 -10
- package/socket-controllers/terminal.controller.d.ts +13 -13
- package/socket-controllers/terminal.d.ts +19 -20
- package/socket-middlewares/compression.middleware.d.ts +4 -4
- package/static.d.ts +2 -2
- package/utilities/base-doc.d.ts +40 -40
- package/utilities/decorators.d.ts +10 -10
- package/utilities/di-container.d.ts +43 -43
- package/utilities/empty-job.d.ts +4 -4
- package/utilities/lazy-asset-generator.d.ts +15 -15
- package/utilities/mongoose.d.ts +36 -36
- package/utilities/tree.d.ts +15 -15
- package/utils.d.ts +120 -123
- package/validators.d.ts +7 -7
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
import { getValue as getMongoValue, setValue as setMongoValue } from "mongoose/lib/utils";
|
|
3
|
+
import { BadRequestError, createParamDecorator, HttpError } from "routing-controllers";
|
|
4
|
+
import { diContainers, isArray, isFunction, isObject, isString, valueToPromise } from "../utils";
|
|
5
|
+
const pluginsKey = "typegoose:plugins";
|
|
6
|
+
/**
|
|
7
|
+
* A mongoose/typegoose plugin to inject services from the main di container to a schema as virtuals
|
|
8
|
+
* @param schema
|
|
9
|
+
* @param services
|
|
10
|
+
*/
|
|
11
|
+
export function injectServices(schema, services) {
|
|
12
|
+
const serviceMap = {};
|
|
13
|
+
if (!isObject(services)) {
|
|
14
|
+
throw new Error(`services object should be defined to inject services to schema!`);
|
|
15
|
+
}
|
|
16
|
+
Object.keys(services).forEach(prop => {
|
|
17
|
+
schema
|
|
18
|
+
.virtual(prop)
|
|
19
|
+
.get(() => {
|
|
20
|
+
const diContainer = diContainers.appContainer;
|
|
21
|
+
serviceMap[prop] = serviceMap[prop] || (!diContainer ? {} : diContainer.resolve(services[prop]));
|
|
22
|
+
return serviceMap[prop];
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Decorates a property to inject a service with the help of the injectServices mongoose/typegoose plugin
|
|
28
|
+
* @param token optional InjectionToken to use
|
|
29
|
+
* @return PropertyDecorator
|
|
30
|
+
*/
|
|
31
|
+
export function service(token) {
|
|
32
|
+
return (target, propertyKey) => {
|
|
33
|
+
const propertyType = Reflect.getOwnMetadata("design:type", target, propertyKey);
|
|
34
|
+
const plugins = Array.from(Reflect.getMetadata(pluginsKey, target.constructor) ?? []);
|
|
35
|
+
let plugin = plugins.find(t => t.mongoosePlugin === injectServices);
|
|
36
|
+
if (!plugin) {
|
|
37
|
+
plugin = { mongoosePlugin: injectServices, options: {} };
|
|
38
|
+
plugins.push(plugin);
|
|
39
|
+
}
|
|
40
|
+
plugin.options = Object.assign(plugin.options || {}, { [propertyKey]: token ?? propertyType });
|
|
41
|
+
Reflect.defineMetadata(pluginsKey, plugins, target.constructor);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Paginate using a typegoose model using a simple where query and pagination params
|
|
46
|
+
* @param model Typegoose model
|
|
47
|
+
* @param where Simple query to filter the results
|
|
48
|
+
* @param params Pagination params
|
|
49
|
+
*/
|
|
50
|
+
export function paginate(model, where, params) {
|
|
51
|
+
return model.countDocuments(where).then(count => {
|
|
52
|
+
let query = model.find(where);
|
|
53
|
+
if (isString(params.sort)) {
|
|
54
|
+
query = query.sort(params.sort);
|
|
55
|
+
}
|
|
56
|
+
if (isArray(params.populate)) {
|
|
57
|
+
params.populate.forEach(field => {
|
|
58
|
+
query = query.populate(field);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return (params.limit > 0 ? query.skip(params.page * params.limit).limit(params.limit) : query).then(items => {
|
|
62
|
+
const meta = { total: count };
|
|
63
|
+
return { count, items, meta };
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
export function lookupStages(from, localField, as = null, foreignField = "_id", shouldUnwind = true) {
|
|
68
|
+
as = as || localField.replace("Id", "");
|
|
69
|
+
const stages = [
|
|
70
|
+
{
|
|
71
|
+
$lookup: {
|
|
72
|
+
from,
|
|
73
|
+
localField,
|
|
74
|
+
foreignField,
|
|
75
|
+
as
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
$unwind: {
|
|
80
|
+
path: `$${as}`,
|
|
81
|
+
preserveNullAndEmptyArrays: true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
];
|
|
85
|
+
if (!shouldUnwind) {
|
|
86
|
+
stages.splice(1, 1);
|
|
87
|
+
}
|
|
88
|
+
return stages;
|
|
89
|
+
}
|
|
90
|
+
export function letsLookupStage(from, pipeline, as = null, letFields = null) {
|
|
91
|
+
as = as || from;
|
|
92
|
+
letFields = letFields || { id: "$_id" };
|
|
93
|
+
return {
|
|
94
|
+
$lookup: {
|
|
95
|
+
from,
|
|
96
|
+
let: letFields,
|
|
97
|
+
pipeline,
|
|
98
|
+
as
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
export function matchStage(match) {
|
|
103
|
+
return { $match: match };
|
|
104
|
+
}
|
|
105
|
+
export function matchField(field, filter, when) {
|
|
106
|
+
return { field, filter, when };
|
|
107
|
+
}
|
|
108
|
+
export function matchFieldStages(...fields) {
|
|
109
|
+
const match = {};
|
|
110
|
+
fields.forEach(field => {
|
|
111
|
+
if (field.when) {
|
|
112
|
+
match[field.field] = field.filter;
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
return Object.keys(match).length > 0 ? [matchStage(match)] : [];
|
|
116
|
+
}
|
|
117
|
+
export function projectStage(fields) {
|
|
118
|
+
return { $project: fields };
|
|
119
|
+
}
|
|
120
|
+
export function unwindStage(fieldOrOpts) {
|
|
121
|
+
return { $unwind: fieldOrOpts };
|
|
122
|
+
}
|
|
123
|
+
export function hydratePopulated(modelType, json) {
|
|
124
|
+
let object = modelType.hydrate(json);
|
|
125
|
+
for (const [path, obj] of Object.entries(modelType.schema.obj)) {
|
|
126
|
+
let { ref, type } = obj;
|
|
127
|
+
if (Array.isArray(type) && type.length > 0) {
|
|
128
|
+
ref = type[0].ref;
|
|
129
|
+
}
|
|
130
|
+
if (!ref)
|
|
131
|
+
continue;
|
|
132
|
+
const value = getMongoValue(path, json);
|
|
133
|
+
const hydrateVal = val => {
|
|
134
|
+
if (val == null || val instanceof mongoose.Types.ObjectId)
|
|
135
|
+
return val;
|
|
136
|
+
return hydratePopulated(mongoose.model(ref), val);
|
|
137
|
+
};
|
|
138
|
+
if (Array.isArray(value)) {
|
|
139
|
+
setMongoValue(path, value.map(hydrateVal), object);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
setMongoValue(path, hydrateVal(value), object);
|
|
143
|
+
}
|
|
144
|
+
return object;
|
|
145
|
+
}
|
|
146
|
+
export async function paginateAggregations(model, aggregations, params, metaProjection = {}) {
|
|
147
|
+
const sortField = !isString(params.sort) || !params.sort ? null : (params.sort.startsWith("-") ? params.sort.substr(1) : params.sort);
|
|
148
|
+
const sortAggregation = !sortField ? [] : [{
|
|
149
|
+
$sort: { [sortField]: sortField == params.sort ? 1 : -1 }
|
|
150
|
+
}];
|
|
151
|
+
const result = await model.aggregate([
|
|
152
|
+
...aggregations,
|
|
153
|
+
...sortAggregation,
|
|
154
|
+
{
|
|
155
|
+
$group: {
|
|
156
|
+
_id: "results",
|
|
157
|
+
result: { $push: "$$CURRENT" }
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
$project: {
|
|
162
|
+
_id: 0,
|
|
163
|
+
items: params.limit > 0 ? { $slice: ["$result", params.page * params.limit, params.limit] } : "$result",
|
|
164
|
+
count: { $size: "$result" },
|
|
165
|
+
meta: {
|
|
166
|
+
total: { $size: "$result" },
|
|
167
|
+
...metaProjection
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
]);
|
|
172
|
+
const pagination = result[0];
|
|
173
|
+
if (!pagination) {
|
|
174
|
+
return { items: [], count: 0, meta: { total: 0 } };
|
|
175
|
+
}
|
|
176
|
+
pagination.items = pagination.items.map(i => hydratePopulated(model, i));
|
|
177
|
+
return pagination;
|
|
178
|
+
}
|
|
179
|
+
export function ResolveEntity(model, extraCheck) {
|
|
180
|
+
const modelName = model.modelName;
|
|
181
|
+
const paramName = modelName.toLowerCase();
|
|
182
|
+
return createParamDecorator({
|
|
183
|
+
required: false,
|
|
184
|
+
value: async (action) => {
|
|
185
|
+
const req = action.request;
|
|
186
|
+
const token = req.header(`x-${paramName}-token`);
|
|
187
|
+
const id = req.params[`${paramName}Id`];
|
|
188
|
+
if (!id && !token) {
|
|
189
|
+
throw new BadRequestError(`${modelName} id or token should be defined!`);
|
|
190
|
+
}
|
|
191
|
+
const query = !token
|
|
192
|
+
? model.findById(id)
|
|
193
|
+
: model.findOne({ token });
|
|
194
|
+
let doc = null;
|
|
195
|
+
if (isFunction(extraCheck)) {
|
|
196
|
+
try {
|
|
197
|
+
doc = await valueToPromise(extraCheck(query, action));
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
throw new BadRequestError(`${modelName} check error: ${e.message || e}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
doc = await query;
|
|
205
|
+
}
|
|
206
|
+
if (!doc) {
|
|
207
|
+
throw new HttpError(404, !token
|
|
208
|
+
? `${modelName} could not be found with id: ${id}`
|
|
209
|
+
: `${modelName} could not be found with token: ${token}`);
|
|
210
|
+
}
|
|
211
|
+
action.request[paramName] = doc;
|
|
212
|
+
return doc;
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uZ29vc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbGl0aWVzL21vbmdvb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sUUFBUSxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsUUFBUSxJQUFJLGFBQWEsRUFBRSxRQUFRLElBQUksYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFeEYsT0FBTyxFQUFTLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQVk3RixPQUFPLEVBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFL0YsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUM7QUFPdkM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBbUIsRUFBRSxRQUFrRDtJQUNsRyxNQUFNLFVBQVUsR0FBNEIsRUFBRSxDQUFDO0lBQy9DLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUE7SUFDdEYsQ0FBQztJQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2pDLE1BQU07YUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDO2FBQ2IsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNOLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7WUFDOUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsUUFBUSxD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LEdBQUcsTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxJQUFJLGVBQWUsQ0FBQyxHQUFHLFNBQVMsaUJBQWlCLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDN0UsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDSixHQUFHLEdBQUcsTUFBTSxLQUFLLENBQUM7WUFDdEIsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDUCxNQUFNLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUs7b0JBQzNCLENBQUMsQ0FBQyxHQUFHLFNBQVMsZ0NBQWdDLEVBQUUsRUFBRTtvQkFDbEQsQ0FBQyxDQUFDLEdBQUcsU0FBUyxtQ0FBbUMsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBQ0QsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDaEMsT0FBTyxHQUFHLENBQUM7UUFDZixDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RG9jdW1lbnQsIEZpbHRlclF1ZXJ5LCBNb2RlbCwgUGlwZWxpbmVTdGFnZSwgUXVlcnksIFNjaGVtYX0gZnJvbSBcIm1vbmdvb3NlXCI7XG5pbXBvcnQgbW9uZ29vc2UgZnJvbSBcIm1vbmdvb3NlXCI7XG5pbXBvcnQge2dldFZhbHVlIGFzIGdldE1vbmdvVmFsdWUsIHNldFZhbHVlIGFzIHNldE1vbmdvVmFsdWV9IGZyb20gXCJtb25nb29zZS9saWIvdXRpbHNcIjtcbmltcG9ydCB7RG9jdW1lbnRUeXBlLCBSZXR1cm5Nb2RlbFR5cGV9IGZyb20gXCJAdHlwZWdvb3NlL3R5cGVnb29zZVwiO1xuaW1wb3J0IHtBY3Rpb24sIEJhZFJlcXVlc3RFcnJvciwgY3JlYXRlUGFyYW1EZWNvcmF0b3IsIEh0dHBFcnJvcn0gZnJvbSBcInJvdXRpbmctY29udHJvbGxlcnNcIjtcbmltcG9ydCB7SW5qZWN0aW9uVG9rZW59IGZyb20gXCJ0c3lyaW5nZVwiO1xuaW1wb3J0IHtcbiAgICBJTWF0Y2hGaWVsZCxcbiAgICBJbmZlckdlbmVyaWMsXG4gICAgSVBhZ2luYXRpb25CYXNlLFxuICAgIElQYWdpbmF0aW9uUGFyYW1zLFxuICAgIElQcm9qZWN0T3B0aW9ucyxcbiAgICBJUmVxdWVzdCxcbiAgICBJVW53aW5kT3B0aW9ucyxcbiAgICBUeXBlXG59IGZyb20gXCIuLi9jb21tb24tdHlwZXNcIjtcbmltcG9ydCB7ZGlDb250YWluZXJzLCBpc0FycmF5LCBpc0Z1bmN0aW9uLCBpc09iamVjdCwgaXNTdHJpbmcsIHZhbHVlVG9Qcm9taXNlfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuY29uc3QgcGx1Z2luc0tleSA9IFwidHlwZWdvb3NlOnBsdWdpbnNcIjtcblxuaW50ZXJmYWNlIElQbHVnaW5XaXRoT3B0aW9ucyB7XG4gICAgbW9uZ29vc2VQbHVnaW46IEZ1bmN0aW9uO1xuICAgIG9wdGlvbnM6IGFueTtcbn1cblxuLyoqXG4gKiBBIG1vbmdvb3NlL3R5cGVnb29zZSBwbHVnaW4gdG8gaW5qZWN0IHNlcnZpY2VzIGZyb20gdGhlIG1haW4gZGkgY29udGFpbmVyIHRvIGEgc2NoZW1hIGFzIHZpcnR1YWxzXG4gKiBAcGFyYW0gc2NoZW1hXG4gKiBAcGFyYW0gc2VydmljZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFNlcnZpY2VzKHNjaGVtYTogU2NoZW1hPGFueT4sIHNlcnZpY2VzPzogeyBbcHJvcDogc3RyaW5nXTogSW5qZWN0aW9uVG9rZW48YW55PiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2VydmljZU1hcDogeyBbcHJvcDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICBpZiAoIWlzT2JqZWN0KHNlcnZpY2VzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNlcnZpY2VzIG9iamVjdCBzaG91bGQgYmUgZGVmaW5lZCB0byBpbmplY3Qgc2VydmljZXMgdG8gc2NoZW1hIWApXG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHNlcnZpY2VzKS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBzY2hlbWFcbiAgICAgICAgICAgIC52aXJ0dWFsKHByb3ApXG4gICAgICAgICAgICAuZ2V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaUNvbnRhaW5lciA9IGRpQ29udGFpbmVycy5hcHBDb250YWluZXI7XG4gICAgICAgICAgICAgICAgc2VydmljZU1hcFtwcm9wXSA9IHNlcnZpY2VNYXBbcHJvcF0gfHwgKCFkaUNvbnRhaW5lciA/IHt9IDogZGlDb250YWluZXIucmVzb2x2ZShzZXJ2aWNlc1twcm9wXSkpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlTWFwW3Byb3BdO1xuICAgICAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbi8qKlxuICogRGVjb3JhdGVzIGEgcHJvcGVydHkgdG8gaW5qZWN0IGEgc2VydmljZSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBpbmplY3RTZXJ2aWNlcyBtb25nb29zZS90eXBlZ29vc2UgcGx1Z2luXG4gKiBAcGFyYW0gdG9rZW4gb3B0aW9uYWwgSW5qZWN0aW9uVG9rZW4gdG8gdXNlXG4gKiBAcmV0dXJuIFByb3BlcnR5RGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aWNlKHRva2VuPzogSW5qZWN0aW9uVG9rZW48YW55Pik6IFByb3BlcnR5RGVjb3JhdG9yIHtcbiAgICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCB0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICAgICAgY29uc3QgcGx1Z2lucyA9IEFycmF5LmZyb20oUmVmbGVjdC5nZXRNZXRhZGF0YShwbHVnaW5zS2V5LCB0YXJnZXQuY29uc3RydWN0b3IpID8/IFtdKSBhcyBJUGx1Z2luV2l0aE9wdGlvbnNbXTtcbiAgICAgICAgbGV0IHBsdWdpbiA9IHBsdWdpbnMuZmluZCh0ID0+IHQubW9uZ29vc2VQbHVnaW4gPT09IGluamVjdFNlcnZpY2VzKTtcbiAgICAgICAgaWYgKCFwbHVnaW4pIHtcbiAgICAgICAgICAgIHBsdWdpbiA9IHsgbW9uZ29vc2VQbHVnaW46IGluamVjdFNlcnZpY2VzLCBvcHRpb25zOiB7fSB9O1xuICAgICAgICAgICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gICAgICAgIH1cbiAgICAgICAgcGx1Z2luLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHBsdWdpbi5vcHRpb25zIHx8IHt9LCB7W3Byb3BlcnR5S2V5XTogdG9rZW4gPz8gcHJvcGVydHlUeXBlfSk7XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEocGx1Z2luc0tleSwgcGx1Z2lucywgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICB9O1xufVxuXG4vKipcbiAqIFBhZ2luYXRlIHVzaW5nIGEgdHlwZWdvb3NlIG1vZGVsIHVzaW5nIGEgc2ltcGxlIHdoZXJlIHF1ZXJ5IGFuZCBwYWdpbmF0aW9uIHBhcmFtc1xuICogQHBhcmFtIG1vZGVsIFR5cGVnb29zZSBtb2RlbFxuICogQHBhcmFtIHdoZXJlIFNpbXBsZSBxdWVyeSB0byBmaWx0ZXIgdGhlIHJlc3VsdHNcbiAqIEBwYXJhbSBwYXJhbXMgUGFnaW5hdGlvbiBwYXJhbXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZ2luYXRlPFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIHdoZXJlOiBGaWx0ZXJRdWVyeTxEb2N1bWVudFR5cGU8VT4+LCBwYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zKTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xuICAgIHJldHVybiBtb2RlbC5jb3VudERvY3VtZW50cyh3aGVyZSkudGhlbihjb3VudCA9PiB7XG4gICAgICAgIGxldCBxdWVyeTogUXVlcnk8YW55LCBhbnk+ID0gbW9kZWwuZmluZCh3aGVyZSk7XG4gICAgICAgIGlmIChpc1N0cmluZyhwYXJhbXMuc29ydCkpIHtcbiAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkuc29ydChwYXJhbXMuc29ydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQXJyYXkocGFyYW1zLnBvcHVsYXRlKSkge1xuICAgICAgICAgICAgcGFyYW1zLnBvcHVsYXRlLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkucG9wdWxhdGUoZmllbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChwYXJhbXMubGltaXQgPiAwID8gcXVlcnkuc2tpcChwYXJhbXMucGFnZSAqIHBhcmFtcy5saW1pdCkubGltaXQocGFyYW1zLmxpbWl0KSA6IHF1ZXJ5KS50aGVuKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB7dG90YWw6IGNvdW50fTtcbiAgICAgICAgICAgIHJldHVybiB7Y291bnQsIGl0ZW1zLCBtZXRhfTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb29rdXBTdGFnZXMoZnJvbTogc3RyaW5nLCBsb2NhbEZpZWxkOiBzdHJpbmcsIGFzOiBzdHJpbmcgPSBudWxsLCBmb3JlaWduRmllbGQ6IHN0cmluZyA9IFwiX2lkXCIsIHNob3VsZFVud2luZDogYm9vbGVhbiA9IHRydWUpOiBbUGlwZWxpbmVTdGFnZS5Mb29rdXAsIFBpcGVsaW5lU3RhZ2UuVW53aW5kXSB7XG4gICAgYXMgPSBhcyB8fCBsb2NhbEZpZWxkLnJlcGxhY2UoXCJJZFwiLCBcIlwiKTtcbiAgICBjb25zdCBzdGFnZXM6IFtQaXBlbGluZVN0YWdlLkxvb2t1cCwgUGlwZWxpbmVTdGFnZS5VbndpbmRdID0gW1xuICAgICAgICB7XG4gICAgICAgICAgICAkbG9va3VwOiB7XG4gICAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgICBsb2NhbEZpZWxkLFxuICAgICAgICAgICAgICAgIGZvcmVpZ25GaWVsZCxcbiAgICAgICAgICAgICAgICBhc1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAkdW53aW5kOiB7XG4gICAgICAgICAgICAgICAgcGF0aDogYCQke2FzfWAsXG4gICAgICAgICAgICAgICAgcHJlc2VydmVOdWxsQW5kRW1wdHlBcnJheXM6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF07XG4gICAgaWYgKCFzaG91bGRVbndpbmQpIHtcbiAgICAgICAgc3RhZ2VzLnNwbGljZSgxLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YWdlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxldHNMb29rdXBTdGFnZShmcm9tOiBzdHJpbmcsIHBpcGVsaW5lOiBFeGNsdWRlPFBpcGVsaW5lU3RhZ2UsIFBpcGVsaW5lU3RhZ2UuTWVyZ2UgfCBQaXBlbGluZVN0YWdlLk91dCB8IFBpcGVsaW5lU3RhZ2UuU2VhcmNoPltdLCBhczogc3RyaW5nID0gbnVsbCwgbGV0RmllbGRzOiBhbnkgPSBudWxsKTogUGlwZWxpbmVTdGFnZS5Mb29rdXAge1xuICAgIGFzID0gYXMgfHwgZnJvbTtcbiAgICBsZXRGaWVsZHMgPSBsZXRGaWVsZHMgfHwge2lkOiBcIiRfaWRcIn07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJGxvb2t1cDoge1xuICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgIGxldDogbGV0RmllbGRzLFxuICAgICAgICAgICAgcGlwZWxpbmUsXG4gICAgICAgICAgICBhc1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoU3RhZ2UobWF0Y2g6IEZpbHRlclF1ZXJ5PGFueT4pOiBQaXBlbGluZVN0YWdlLk1hdGNoIHtcbiAgICByZXR1cm4geyRtYXRjaDogbWF0Y2h9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZChmaWVsZDogc3RyaW5nLCBmaWx0ZXI6IGFueSwgd2hlbjogYm9vbGVhbik6IElNYXRjaEZpZWxkIHtcbiAgICByZXR1cm4ge2ZpZWxkLCBmaWx0ZXIsIHdoZW59O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWVsZFN0YWdlcyguLi5maWVsZHM6IElNYXRjaEZpZWxkW10pOiBSZWFkb25seUFycmF5PFBpcGVsaW5lU3RhZ2UuTWF0Y2g+IHtcbiAgICBjb25zdCBtYXRjaCA9IHt9O1xuICAgIGZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICAgICAgaWYgKGZpZWxkLndoZW4pIHtcbiAgICAgICAgICAgIG1hdGNoW2ZpZWxkLmZpZWxkXSA9IGZpZWxkLmZpbHRlcjtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXRjaCkubGVuZ3RoID4gMCA/IFttYXRjaFN0YWdlKG1hdGNoKV0gOiBbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb2plY3RTdGFnZShmaWVsZHM6IElQcm9qZWN0T3B0aW9ucyk6IFBpcGVsaW5lU3RhZ2UuUHJvamVjdCB7XG4gICAgcmV0dXJuIHskcHJvamVjdDogZmllbGRzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVud2luZFN0YWdlKGZpZWxkT3JPcHRzOiBzdHJpbmcgfCBJVW53aW5kT3B0aW9ucyk6IFBpcGVsaW5lU3RhZ2UuVW53aW5kIHtcbiAgICByZXR1cm4geyR1bndpbmQ6IGZpZWxkT3JPcHRzfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVQb3B1bGF0ZWQ8VCBleHRlbmRzIERvY3VtZW50Pihtb2RlbFR5cGU6IE1vZGVsPFQ+LCBqc29uOiBhbnkpOiBUIHtcbiAgICBsZXQgb2JqZWN0ID0gbW9kZWxUeXBlLmh5ZHJhdGUoanNvbik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBvYmpdIG9mIE9iamVjdC5lbnRyaWVzKG1vZGVsVHlwZS5zY2hlbWEub2JqKSkge1xuICAgICAgICBsZXQge3JlZiwgdHlwZX0gPSBvYmogYXMgYW55O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSAmJiB0eXBlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlZiA9IHR5cGVbMF0ucmVmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVmKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRNb25nb1ZhbHVlKHBhdGgsIGpzb24pO1xuICAgICAgICBjb25zdCBoeWRyYXRlVmFsID0gdmFsID0+IHtcbiAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCB2YWwgaW5zdGFuY2VvZiBtb25nb29zZS5UeXBlcy5PYmplY3RJZCkgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgIHJldHVybiBoeWRyYXRlUG9wdWxhdGVkKG1vbmdvb3NlLm1vZGVsKHJlZikgYXMgYW55LCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHNldE1vbmdvVmFsdWUocGF0aCwgdmFsdWUubWFwKGh5ZHJhdGVWYWwpLCBvYmplY3QpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2V0TW9uZ29WYWx1ZShwYXRoLCBoeWRyYXRlVmFsKHZhbHVlKSwgb2JqZWN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqZWN0O1xuXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYWdpbmF0ZUFnZ3JlZ2F0aW9uczxUIGV4dGVuZHMgVHlwZTxhbnk+LCBVID0gSW5mZXJHZW5lcmljPFQ+Pihtb2RlbDogUmV0dXJuTW9kZWxUeXBlPFQ+LCBhZ2dyZWdhdGlvbnM6IFBpcGVsaW5lU3RhZ2VbXSwgcGFyYW1zOiBJUGFnaW5hdGlvblBhcmFtcywgbWV0YVByb2plY3Rpb246IGFueSA9IHt9KTogUHJvbWlzZTxJUGFnaW5hdGlvbkJhc2U8RG9jdW1lbnRUeXBlPFU+Pj4ge1xuICAgIGNvbnN0IHNvcnRGaWVsZCA9ICFpc1N0cmluZyhwYXJhbXMuc29ydCkgfHwgIXBhcmFtcy5zb3J0ID8gbnVsbCA6IChwYXJhbXMuc29ydC5zdGFydHNXaXRoKFwiLVwiKSA/IHBhcmFtcy5zb3J0LnN1YnN0cigxKSA6IHBhcmFtcy5zb3J0KTtcbiAgICBjb25zdCBzb3J0QWdncmVnYXRpb246IFBpcGVsaW5lU3RhZ2UuU29ydFtdID0gIXNvcnRGaWVsZCA/IFtdIDogW3tcbiAgICAgICAgJHNvcnQ6IHtbc29ydEZpZWxkXTogc29ydEZpZWxkID09IHBhcmFtcy5zb3J0ID8gMSA6IC0xfVxuICAgIH1dO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1vZGVsLmFnZ3JlZ2F0ZShbXG4gICAgICAgIC4uLmFnZ3JlZ2F0aW9ucyxcbiAgICAgICAgLi4uc29ydEFnZ3JlZ2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgICAkZ3JvdXA6IHtcbiAgICAgICAgICAgICAgICBfaWQ6IFwicmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgIHJlc3VsdDogeyRwdXNoOiBcIiQkQ1VSUkVOVFwifVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICAkcHJvamVjdDoge1xuICAgICAgICAgICAgICAgIF9pZDogMCxcbiAgICAgICAgICAgICAgICBpdGVtczogcGFyYW1zLmxpbWl0ID4gMCA/IHskc2xpY2U6IFtcIiRyZXN1bHRcIiwgcGFyYW1zLnBhZ2UgKiBwYXJhbXMubGltaXQsIHBhcmFtcy5saW1pdF19IDogXCIkcmVzdWx0XCIsXG4gICAgICAgICAgICAgICAgY291bnQ6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxuICAgICAgICAgICAgICAgIG1ldGE6IHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWw6IHskc2l6ZTogXCIkcmVzdWx0XCJ9LFxuICAgICAgICAgICAgICAgICAgICAuLi5tZXRhUHJvamVjdGlvblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF0pO1xuICAgIGNvbnN0IHBhZ2luYXRpb24gPSByZXN1bHRbMF0gYXMgSVBhZ2luYXRpb25CYXNlPERvY3VtZW50VHlwZTxVPj47XG4gICAgaWYgKCFwYWdpbmF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7aXRlbXM6IFtdLCBjb3VudDogMCwgbWV0YToge3RvdGFsOiAwfX07XG4gICAgfVxuICAgIHBhZ2luYXRpb24uaXRlbXMgPSBwYWdpbmF0aW9uLml0ZW1zLm1hcChpID0+IGh5ZHJhdGVQb3B1bGF0ZWQobW9kZWwsIGkpIGFzIGFueSk7XG4gICAgcmV0dXJuIHBhZ2luYXRpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSZXNvbHZlRW50aXR5PFQgZXh0ZW5kcyBUeXBlPGFueT4sIFUgPSBJbmZlckdlbmVyaWM8VD4+KG1vZGVsOiBSZXR1cm5Nb2RlbFR5cGU8VD4sIGV4dHJhQ2hlY2s/OiAocXVlcnk6IFF1ZXJ5PERvY3VtZW50VHlwZTxVPiwgYW55PiwgYWN0aW9uOiBBY3Rpb24pID0+IFByb21pc2U8RG9jdW1lbnRUeXBlPFU+Pik6IFBhcmFtZXRlckRlY29yYXRvciB7XG4gICAgY29uc3QgbW9kZWxOYW1lID0gbW9kZWwubW9kZWxOYW1lO1xuICAgIGNvbnN0IHBhcmFtTmFtZSA9IG1vZGVsTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBjcmVhdGVQYXJhbURlY29yYXRvcih7XG4gICAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IGFzeW5jIGFjdGlvbiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXEgPSBhY3Rpb24ucmVxdWVzdCBhcyBJUmVxdWVzdDtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gcmVxLmhlYWRlcihgeC0ke3BhcmFtTmFtZX0tdG9rZW5gKTtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gcmVxLnBhcmFtc1tgJHtwYXJhbU5hbWV9SWRgXSBhcyBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoIWlkICYmICF0b2tlbikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBpZCBvciB0b2tlbiBzaG91bGQgYmUgZGVmaW5lZCFgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gIXRva2VuXG4gICAgICAgICAgICAgICAgPyBtb2RlbC5maW5kQnlJZChpZClcbiAgICAgICAgICAgICAgICA6IG1vZGVsLmZpbmRPbmUoe3Rva2VufSBhcyBhbnkpO1xuICAgICAgICAgICAgbGV0IGRvYzogRG9jdW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oZXh0cmFDaGVjaykpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBkb2MgPSBhd2FpdCB2YWx1ZVRvUHJvbWlzZShleHRyYUNoZWNrKHF1ZXJ5LCBhY3Rpb24pKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXJyb3IoYCR7bW9kZWxOYW1lfSBjaGVjayBlcnJvcjogJHtlLm1lc3NhZ2UgfHwgZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvYyA9IGF3YWl0IHF1ZXJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFkb2MpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKDQwNCwgIXRva2VuXG4gICAgICAgICAgICAgICAgICAgID8gYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCBpZDogJHtpZH1gXG4gICAgICAgICAgICAgICAgICAgIDogYCR7bW9kZWxOYW1lfSBjb3VsZCBub3QgYmUgZm91bmQgd2l0aCB0b2tlbjogJHt0b2tlbn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFjdGlvbi5yZXF1ZXN0W3BhcmFtTmFtZV0gPSBkb2M7XG4gICAgICAgICAgICByZXR1cm4gZG9jO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { isString } from "../utils";
|
|
2
|
+
export class Tree {
|
|
3
|
+
container;
|
|
4
|
+
exists;
|
|
5
|
+
path;
|
|
6
|
+
map;
|
|
7
|
+
get parentTree() {
|
|
8
|
+
return this.container.parent.tree;
|
|
9
|
+
}
|
|
10
|
+
constructor(container, exists, path) {
|
|
11
|
+
this.container = container;
|
|
12
|
+
this.exists = exists;
|
|
13
|
+
this.path = path;
|
|
14
|
+
this.map = new Map();
|
|
15
|
+
}
|
|
16
|
+
resolveService() {
|
|
17
|
+
return !this.exists ? null : this.container.resolve(this.path);
|
|
18
|
+
}
|
|
19
|
+
resolveLeaves() {
|
|
20
|
+
let map;
|
|
21
|
+
try {
|
|
22
|
+
const parentTree = this.parentTree.resolvePath(this.path);
|
|
23
|
+
map = parentTree.resolveLeaves();
|
|
24
|
+
}
|
|
25
|
+
catch (e) {
|
|
26
|
+
map = new Map();
|
|
27
|
+
}
|
|
28
|
+
const visitor = (treeMap, path) => {
|
|
29
|
+
treeMap.forEach((tree, key) => {
|
|
30
|
+
const subKey = !path ? key : `${path}.${key}`;
|
|
31
|
+
if (tree.map.size == 0) {
|
|
32
|
+
map.set(subKey, tree);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
visitor(tree.map, subKey);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
visitor(this.map, "");
|
|
39
|
+
return map;
|
|
40
|
+
}
|
|
41
|
+
resolveServices() {
|
|
42
|
+
const map = new Map();
|
|
43
|
+
this.resolveLeaves().forEach((leaf, key) => {
|
|
44
|
+
map.set(key, leaf.resolveService());
|
|
45
|
+
});
|
|
46
|
+
return map;
|
|
47
|
+
}
|
|
48
|
+
resolveAncestor(path) {
|
|
49
|
+
if (!isString(path) || path.length == 0) {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
let parentTree;
|
|
53
|
+
try {
|
|
54
|
+
parentTree = this.parentTree.resolvePath(this.path);
|
|
55
|
+
parentTree = parentTree.resolveAncestor(path);
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
parentTree = new Tree(this.container, false, "");
|
|
59
|
+
}
|
|
60
|
+
const pathParts = path.split(".");
|
|
61
|
+
let tree = this;
|
|
62
|
+
let previousTree = this;
|
|
63
|
+
for (let part of pathParts) {
|
|
64
|
+
tree = tree.map.get(part);
|
|
65
|
+
if (!tree) {
|
|
66
|
+
if (previousTree == this) {
|
|
67
|
+
if (parentTree.path.length > 0) {
|
|
68
|
+
return parentTree;
|
|
69
|
+
}
|
|
70
|
+
throw new Error(`Ancestor '${path}' not found in current tree: '${this.path}'`);
|
|
71
|
+
}
|
|
72
|
+
return previousTree;
|
|
73
|
+
}
|
|
74
|
+
previousTree = tree;
|
|
75
|
+
}
|
|
76
|
+
return parentTree.path.length > previousTree.path.length
|
|
77
|
+
? parentTree : previousTree;
|
|
78
|
+
}
|
|
79
|
+
resolvePath(path, throwError = true) {
|
|
80
|
+
const absolutePath = !this.path ? path : `${this.path}.${path}`;
|
|
81
|
+
let tree = new Tree(this.container, false, absolutePath);
|
|
82
|
+
try {
|
|
83
|
+
tree = this.resolveAncestor(path);
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
if (throwError) {
|
|
87
|
+
throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
|
|
88
|
+
}
|
|
89
|
+
return tree;
|
|
90
|
+
}
|
|
91
|
+
if (tree.path !== absolutePath) {
|
|
92
|
+
if (throwError) {
|
|
93
|
+
throw new Error(`Path '${path}' not found in current tree: '${this.path}'`);
|
|
94
|
+
}
|
|
95
|
+
return tree;
|
|
96
|
+
}
|
|
97
|
+
return tree;
|
|
98
|
+
}
|
|
99
|
+
addPath(path) {
|
|
100
|
+
if (!isString(path) || path.length == 0) {
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
const pathParts = path.split(".");
|
|
104
|
+
const maxIx = pathParts.length - 1;
|
|
105
|
+
let tree = this;
|
|
106
|
+
path = this.path;
|
|
107
|
+
for (let ix = 0; ix <= maxIx; ix++) {
|
|
108
|
+
const part = pathParts[ix];
|
|
109
|
+
if (!tree.map.has(part)) {
|
|
110
|
+
tree.map.set(part, new Tree(this.container, false, !path ? part : `${path}.${part}`));
|
|
111
|
+
}
|
|
112
|
+
tree = tree.map.get(part);
|
|
113
|
+
tree.exists = tree.exists || ix == maxIx;
|
|
114
|
+
path = tree.path;
|
|
115
|
+
}
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlsaXRpZXMvdHJlZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWxDLE1BQU0sT0FBTyxJQUFJO0lBUVM7SUFBMkM7SUFBMEI7SUFOakYsR0FBRyxDQUFvQjtJQUVqQyxJQUFjLFVBQVU7UUFDcEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDdEMsQ0FBQztJQUVELFlBQXNCLFNBQStCLEVBQVksTUFBZSxFQUFXLElBQVk7UUFBakYsY0FBUyxHQUFULFNBQVMsQ0FBc0I7UUFBWSxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVcsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNuRyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFnQixDQUFDO0lBQ3ZDLENBQUM7SUFFRCxjQUFjO1FBQ1YsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxhQUFhO1FBQ1QsSUFBSSxHQUF1QixDQUFDO1FBQzVCLElBQUksQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRCxHQUFHLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1QsR0FBRyxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO1FBQ25DLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQTBCLEVBQUUsSUFBWSxFQUFFLEVBQUU7WUFD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Q0FBQztRQUN0QixJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNqQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFBO1lBQ3pGLENBQUM7WUFDRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLEVBQUUsSUFBSSxLQUFLLENBQUM7WUFDekMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SURlcGVuZGVuY3lDb250YWluZXIsIElUcmVlfSBmcm9tIFwiLi4vY29tbW9uLXR5cGVzXCI7XHJcbmltcG9ydCB7aXNTdHJpbmd9IGZyb20gXCIuLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRyZWUgaW1wbGVtZW50cyBJVHJlZSB7XHJcblxyXG4gICAgcHJvdGVjdGVkIG1hcDogTWFwPHN0cmluZywgVHJlZT47XHJcblxyXG4gICAgcHJvdGVjdGVkIGdldCBwYXJlbnRUcmVlKCk6IElUcmVlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb250YWluZXIucGFyZW50LnRyZWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGNvbnRhaW5lcjogSURlcGVuZGVuY3lDb250YWluZXIsIHByb3RlY3RlZCBleGlzdHM6IGJvb2xlYW4sIHJlYWRvbmx5IHBhdGg6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubWFwID0gbmV3IE1hcDxzdHJpbmcsIFRyZWU+KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZVNlcnZpY2UoKTogYW55IHtcclxuICAgICAgICByZXR1cm4gIXRoaXMuZXhpc3RzID8gbnVsbCA6IHRoaXMuY29udGFpbmVyLnJlc29sdmUodGhpcy5wYXRoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlTGVhdmVzKCk6IE1hcDxzdHJpbmcsIElUcmVlPiB7XHJcbiAgICAgICAgbGV0IG1hcDogTWFwPHN0cmluZywgSVRyZWU+O1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudFRyZWUgPSB0aGlzLnBhcmVudFRyZWUucmVzb2x2ZVBhdGgodGhpcy5wYXRoKTtcclxuICAgICAgICAgICAgbWFwID0gcGFyZW50VHJlZS5yZXNvbHZlTGVhdmVzKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBtYXAgPSBuZXcgTWFwPHN0cmluZywgSVRyZWU+KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHZpc2l0b3IgPSAodHJlZU1hcDogTWFwPHN0cmluZywgVHJlZT4sIHBhdGg6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICB0cmVlTWFwLmZvckVhY2goKHRyZWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgc3ViS2V5ID0gIXBhdGggPyBrZXkgOiBgJHtwYXRofS4ke2tleX1gO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRyZWUubWFwLnNpemUgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoc3ViS2V5LCB0cmVlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB2aXNpdG9yKHRyZWUubWFwLCBzdWJLZXkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHZpc2l0b3IodGhpcy5tYXAsIFwiXCIpO1xyXG4gICAgICAgIHJldHVybiBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZVNlcnZpY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XHJcbiAgICAgICAgdGhpcy5yZXNvbHZlTGVhdmVzKCkuZm9yRWFjaCgobGVhZiwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIG1hcC5zZXQoa2V5LCBsZWFmLnJlc29sdmVTZXJ2aWNlKCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBtYXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZUFuY2VzdG9yKHBhdGg6IHN0cmluZyk6IElUcmVlIHtcclxuICAgICAgICBpZiAoIWlzU3RyaW5nKHBhdGgpIHx8IHBhdGgubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBwYXJlbnRUcmVlOiBJVHJlZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwYXJlbnRUcmVlID0gdGhpcy5wYXJlbnRUcmVlLnJlc29sdmVQYXRoKHRoaXMucGF0aCk7XHJcbiAgICAgICAgICAgIHBhcmVudFRyZWUgPSBwYXJlbnRUcmVlLnJlc29sdmVBbmNlc3RvcihwYXRoKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHBhcmVudFRyZWUgPSBuZXcgVHJlZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UsIFwiXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBsZXQgdHJlZTogVHJlZSA9IHRoaXM7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzVHJlZTogVHJlZSA9IHRoaXM7XHJcbiAgICAgICAgZm9yIChsZXQgcGFydCBvZiBwYXRoUGFydHMpIHtcclxuICAgICAgICAgICAgdHJlZSA9IHRyZWUubWFwLmdldChwYXJ0KTtcclxuICAgICAgICAgICAgaWYgKCF0cmVlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNUcmVlID09IHRoaXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50VHJlZS5wYXRoLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudFRyZWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQW5jZXN0b3IgJyR7cGF0aH0nIG5vdCBmb3VuZCBpbiBjdXJyZW50IHRyZWU6ICcke3RoaXMucGF0aH0nYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNUcmVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZpb3VzVHJlZSA9IHRyZWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYXJlbnRUcmVlLnBhdGgubGVuZ3RoID4gcHJldmlvdXNUcmVlLnBhdGgubGVuZ3RoXHJcbiAgICAgICAgICAgID8gcGFyZW50VHJlZSA6IHByZXZpb3VzVHJlZTtcclxuICAgIH1cclxuXHJcbiAgICByZXNvbHZlUGF0aChwYXRoOiBzdHJpbmcsIHRocm93RXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogSVRyZWUge1xyXG4gICAgICAgIGNvbnN0IGFic29sdXRlUGF0aCA9ICF0aGlzLnBhdGggPyBwYXRoIDogYCR7dGhpcy5wYXRofS4ke3BhdGh9YDtcclxuICAgICAgICBsZXQgdHJlZTogSVRyZWUgPSBuZXcgVHJlZSh0aGlzLmNvbnRhaW5lciwgZmFsc2UsIGFic29sdXRlUGF0aCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdHJlZSA9IHRoaXMucmVzb2x2ZUFuY2VzdG9yKHBhdGgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKHRocm93RXJyb3IpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCAnJHtwYXRofScgbm90IGZvdW5kIGluIGN1cnJlbnQgdHJlZTogJyR7dGhpcy5wYXRofSdgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJlZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRyZWUucGF0aCAhPT0gYWJzb2x1dGVQYXRoKSB7XHJcbiAgICAgICAgICAgIGlmICh0aHJvd0Vycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggJyR7cGF0aH0nIG5vdCBmb3VuZCBpbiBjdXJyZW50IHRyZWU6ICcke3RoaXMucGF0aH0nYCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHRyZWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cmVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFBhdGgocGF0aDogc3RyaW5nKTogdGhpcyB7XHJcbiAgICAgICAgaWYgKCFpc1N0cmluZyhwYXRoKSB8fCBwYXRoLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBjb25zdCBtYXhJeCA9IHBhdGhQYXJ0cy5sZW5ndGggLSAxO1xyXG4gICAgICAgIGxldCB0cmVlOiBUcmVlID0gdGhpcztcclxuICAgICAgICBwYXRoID0gdGhpcy5wYXRoO1xyXG4gICAgICAgIGZvciAobGV0IGl4ID0gMDsgaXggPD0gbWF4SXg7IGl4KyspIHtcclxuICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhdGhQYXJ0c1tpeF07XHJcbiAgICAgICAgICAgIGlmICghdHJlZS5tYXAuaGFzKHBhcnQpKSB7XHJcbiAgICAgICAgICAgICAgICB0cmVlLm1hcC5zZXQocGFydCwgbmV3IFRyZWUodGhpcy5jb250YWluZXIsIGZhbHNlLCAhcGF0aCA/IHBhcnQgOiBgJHtwYXRofS4ke3BhcnR9YCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJlZSA9IHRyZWUubWFwLmdldChwYXJ0KTtcclxuICAgICAgICAgICAgdHJlZS5leGlzdHMgPSB0cmVlLmV4aXN0cyB8fCBpeCA9PSBtYXhJeDtcclxuICAgICAgICAgICAgcGF0aCA9IHRyZWUucGF0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbn1cclxuIl19
|