Files
osr-mono/packages/fs/copy.js
T
2025-01-29 17:40:56 +01:00

627 lines
50 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateInput = validateInput;
exports.sync = sync;
exports.copySymlinkAsync = copySymlinkAsync;
exports.resolveConflict = resolveConflict;
exports.async = async;
const pathUtil = require("path");
const fs = require("fs");
const fs_1 = require("fs");
const mkdirp_1 = require("mkdirp");
const exists_1 = require("./exists");
const matcher_1 = require("./utils/matcher");
const mode_1 = require("./utils/mode");
const tree_walker_1 = require("./utils/tree_walker");
const validate_1 = require("./utils/validate");
const write_1 = require("./write");
const errors_1 = require("./errors");
const interfaces_1 = require("./interfaces");
const inspect_1 = require("./inspect");
const remove_1 = require("./remove");
const promisify_1 = require("./promisify");
const iterator_1 = require("./iterator");
const promisedSymlink = (0, promisify_1.promisify)(fs.symlink);
const promisedReadlink = (0, promisify_1.promisify)(fs.readlink);
const promisedUnlink = (0, promisify_1.promisify)(fs.unlink);
const promisedMkdirp = (0, promisify_1.promisify)(mkdirp_1.sync);
const progress = require('progress-stream');
const CPROGRESS_THRESHOLD = 1048576 * 5; // minimum file size threshold to use write progress = 5MB
function validateInput(methodName, from, to, options) {
const methodSignature = methodName + '(from, to, [options])';
(0, validate_1.validateArgument)(methodSignature, 'from', from, ['string']);
(0, validate_1.validateArgument)(methodSignature, 'to', to, ['string']);
(0, validate_1.validateOptions)(methodSignature, 'options', options, {
overwrite: ['boolean'],
matching: ['string', 'array of string'],
progress: ['function'],
content: ['function'],
writeProgress: ['function'],
conflictCallback: ['function'],
conflictSettings: ['object'],
throttel: ['number'],
debug: ['boolean'],
flags: ['number']
});
}
const parseOptions = (options, from) => {
const opts = options || {};
const parsedOptions = {};
parsedOptions.overwrite = opts.overwrite;
parsedOptions.progress = opts.progress;
parsedOptions.writeProgress = opts.writeProgress;
parsedOptions.content = opts.content;
parsedOptions.conflictCallback = opts.conflictCallback;
parsedOptions.conflictSettings = opts.conflictSettings;
parsedOptions.debug = opts.debug;
parsedOptions.throttel = opts.throttel;
parsedOptions.renameCallback = opts.renameCallback;
parsedOptions.flags = opts.flags || 0;
if (!opts.filter) {
if (opts.matching) {
parsedOptions.filter = (0, matcher_1.create)(from, opts.matching);
}
else {
parsedOptions.filter = () => {
return true;
};
}
}
return parsedOptions;
};
// ---------------------------------------------------------
// Sync
// ---------------------------------------------------------
const checksBeforeCopyingSync = (from, to, options = {}) => {
if (!(0, exists_1.sync)(from)) {
throw (0, errors_1.ErrDoesntExists)(from);
}
if ((0, exists_1.sync)(to) && !options.overwrite) {
throw (0, errors_1.ErrDestinationExists)(to);
}
};
async function copyFileSyncWithProgress(from, to, options = {}) {
return new Promise((resolve, reject) => {
const started = Date.now();
let cbCalled = false;
let elapsed = Date.now();
let speed = 0;
const done = (err) => {
if (!cbCalled) {
cbCalled = true;
resolve(1);
}
};
const rd = (0, fs_1.createReadStream)(from).
on('error', (err) => done(err));
const str = progress({
length: fs.statSync(from).size,
time: 100
}).on('progress', (e) => {
elapsed = (Date.now() - started) / 1000;
speed = e.transferred / elapsed;
options.writeProgress(from, e.transferred, e.length);
});
const wr = (0, fs_1.createWriteStream)(to);
wr.on('error', (err) => done(err));
wr.on('close', done);
rd.pipe(str).pipe(wr);
});
}
async function copyFileSync(from, to, mode, options) {
let data = (0, fs_1.readFileSync)(from);
const writeOptions = {
mode: mode
};
if (options.renameCallback) {
const rename = options.renameCallback(from, to);
if (rename) {
to = rename;
}
}
if (options.content) {
data = options.content(from, data, (0, inspect_1.createItem)(from));
}
if (options && options.writeProgress) {
await copyFileSyncWithProgress(from, to, options);
}
else {
(0, write_1.sync)(to, data, writeOptions);
}
}
const copySymlinkSync = (from, to) => {
const symlinkPointsAt = fs.readlinkSync(from);
try {
(0, fs_1.symlinkSync)(symlinkPointsAt, to);
}
catch (err) {
// There is already file/symlink with this name on destination location.
// Must erase it manually, otherwise system won't allow us to place symlink there.
if (err.code === 'EEXIST') {
fs.unlinkSync(to);
// Retry...
fs.symlinkSync(symlinkPointsAt, to);
}
else {
throw err;
}
}
};
async function copyItemSync(from, inspectData, to, options) {
const mode = (0, mode_1.normalizeFileMode)(inspectData.mode);
if (inspectData.type === interfaces_1.ENodeType.DIR) {
if (options.renameCallback) {
const rename = options.renameCallback(from, to);
if (rename) {
to = rename;
}
}
(0, mkdirp_1.sync)(to, { mode: parseInt(mode, 8), fs: null });
}
else if (inspectData.type === interfaces_1.ENodeType.FILE) {
await copyFileSync(from, to, mode, options);
}
else if (inspectData.type === interfaces_1.ENodeType.SYMLINK) {
if (options.renameCallback) {
const rename = options.renameCallback(from, to);
if (rename) {
to = rename;
}
}
copySymlinkSync(from, to);
}
}
function sync(from, to, options) {
const opts = parseOptions(options, from);
checksBeforeCopyingSync(from, to, opts);
const nodes = [];
let sizeTotal = 0;
if (options && options.flags & interfaces_1.ECopyFlags.EMPTY) {
const dstStat = fs.statSync(to);
if (dstStat.isDirectory()) {
(0, remove_1.sync)(to);
}
}
// tslint:disable-next-line:no-shadowed-variable
const visitor = (path, inspectData) => {
if (opts.filter(path)) {
nodes.push({
path: path,
item: inspectData,
dst: pathUtil.resolve(to, pathUtil.relative(from, path))
});
sizeTotal += inspectData.size;
}
};
(0, tree_walker_1.sync)(from, {
inspectOptions: {
mode: true,
symlinks: true
}
}, visitor);
nodes.map((item, current) => {
copyItemSync(item.path, item.item, item.dst, options);
if (opts.progress) {
opts.progress(item.path, current, nodes.length, item.item, item.dst);
}
});
}
// ---------------------------------------------------------
// Async
// ---------------------------------------------------------
/**
*
*
* @param {string} from
* @param {string} to
* @param {ICopyOptions} opts
* @returns {(Promise<IConflictSettings | any>)}
*/
const checkAsync = (from, to, opts) => {
return (0, exists_1.async)(from)
.then(srcPathExists => {
if (!srcPathExists) {
throw (0, errors_1.ErrDoesntExists)(from);
}
else {
return (0, exists_1.async)(to);
}
})
.then(destPathExists => {
if (destPathExists) {
if (opts.conflictSettings) {
return Promise.resolve(opts.conflictSettings);
}
if (opts.conflictCallback) {
const promise = opts.conflictCallback(to, (0, inspect_1.createItem)(to), interfaces_1.EError.EXISTS);
promise.then((settings) => {
settings.error = interfaces_1.EError.EXISTS;
});
return promise;
}
if (!opts.overwrite) {
throw (0, errors_1.ErrDestinationExists)(to);
}
}
});
};
const copyFileAsync = (from, to, mode, options, retriedAttempt) => {
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(from);
const writeStream = fs.createWriteStream(to, { mode: mode });
readStream.on('error', reject);
writeStream.on('error', (err) => {
const toDirPath = pathUtil.dirname(to);
// Force read stream to close, since write stream errored
// read stream serves us no purpose.
readStream.resume();
if (err.code === interfaces_1.EError.NOEXISTS && retriedAttempt === undefined) {
// Some parent directory doesn't exits. Create it and retry.
promisedMkdirp(toDirPath, null).then(() => {
// Make retry attempt only once to prevent vicious infinite loop
// (when for some obscure reason I/O will keep returning ENOENT error).
// Passing retriedAttempt = true.
copyFileAsync(from, to, mode, null, true)
.then(resolve)
.catch(reject);
});
}
else {
reject(err);
}
});
writeStream.on('finish', () => {
// feature: preserve times
if (options && options.flags & interfaces_1.ECopyFlags.PRESERVE_TIMES) {
const sourceStat = fs.statSync(from);
fs.open(to, 'w', (err, fd) => {
if (err) {
throw err;
}
fs.futimes(fd, sourceStat.atime, sourceStat.mtime, (err2) => {
if (err2) {
throw err2;
}
fs.close(fd, null);
resolve(1);
});
});
}
else {
resolve(1);
}
});
const size = fs.statSync(from).size;
let progressStream = null;
if (options && options.writeProgress && size > CPROGRESS_THRESHOLD) {
progressStream = progress({
length: fs.statSync(from).size,
time: 100 // call progress each 100 ms
});
let elapsed = Date.now();
let speed = 0;
const started = Date.now();
progressStream.on('progress', (e) => {
elapsed = (Date.now() - started) / 1000;
speed = e.transferred / elapsed;
options.writeProgress(from, e.transferred, e.length);
if (options.debug) {
console.log('write ' + from + ' (' + e.transferred + ' of ' + e.length);
}
});
readStream.pipe(progressStream).pipe(writeStream);
}
else {
if (options && options.debug) {
console.log('write ' + from + ' to ' + to);
}
readStream.pipe(writeStream);
}
});
};
function copySymlinkAsync(from, to) {
return promisedReadlink(from)
.then((symlinkPointsAt) => {
return new Promise((resolve, reject) => {
promisedSymlink(symlinkPointsAt, to, null)
.then(resolve)
.catch((err) => {
if (err.code === interfaces_1.EError.EXISTS) {
// There is already file/symlink with this name on destination location.
// Must erase it manually, otherwise system won't allow us to place symlink there.
promisedUnlink(to, null)
// Retry...
.then(() => {
return promisedSymlink(symlinkPointsAt, to, null);
})
.then(resolve, reject);
}
else {
reject(err);
}
});
});
});
}
const copyItemAsync = (from, inspectData, to, options) => {
const mode = (0, mode_1.normalizeFileMode)(inspectData.mode);
if (inspectData.type === interfaces_1.ENodeType.DIR) {
return promisedMkdirp(to, { mode: mode });
}
else if (inspectData.type === interfaces_1.ENodeType.FILE) {
return copyFileAsync(from, to, mode, options);
}
else if (inspectData.type === interfaces_1.ENodeType.SYMLINK) {
return copySymlinkAsync(from, to);
}
// EInspectItemType.OTHER
return Promise.resolve();
};
// handle user side setting "THROW" and non enum values (null)
const onConflict = (from, to, options, settings) => {
switch (settings.overwrite) {
case interfaces_1.EResolveMode.THROW: {
throw (0, errors_1.ErrDestinationExists)(to);
}
case interfaces_1.EResolveMode.OVERWRITE:
case interfaces_1.EResolveMode.APPEND:
case interfaces_1.EResolveMode.IF_NEWER:
case interfaces_1.EResolveMode.ABORT:
case interfaces_1.EResolveMode.IF_SIZE_DIFFERS:
case interfaces_1.EResolveMode.SKIP: {
return settings.overwrite;
}
default: {
return undefined;
}
}
};
function resolveConflict(from, to, options, resolveMode) {
if (resolveMode === undefined) {
return true;
}
const src = (0, inspect_1.createItem)(from);
const dst = (0, inspect_1.createItem)(to);
if (resolveMode === interfaces_1.EResolveMode.SKIP) {
return false;
}
else if (resolveMode === interfaces_1.EResolveMode.IF_NEWER) {
if (src.type === interfaces_1.ENodeType.DIR && dst.type === interfaces_1.ENodeType.DIR) {
return true;
}
if (dst.modifyTime.getTime() > src.modifyTime.getTime()) {
return false;
}
}
else if (resolveMode === interfaces_1.EResolveMode.IF_SIZE_DIFFERS) {
// @TODO : not implemented: copy EInspectItemType.DIR with ECopyResolveMode.IF_SIZE_DIFFERS
if (src.type === interfaces_1.ENodeType.DIR && dst.type === interfaces_1.ENodeType.DIR) {
return true;
}
else if (src.type === interfaces_1.ENodeType.FILE && dst.type === interfaces_1.ENodeType.FILE) {
if (src.size === dst.size) {
return false;
}
}
}
else if (resolveMode === interfaces_1.EResolveMode.OVERWRITE) {
return true;
}
else if (resolveMode === interfaces_1.EResolveMode.ABORT) {
return false;
}
}
function isDone(nodes) {
let done = true;
nodes.forEach((element) => {
if (element.status !== interfaces_1.ENodeOperationStatus.DONE) {
done = false;
}
});
return done;
}
/**
* A callback for treeWalkerStream. This is called when a node has been found.
*
* @param {string} from
* @param {string} to
* @param {*} vars
* @param {{ path: string, item: INode }} item
* @returns {Promise<void>}
*/
async function visitor(from, to, vars, item) {
const options = vars.options;
let rel;
let destPath;
if (!item) {
return;
}
rel = pathUtil.relative(from, item.path);
destPath = pathUtil.resolve(to, rel);
item.status = interfaces_1.ENodeOperationStatus.PROCESSING;
const done = () => {
item.status = interfaces_1.ENodeOperationStatus.DONE;
if (isDone(vars.nodes)) {
return vars.resolve(vars.result);
}
};
if (isDone(vars.nodes)) {
return vars.resolve(vars.result);
}
vars.filesInProgress += 1;
// our main function after sanity checks
const checked = (subResolveSettings) => {
item.status = interfaces_1.ENodeOperationStatus.CHECKED;
// feature : report
if (subResolveSettings && options && options.flags && options.flags & interfaces_1.ECopyFlags.REPORT) {
vars.result.push({
error: subResolveSettings.error,
node: item,
resolved: subResolveSettings
});
}
if (subResolveSettings) {
// if the first resolve callback returned an individual resolve settings "THIS",
// ask the user again with the same item
const always = subResolveSettings.mode === interfaces_1.EResolve.ALWAYS;
if (always) {
options.conflictSettings = subResolveSettings;
}
let overwriteMode = subResolveSettings.overwrite;
overwriteMode = onConflict(item.path, destPath, options, subResolveSettings);
if (overwriteMode === interfaces_1.EResolveMode.ABORT) {
vars.abort = true;
}
if (vars.abort) {
return;
}
if (!resolveConflict(item.path, destPath, options, overwriteMode)) {
done();
return;
}
}
item.status = interfaces_1.ENodeOperationStatus.PROCESS;
copyItemAsync(item.path, item.item, destPath, options).then(() => {
vars.filesInProgress -= 1;
if (options.progress) {
if (options.progress(item.path, vars.filesInProgress, vars.filesInProgress, item.item) === false) {
vars.abort = true;
return vars.resolve();
}
}
done();
}).catch((err) => {
if (options && options.conflictCallback) {
if (err.code === interfaces_1.EError.PERMISSION || err.code === interfaces_1.EError.NOEXISTS) {
options.conflictCallback(item.path, (0, inspect_1.createItem)(destPath), err.code).then((errorResolveSettings) => {
// the user has set the conflict resolver to always, so we use the last one
if (vars.onCopyErrorResolveSettings) {
errorResolveSettings = vars.onCopyErrorResolveSettings;
}
// user said use this settings always, we track and use this last setting from now on
if (errorResolveSettings.mode === interfaces_1.EResolve.ALWAYS && !vars.onCopyErrorResolveSettings) {
vars.onCopyErrorResolveSettings = errorResolveSettings;
}
if (errorResolveSettings.overwrite === interfaces_1.EResolveMode.ABORT) {
vars.abort = true;
return vars.resolve();
}
if (errorResolveSettings.overwrite === interfaces_1.EResolveMode.THROW) {
vars.abort = true;
return vars.reject(err);
}
if (errorResolveSettings.overwrite === interfaces_1.EResolveMode.SKIP) {
vars.filesInProgress -= 1;
}
// user error, should never happen, unintended
if (errorResolveSettings.overwrite === interfaces_1.EResolveMode.IF_NEWER ||
errorResolveSettings.overwrite === interfaces_1.EResolveMode.IF_SIZE_DIFFERS ||
errorResolveSettings.overwrite === interfaces_1.EResolveMode.OVERWRITE) {
vars.reject(new interfaces_1.ErrnoException('settings make no sense : errorResolveSettings.overwrite = ' + errorResolveSettings.overwrite));
}
});
}
}
vars.reject(err);
});
};
return checkAsync(item.path, destPath, options).then(checked);
}
function next(nodes) {
for (let i = 0; i < nodes.length; i++) {
if (nodes[i].status === interfaces_1.ENodeOperationStatus.COLLECTED) {
return nodes[i];
}
}
return null;
}
/**
* Final async copy function.
* @export
* @param {string} from
* @param {string} to
* @param {ICopyOptions} [options]
* @returns
*/
function async(from, to, options) {
options = parseOptions(options, from);
return new Promise((resolve, reject) => {
checkAsync(from, to, options).then((resolver) => {
if (!resolver) {
resolver = options.conflictSettings || {
mode: interfaces_1.EResolve.THIS,
overwrite: interfaces_1.EResolveMode.OVERWRITE
};
}
else {
if (resolver.mode === interfaces_1.EResolve.ALWAYS) {
options.conflictSettings = resolver;
}
}
let overwriteMode = resolver.overwrite;
let result = void 0;
if (options && options.flags && options.flags & interfaces_1.ECopyFlags.REPORT) {
result = [];
}
// call onConflict to eventually throw an error
overwriteMode = onConflict(from, to, options, resolver);
// now evaluate the copy conflict settings and eventually abort
if (options && options.conflictSettings && !resolveConflict(from, to, options, overwriteMode)) {
return resolve();
}
// feature: clean before
if (options && options.flags & interfaces_1.ECopyFlags.EMPTY) {
const dstStat = fs.statSync(to);
if (dstStat.isDirectory()) {
(0, remove_1.sync)(to);
}
}
// walker variables
const visitorArgs = {
resolve: resolve,
reject: reject,
abort: false,
filesInProgress: 0,
resolveSettings: resolver,
options: options,
result: result,
nodes: [],
onCopyErrorResolveSettings: null
};
const nodes = visitorArgs.nodes;
// a function called when the treeWalkerStream or visitor has been finished
const process = function () {
visitorArgs.nodes = nodes;
if (isDone(nodes)) {
return resolve(result);
}
if (nodes.length) {
const item = next(nodes);
if (item) {
visitor(item.path, item.dst, visitorArgs, item).then(process);
}
}
};
let flags = interfaces_1.EInspectFlags.MODE;
if (options && options.flags && options.flags & interfaces_1.ECopyFlags.FOLLOW_SYMLINKS) {
flags |= interfaces_1.EInspectFlags.SYMLINKS;
}
(0, iterator_1.async)(from, {
filter: options.filter,
flags: flags
}).then((it) => {
let node = null;
while (node = it.next()) {
nodes.push({
path: node.path,
item: node.item,
dst: pathUtil.resolve(to, pathUtil.relative(from, node.path)),
status: interfaces_1.ENodeOperationStatus.COLLECTED
});
}
process();
});
}).catch(reject);
});
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29weS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInNyYy9jb3B5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBNENBLHNDQWdCQztBQXFJRCxvQkFxQ0M7QUFtSEQsNENBc0JDO0FBa0NELDBDQTZCQztBQTBKRCxzQkFtRkM7QUEzcEJELGlDQUFrQztBQUNsQyx5QkFBeUI7QUFDekIsMkJBQW9GO0FBQ3BGLG1DQUF3QztBQUV4QyxxQ0FBb0U7QUFDcEUsNkNBQW9EO0FBQ3BELHVDQUE2RDtBQUM3RCxxREFBNkQ7QUFDN0QsK0NBQXFFO0FBQ3JFLG1DQUE0QztBQUM1QyxxQ0FBaUU7QUFDakUsNkNBZW1DO0FBRW5DLHVDQUF1QztBQUN2QyxxQ0FBMEM7QUFDMUMsMkNBQXdDO0FBQ3hDLHlDQUFvRDtBQUdwRCxNQUFNLGVBQWUsR0FBRyxJQUFBLHFCQUFTLEVBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxxQkFBUyxFQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNoRCxNQUFNLGNBQWMsR0FBRyxJQUFBLHFCQUFTLEVBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVDLE1BQU0sY0FBYyxHQUFHLElBQUEscUJBQVMsRUFBd0IsYUFBTSxDQUFDLENBQUM7QUFFaEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFNUMsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsMERBQTBEO0FBRW5HLFNBQWdCLGFBQWEsQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxFQUFVLEVBQUUsT0FBc0I7SUFDakcsTUFBTSxlQUFlLEdBQUcsVUFBVSxHQUFHLHVCQUF1QixDQUFDO0lBQzdELElBQUEsMkJBQWdCLEVBQUMsZUFBZSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQzVELElBQUEsMkJBQWdCLEVBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3hELElBQUEsMEJBQWUsRUFBQyxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRTtRQUNwRCxTQUFTLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDdEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLGlCQUFpQixDQUFDO1FBQ3ZDLFFBQVEsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUN0QixPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDckIsYUFBYSxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzNCLGdCQUFnQixFQUFFLENBQUMsVUFBVSxDQUFDO1FBQzlCLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO1FBQzVCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUNwQixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7UUFDbEIsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDO0tBQ2pCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQW1CLEVBQUUsSUFBWSxFQUFnQixFQUFFO0lBQ3hFLE1BQU0sSUFBSSxHQUFpQixPQUFPLElBQUksRUFBa0IsQ0FBQztJQUN6RCxNQUFNLGFBQWEsR0FBaUIsRUFBRSxDQUFDO0lBQ3ZDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN6QyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ2pELGFBQWEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNyQyxhQUFhLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ3ZELGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDdkQsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ2pDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxhQUFhLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDbkQsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLGFBQWEsQ0FBQyxNQUFNLEdBQUcsSUFBQSxnQkFBTyxFQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckQsQ0FBQzthQUFNLENBQUM7WUFDUCxhQUFhLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDM0IsT0FBTyxJQUFJLENBQUM7WUFDYixDQUFDLENBQUM7UUFDSCxDQUFDO0lBQ0YsQ0FBQztJQUNELE9BQU8sYUFBYSxDQUFDO0FBQ3RCLENBQUMsQ0FBQztBQUNGLDREQUE0RDtBQUM1RCxPQUFPO0FBQ1AsNERBQTREO0FBQzVELE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBVSxFQUFFLFVBQXdCLEVBQUUsRUFBRSxFQUFFO0lBQ3hGLElBQUksQ0FBQyxJQUFBLGFBQVUsRUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBQSx3QkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLElBQUEsYUFBVSxFQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sSUFBQSw2QkFBb0IsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDO0FBRUYsS0FBSyxVQUFVLHdCQUF3QixDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsVUFBd0IsRUFBRTtJQUMzRixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMzQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBUyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNmLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDRixDQUFDLENBQUM7UUFDRixNQUFNLEVBQUUsR0FBRyxJQUFBLHFCQUFnQixFQUFDLElBQUksQ0FBQztZQUNoQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV4QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUM7WUFDcEIsTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSTtZQUM5QixJQUFJLEVBQUUsR0FBRztTQUNULENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDNUIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN4QyxLQUFLLEdBQUcsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7WUFDaEMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLEVBQUUsR0FBRyxJQUFBLHNCQUFpQixFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN2QixDQUFDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsWUFBWSxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsSUFBWSxFQUFFLE9BQXNCO0lBQ3pGLElBQUksSUFBSSxHQUFHLElBQUEsaUJBQVksRUFBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLFlBQVksR0FBa0I7UUFDbkMsSUFBSSxFQUFFLElBQUk7S0FDVixDQUFDO0lBRUYsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDNUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNaLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDYixDQUFDO0lBQ0YsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBQSxvQkFBVSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxNQUFNLHdCQUF3QixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkQsQ0FBQztTQUFNLENBQUM7UUFDUCxJQUFBLFlBQVMsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDRixDQUFDO0FBQ0QsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBVSxFQUFFLEVBQUU7SUFDcEQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUM7UUFDSixJQUFBLGdCQUFXLEVBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2Qsd0VBQXdFO1FBQ3hFLGtGQUFrRjtRQUNsRixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDM0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQixXQUFXO1lBQ1gsRUFBRSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQzthQUFNLENBQUM7WUFDUCxNQUFNLEdBQUcsQ0FBQztRQUNYLENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQyxDQUFDO0FBRUYsS0FBSyxVQUFVLFlBQVksQ0FBQyxJQUFZLEVBQUUsV0FBa0IsRUFBRSxFQUFVLEVBQUUsT0FBcUI7SUFDOUYsTUFBTSxJQUFJLEdBQVcsSUFBQSx3QkFBUSxFQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssc0JBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN4QyxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNoRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNaLEVBQUUsR0FBRyxNQUFNLENBQUE7WUFDWixDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUEsYUFBTSxFQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssc0JBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFlBQVksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM1QyxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLHNCQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbkQsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7WUFDL0MsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWixFQUFFLEdBQUcsTUFBTSxDQUFBO1lBQ1osQ0FBQztRQUNGLENBQUM7UUFDRCxlQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLENBQUM7QUFDRixDQUFDO0FBQ0QsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsT0FBc0I7SUFDcEUsTUFBTSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUN4Qyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFBO0lBQ3ZDLE1BQU0sS0FBSyxHQUFzQixFQUFFLENBQUE7SUFDbkMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO0lBQ2pCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNqRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9CLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDM0IsSUFBQSxhQUFNLEVBQUMsRUFBRSxDQUFDLENBQUE7UUFDWCxDQUFDO0lBQ0YsQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxNQUFNLE9BQU8sR0FBRyxDQUFDLElBQVksRUFBRSxXQUFrQixFQUFFLEVBQUU7UUFDcEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDVixJQUFJLEVBQUUsSUFBSTtnQkFDVixJQUFJLEVBQUUsV0FBVztnQkFDakIsR0FBRyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ3hELENBQUMsQ0FBQztZQUNILFNBQVMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQy9CLENBQUM7SUFDRixDQUFDLENBQUM7SUFFRixJQUFBLGtCQUFjLEVBQUMsSUFBSSxFQUFFO1FBQ3BCLGNBQWMsRUFBRTtZQUNmLElBQUksRUFBRSxJQUFJO1lBQ1YsUUFBUSxFQUFFLElBQUk7U0FDZDtLQUNELEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFWixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQzNCLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQTtRQUNyRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7UUFDckUsQ0FBQztJQUNGLENBQUMsQ0FBQyxDQUFBO0FBQ0gsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxRQUFRO0FBQ1IsNERBQTREO0FBRTVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsSUFBa0IsRUFBb0MsRUFBRTtJQUNyRyxPQUFPLElBQUEsY0FBVyxFQUFDLElBQUksQ0FBQztTQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBQSx3QkFBZSxFQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7YUFBTSxDQUFDO1lBQ1AsT0FBTyxJQUFBLGNBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUN4QixDQUFDO0lBQ0YsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1FBQ3RCLElBQUksY0FBYyxFQUFFLENBQUM7WUFDcEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDM0IsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLElBQUEsb0JBQVUsRUFBQyxFQUFFLENBQUMsRUFBRSxtQkFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6RSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBMkIsRUFBRSxFQUFFO29CQUM1QyxRQUFRLENBQUMsS0FBSyxHQUFHLG1CQUFNLENBQUMsTUFBTSxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLE9BQU8sQ0FBQztZQUNoQixDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxJQUFBLDZCQUFvQixFQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsSUFBUyxFQUFFLE9BQXNCLEVBQUUsY0FBd0IsRUFBRSxFQUFFO0lBQy9HLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDdEMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM3RCxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMvQixXQUFXLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQW1CLEVBQUUsRUFBRTtZQUMvQyxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZDLHlEQUF5RDtZQUN6RCxvQ0FBb0M7WUFDcEMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxtQkFBTSxDQUFDLFFBQVEsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2xFLDREQUE0RDtnQkFDNUQsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO29CQUN6QyxnRUFBZ0U7b0JBQ2hFLHVFQUF1RTtvQkFDdkUsaUNBQWlDO29CQUNqQyxhQUFhLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQzt5QkFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQzt5QkFDYixLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2pCLENBQUMsQ0FBQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNQLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNiLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRTtZQUM3QiwwQkFBMEI7WUFDMUIsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyx1QkFBVSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFtQixFQUFFLEVBQVUsRUFBRSxFQUFFO29CQUNwRCxJQUFJLEdBQUcsRUFBRSxDQUFDO3dCQUNULE1BQU0sR0FBRyxDQUFDO29CQUNYLENBQUM7b0JBQ0QsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQzNELElBQUksSUFBSSxFQUFFLENBQUM7NEJBQ1YsTUFBTSxJQUFJLENBQUM7d0JBQ1osQ0FBQzt3QkFDRCxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDbkIsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNaLENBQUMsQ0FBQyxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNQLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLENBQUM7UUFDRixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3BDLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsYUFBYSxJQUFJLElBQUksR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3BFLGNBQWMsR0FBRyxRQUFRLENBQUM7Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUk7Z0JBQzlCLElBQUksRUFBRSxHQUFHLENBQUMsNEJBQTRCO2FBQ3RDLENBQUMsQ0FBQztZQUNILElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN6QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7WUFDZCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDM0IsY0FBYyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDeEMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDeEMsS0FBSyxHQUFHLENBQUMsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDO2dCQUNoQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFdBQVcsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6RSxDQUFDO1lBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDSCxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNQLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFDRixTQUFnQixnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsRUFBVTtJQUN4RCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQztTQUMzQixJQUFJLENBQUMsQ0FBQyxlQUF1QixFQUFFLEVBQUU7UUFDakMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxlQUFlLENBQUMsZUFBZSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUM7aUJBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUM7aUJBQ2IsS0FBSyxDQUFDLENBQUMsR0FBbUIsRUFBRSxFQUFFO2dCQUM5QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssbUJBQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEMsd0VBQXdFO29CQUN4RSxrRkFBa0Y7b0JBQ2xGLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDO3dCQUN2QixXQUFXO3lCQUNWLElBQUksQ0FBQyxHQUFHLEVBQUU7d0JBQ1YsT0FBTyxlQUFlLENBQUMsZUFBZSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDbkQsQ0FBQyxDQUFDO3lCQUNELElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3pCLENBQUM7cUJBQU0sQ0FBQztvQkFDUCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2IsQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLGFBQWEsR0FBRyxDQUFDLElBQVksRUFBRSxXQUFrQixFQUFFLEVBQVUsRUFBRSxPQUFxQixFQUFnQixFQUFFO0lBQzNHLE1BQU0sSUFBSSxHQUFHLElBQUEsd0JBQVEsRUFBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDdkMsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLHNCQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEMsT0FBTyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDMUMsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxzQkFBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hELE9BQU8sYUFBYSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQzlDLENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssc0JBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuRCxPQUFPLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBQ0QseUJBQXlCO0lBQ3pCLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ3pCLENBQUMsQ0FBQTtBQUNELDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsT0FBcUIsRUFBRSxRQUEyQixFQUE0QixFQUFFO0lBQzdILFFBQVEsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVCLEtBQUsseUJBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLE1BQU0sSUFBQSw2QkFBb0IsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsS0FBSyx5QkFBWSxDQUFDLFNBQVMsQ0FBQztRQUM1QixLQUFLLHlCQUFZLENBQUMsTUFBTSxDQUFDO1FBQ3pCLEtBQUsseUJBQVksQ0FBQyxRQUFRLENBQUM7UUFDM0IsS0FBSyx5QkFBWSxDQUFDLEtBQUssQ0FBQztRQUN4QixLQUFLLHlCQUFZLENBQUMsZUFBZSxDQUFDO1FBQ2xDLEtBQUsseUJBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNULE9BQU8sU0FBUyxDQUFDO1FBQ2xCLENBQUM7SUFDRixDQUFDO0FBQ0YsQ0FBQyxDQUFDO0FBRUYsU0FBZ0IsZUFBZSxDQUFDLElBQVksRUFBRSxFQUFVLEVBQUUsT0FBcUIsRUFBRSxXQUF5QjtJQUN6RyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUMvQixPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFBLG9CQUFVLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsTUFBTSxHQUFHLEdBQUcsSUFBQSxvQkFBVSxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLElBQUksV0FBVyxLQUFLLHlCQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUM7SUFDZCxDQUFDO1NBQU0sSUFBSSxXQUFXLEtBQUsseUJBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNsRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssc0JBQVMsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxzQkFBUyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlELE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDekQsT0FBTyxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0YsQ0FBQztTQUFNLElBQUksV0FBVyxLQUFLLHlCQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekQsMkZBQTJGO1FBQzNGLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxzQkFBUyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLHNCQUFTLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDOUQsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO2FBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLHNCQUFTLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssc0JBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2RSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMzQixPQUFPLEtBQUssQ0FBQztZQUNkLENBQUM7UUFDRixDQUFDO0lBQ0YsQ0FBQztTQUFNLElBQUksV0FBVyxLQUFLLHlCQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO1NBQU0sSUFBSSxXQUFXLEtBQUsseUJBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQyxPQUFPLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDRixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBd0I7SUFDdkMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUF3QixFQUFFLEVBQUU7UUFDMUMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGlDQUFvQixDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xELElBQUksR0FBRyxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLElBQUksQ0FBQztBQUNiLENBQUM7QUFDRDs7Ozs7Ozs7R0FRRztBQUNILEtBQUssVUFBVSxPQUFPLENBQUMsSUFBWSxFQUFFLEVBQVUsRUFBRSxJQUFrQixFQUFFLElBQXFCO0lBQ3pGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDN0IsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxRQUFnQixDQUFDO0lBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNYLE9BQU87SUFDUixDQUFDO0lBQ0QsR0FBRyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQ0FBb0IsQ0FBQyxVQUFVLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsaUNBQW9CLENBQUMsSUFBSSxDQUFDO1FBQ3hDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEMsQ0FBQztJQUNGLENBQUMsQ0FBQztJQUNGLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUNELElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDO0lBQzFCLHdDQUF3QztJQUN4QyxNQUFNLE9BQU8sR0FBRyxDQUFDLGtCQUFxQyxFQUFFLEVBQUU7UUFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQ0FBb0IsQ0FBQyxPQUFPLENBQUM7UUFDM0MsbUJBQW1CO1FBQ25CLElBQUksa0JBQWtCLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyx1QkFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hGLElBQUksQ0FBQyxNQUF3QixDQUFDLElBQUksQ0FBQztnQkFDbkMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEtBQUs7Z0JBQy9CLElBQUksRUFBRSxJQUFJO2dCQUNWLFFBQVEsRUFBRSxrQkFBa0I7YUFDYixDQUFDLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixnRkFBZ0Y7WUFDaEYsd0NBQXdDO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLElBQUksS0FBSyxxQkFBUSxDQUFDLE1BQU0sQ0FBQztZQUMzRCxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztZQUMvQyxDQUFDO1lBQ0QsSUFBSSxhQUFhLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDO1lBQ2pELGFBQWEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixDQUFDLENBQUM7WUFFN0UsSUFBSSxhQUFhLEtBQUsseUJBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1IsQ0FBQztZQUVELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25FLElBQUksRUFBRSxDQUFDO2dCQUNQLE9BQU87WUFDUixDQUFDO1FBRUYsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLEdBQUcsaUNBQW9CLENBQUMsT0FBTyxDQUFDO1FBQzNDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDaEUsSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7WUFDMUIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ2xHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdkIsQ0FBQztZQUNGLENBQUM7WUFDRCxJQUFJLEVBQUUsQ0FBQztRQUNSLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQW1CLEVBQUUsRUFBRTtZQUNoQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLG1CQUFNLENBQUMsVUFBVSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssbUJBQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDcEUsT0FBTyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBQSxvQkFBVSxFQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxvQkFBdUMsRUFBRSxFQUFFO3dCQUNwSCwyRUFBMkU7d0JBQzNFLElBQUksSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7NEJBQ3JDLG9CQUFvQixHQUFHLElBQUksQ0FBQywwQkFBMEIsQ0FBQzt3QkFDeEQsQ0FBQzt3QkFDRCxxRkFBcUY7d0JBQ3JGLElBQUksb0JBQW9CLENBQUMsSUFBSSxLQUFLLHFCQUFRLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7NEJBQ3ZGLElBQUksQ0FBQywwQkFBMEIsR0FBRyxvQkFBb0IsQ0FBQzt3QkFDeEQsQ0FBQzt3QkFFRCxJQUFJLG9CQUFvQixDQUFDLFNBQVMsS0FBSyx5QkFBWSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs0QkFDbEIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3ZCLENBQUM7d0JBQ0QsSUFBSSxvQkFBb0IsQ0FBQyxTQUFTLEtBQUsseUJBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDM0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7NEJBQ2xCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDekIsQ0FBQzt3QkFDRCxJQUFJLG9CQUFvQixDQUFDLFNBQVMsS0FBSyx5QkFBWSxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUMxRCxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQzt3QkFDM0IsQ0FBQzt3QkFFRCw4Q0FBOEM7d0JBQzlDLElBQUksb0JBQW9CLENBQUMsU0FBUyxLQUFLLHlCQUFZLENBQUMsUUFBUTs0QkFDM0Qsb0JBQW9CLENBQUMsU0FBUyxLQUFLLHlCQUFZLENBQUMsZUFBZTs0QkFDL0Qsb0JBQW9CLENBQUMsU0FBUyxLQUFLLHlCQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7NEJBQzVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSwyQkFBYyxDQUFDLDREQUE0RCxHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7d0JBQ2hJLENBQUM7b0JBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osQ0FBQztZQUNGLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDO0lBQ0YsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxLQUF3QjtJQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxpQ0FBb0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN4RCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixDQUFDO0lBQ0YsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2IsQ0FBQztBQWNEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixLQUFLLENBQUMsSUFBWSxFQUFFLEVBQVUsRUFBRSxPQUFzQjtJQUNyRSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0QyxPQUFPLElBQUksT0FBTyxDQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ25ELFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQTJCLEVBQUUsRUFBRTtZQUNsRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2YsUUFBUSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSTtvQkFDdEMsSUFBSSxFQUFFLHFCQUFRLENBQUMsSUFBSTtvQkFDbkIsU0FBUyxFQUFFLHlCQUFZLENBQUMsU0FBUztpQkFDakMsQ0FBQztZQUNILENBQUM7aUJBQU0sQ0FBQztnQkFDUCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUsscUJBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDdkMsT0FBTyxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztnQkFDckMsQ0FBQztZQUNGLENBQUM7WUFDRCxJQUFJLGFBQWEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO1lBQ3ZDLElBQUksTUFBTSxHQUFnQixLQUFLLENBQUMsQ0FBQztZQUVqQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEdBQUcsdUJBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkUsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNiLENBQUM7WUFFRCwrQ0FBK0M7WUFDL0MsYUFBYSxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUV4RCwrREFBK0Q7WUFDL0QsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQy9GLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUNELHdCQUF3QjtZQUN4QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLHVCQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQzNCLElBQUEsYUFBTSxFQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLENBQUM7WUFDRixDQUFDO1lBQ0QsbUJBQW1CO1lBQ25CLE1BQU0sV0FBVyxHQUFpQjtnQkFDakMsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxLQUFLO2dCQUNaLGVBQWUsRUFBRSxDQUFDO2dCQUNsQixlQUFlLEVBQUUsUUFBUTtnQkFDekIsT0FBTyxFQUFFLE9BQU87Z0JBQ2hCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLEtBQUssRUFBRSxFQUFFO2dCQUNULDBCQUEwQixFQUFFLElBQUk7YUFDaEMsQ0FBQztZQUNGLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDaEMsMkVBQTJFO1lBQzNFLE1BQU0sT0FBTyxHQUFHO2dCQUNmLFdBQVcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2dCQUMxQixJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNuQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztnQkFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN6QixJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNWLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0QsQ0FBQztnQkFDRixDQUFDO1lBQ0YsQ0FBQyxDQUFDO1lBRUYsSUFBSSxLQUFLLEdBQWtCLDBCQUFhLENBQUMsSUFBSSxDQUFDO1lBQzlDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLEtBQUssR0FBRyx1QkFBVSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM1RSxLQUFLLElBQUksMEJBQWEsQ0FBQyxRQUFRLENBQUM7WUFDakMsQ0FBQztZQUNELElBQUEsZ0JBQWEsRUFBQyxJQUFJLEVBQUU7Z0JBQ25CLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsS0FBSyxFQUFFLEtBQUs7YUFDWixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBa0MsRUFBRSxFQUFFO2dCQUM5QyxJQUFJLElBQUksR0FBb0IsSUFBSSxDQUFDO2dCQUNqQyxPQUFPLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztvQkFDekIsS0FBSyxDQUFDLElBQUksQ0FBQzt3QkFDVixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7d0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO3dCQUNmLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7d0JBQzdELE1BQU0sRUFBRSxpQ0FBb0IsQ0FBQyxTQUFTO3FCQUN0QyxDQUFDLENBQUM7Z0JBQ0osQ0FBQztnQkFDRCxPQUFPLEVBQUUsQ0FBQztZQUNYLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xCLENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9