@jsenv/terminal-recorder
Version:
Record terminal output as .svg, .gif, .webm, .mp4
389 lines (370 loc) • 106 kB
JavaScript
/*
on veut pouvoir:
- mettre le terminal dans un "fake terminal" genre
avec le style de celui svg
- enregister une vidéo du terminal
ça faut que je regarde les apis canvas
https://github.com/welefen/canvas2video/blob/master/src/index.ts
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/captureStream
https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder
https://webglfundamentals.org/webgl/lessons/webgl-tips.html
https://github.com/xtermjs/xterm.js/blob/master/typings/xterm.d.ts
*/
import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-fit/lib/addon-fit.js?v=0.10.0";
import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js?as_js_module&v=0.13.0";
// see https://github.com/microsoft/playwright/issues/30585 which is a problem for mac os 14
import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js?v=0.18.0"; // https://github.com/xtermjs/xterm.js/tree/master/addons/addon-webgl
import "/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/lib/xterm.js?v=5.5.0";
import { createGifEncoder } from "/gif_encoder.js";
const { Terminal } = window;
const { FitAddon } = window.FitAddon;
const { WebglAddon } = window.WebglAddon;
const { SerializeAddon } = window.SerializeAddon;
export const initTerminal = ({
cols = 80,
rows = 25,
paddingLeft = 15,
paddingRight = 15,
fontFamily = "SauceCodePro Nerd Font, Source Code Pro, Courier",
fontSize = 12,
convertEol = true,
textInViewport,
gif,
video,
logs,
}) => {
if (textInViewport === true) textInViewport = {};
if (gif === true) gif = {};
if (video === true) video = {};
if (!textInViewport && !video && !gif) {
throw new Error("ansi, video or gif must be enabled");
}
const log = (...args) => {
if (logs) {
console.log(...args);
}
};
log("init", { cols, rows, fontFamily, fontSize, convertEol, gif, video });
const cssUrl = new URL("/@fs/Users/dmail/Documents/dev/jsenv/core/node_modules/@xterm/xterm/css/xterm.css?v=5.5.0", import.meta.url);
const link = document.createElement("link");
link.rel = "stylesheet";
link.href = cssUrl;
document.head.appendChild(link);
const term = new Terminal({
convertEol,
disableStdin: true,
// cursorBlink: false,
cursorInactiveStyle: "none",
cols,
rows,
fontFamily,
fontSize,
// lineHeight: 18,
theme: {
background: "#282c34",
foreground: "#abb2bf",
selectionBackground: "#001122",
selectionForeground: "#777777",
brightRed: "#B22222",
brightBlue: "#87CEEB",
},
});
const serializeAddon = new SerializeAddon();
term.loadAddon(serializeAddon);
const fitAddon = new FitAddon();
term.loadAddon(fitAddon);
const webglAddon = new WebglAddon(
// we pass true to enable preserveDrawingBuffer
// it's not actually useful thanks to term.write callback +
// call on _innerRefresh() before context.drawImage
// but let's keep it nevertheless
true,
);
term.loadAddon(webglAddon);
const terminalElement = document.querySelector("#terminal");
term.open(terminalElement);
fitAddon.fit();
const canvas = document.querySelector("#canvas");
if (!canvas) {
throw new Error('Cannot find <canvas id="canvas"> in the document');
}
const xTermCanvasSelector = "#terminal canvas.xterm-link-layer + canvas";
const xtermCanvas = document.querySelector(xTermCanvasSelector);
if (!xtermCanvas) {
throw new Error(`Cannot find xterm canvas (${xTermCanvasSelector})`);
}
return {
term,
startRecording: async () => {
const context = canvas.getContext("2d", { willReadFrequently: true });
context.imageSmoothingEnabled = true;
const headerHeight = 40;
canvas.width = paddingLeft + xtermCanvas.width + paddingRight;
canvas.height = headerHeight + xtermCanvas.height;
draw_header: {
drawRectangle(context, {
x: 0,
y: 0,
width: canvas.width,
height: canvas.height,
fill: "#282c34",
stroke: "rgba(255,255,255,0.35)",
strokeWidth: 10,
radius: 8,
});
drawCircle(context, {
x: 20,
y: headerHeight / 2,
radius: 6,
fill: "#ff5f57",
});
drawCircle(context, {
x: 40,
y: headerHeight / 2,
radius: 6,
fill: "#febc2e",
});
drawCircle(context, {
x: 60,
y: headerHeight / 2,
radius: 6,
fill: "#28c840",
});
// https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Drawing_text
const text = "Terminal";
context.font = `${fontSize}px ${fontFamily}`;
context.textBaseline = "middle";
context.textAlign = "center";
// const textSize = context.measureText(text);
context.fillStyle = "#abb2bf";
context.fillText(text, canvas.width / 2, headerHeight / 2);
}
const records = {};
let writePromise = Promise.resolve();
const frameCallbackSet = new Set();
const stopCallbackSet = new Set();
if (textInViewport) {
log("start recording text in viewport");
// https://github.com/xtermjs/xterm.js/issues/3681
// https://github.com/xtermjs/xterm.js/issues/3681
// get the first line
// term.buffer.active.getLine(term.buffer.active.viewportY).translateToString()
// get the last line
// term.buffer.active.getLine(term.buffer.active.length -1).translateToString()
// https://github.com/xtermjs/xterm.js/blob/a7952ff36c60ee6dce9141744b1355a5d582ee39/addons/addon-serialize/src/SerializeAddon.ts
stopCallbackSet.add(() => {
const startY = term.buffer.active.viewportY;
const endY = term.buffer.active.length - 1;
const range = {
start: startY,
end: endY,
};
log(`lines in viewport: ${startY}:${endY}`);
const output = serializeAddon.serialize({
range,
});
log(`text in viewport: ${output}`);
records.textInViewport = output;
});
}
if (video) {
log("start recording video");
const { mimeType = "video/webm;codecs=h264", msAddedAtTheEnd } = video;
if (!MediaRecorder.isTypeSupported(mimeType)) {
throw new Error(`MediaRecorder does not support "${mimeType}"`);
}
const stream = canvas.captureStream();
const mediaRecorder = new MediaRecorder(stream, {
videoBitsPerSecond: 2_500_000,
mimeType,
});
const chunks = [];
mediaRecorder.ondataavailable = (e) => {
if (e.data && e.data.size) {
chunks.push(e.data);
}
};
log("starting media recorder");
const startPromise = new Promise((resolve, reject) => {
mediaRecorder.onstart = () => {
resolve();
};
mediaRecorder.onerror = (e) => {
log("media recorder error");
reject(e);
};
mediaRecorder.start();
});
let timeout;
let hasTimedout = false;
const MS_ALLOCATED_TO_MEDIA_RECORDER = 2_000;
await Promise.race([
startPromise,
new Promise((resolve) => {
timeout = setTimeout(() => {
hasTimedout = true;
resolve();
}, MS_ALLOCATED_TO_MEDIA_RECORDER);
}),
]);
if (hasTimedout) {
throw new Error(
`media recorder did not start in less than ${MS_ALLOCATED_TO_MEDIA_RECORDER}ms`,
);
}
clearTimeout(timeout);
log("media recorder started");
stopCallbackSet.add(async () => {
if (msAddedAtTheEnd) {
await new Promise((resolve) => {
setTimeout(resolve, msAddedAtTheEnd);
});
replicateXterm();
} else {
replicateXterm();
}
await new Promise((resolve) => {
setTimeout(resolve, 150);
});
await new Promise((resolve, reject) => {
mediaRecorder.onstop = () => {
resolve();
};
mediaRecorder.onerror = (e) => {
reject(e);
};
mediaRecorder.stop();
});
const blob = new Blob(chunks, { type: mediaRecorder.mimeType });
const videoBinaryString = await new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.onerror = reject;
reader.readAsBinaryString(blob);
});
records.video = videoBinaryString;
});
}
if (gif) {
log("start recording gif");
const { repeat = -1, quality, msAddedAtTheEnd } = gif;
const gifEncoder = createGifEncoder({
width: canvas.width,
height: canvas.height,
repeat: repeat === true ? 0 : repeat === false ? -1 : repeat,
quality,
});
frameCallbackSet.add(({ delay }) => {
log(`add frame to gif with delay of ${delay}ms`);
gifEncoder.addFrame(context, { delay });
});
stopCallbackSet.add(async () => {
const now = Date.now();
drawFrame({
delay: now - previousTime,
});
if (msAddedAtTheEnd) {
drawFrame({
delay: now - msAddedAtTheEnd,
});
}
gifEncoder.finish();
log("gif recording stopped");
const gifBinaryString = gifEncoder.readAsBinaryString();
records.gif = gifBinaryString;
});
log("gif recorder started");
}
const startTime = Date.now();
let previousTime = startTime;
let isFirstDraw = true;
const drawFrame = (options) => {
for (const frameCallback of frameCallbackSet) {
frameCallback(options);
}
};
const replicateXterm = () => {
context.drawImage(
xtermCanvas,
0,
0,
xtermCanvas.width,
xtermCanvas.height,
paddingLeft,
headerHeight,
xtermCanvas.width,
xtermCanvas.height,
);
};
replicateXterm();
return {
writeIntoTerminal: async (data, options = {}) => {
if (isFirstDraw) {
isFirstDraw = false;
drawFrame({ delay: 0 });
}
let { delay } = options;
if (delay === undefined) {
const now = Date.now();
delay = now - previousTime;
}
writePromise = new Promise((resolve) => {
log(`write data:`, data);
term.write(data, () => {
term._core._renderService._renderDebouncer._innerRefresh();
replicateXterm();
drawFrame({ delay });
resolve();
});
});
await writePromise;
},
stopRecording: async () => {
await writePromise;
const promises = [];
for (const stopCallback of stopCallbackSet) {
promises.push(stopCallback());
}
await Promise.all(promises);
return records;
},
};
},
};
};
const drawRectangle = (
context,
{ x, y, width, height, radius, fill, stroke, strokeWidth },
) => {
context.beginPath();
if (radius) {
context.roundRect(x, y, width, height, [radius]);
} else {
context.rect(x, y, width, height);
}
if (fill) {
context.fillStyle = fill;
context.fill();
}
if (stroke) {
context.strokeWidth = strokeWidth;
context.strokeStyle = stroke;
context.stroke();
}
};
const drawCircle = (context, { x, y, radius, fill, stroke, borderWidth }) => {
context.beginPath();
context.arc(x, y, radius, 0, 2 * Math.PI, false);
if (fill) {
context.fillStyle = fill;
context.fill();
}
if (borderWidth) {
context.lineWidth = 5;
}
if (stroke) {
context.strokeStyle = stroke;
context.stroke();
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZpbGU6Ly8vVXNlcnMvZG1haWwvRG9jdW1lbnRzL2Rldi9qc2Vudi9jb3JlL3BhY2thZ2VzL3Rvb2xpbmcvdGVybWluYWwtcmVjb3JkZXIvc3JjL2NsaWVudC90ZXJtaW5hbF9yZWNvcmRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxub24gdmV1dCBwb3V2b2lyOlxuLSBtZXR0cmUgbGUgdGVybWluYWwgZGFucyB1biBcImZha2UgdGVybWluYWxcIiBnZW5yZVxuYXZlYyBsZSBzdHlsZSBkZSBjZWx1aSBzdmdcbi0gZW5yZWdpc3RlciB1bmUgdmlkw6lvIGR1IHRlcm1pbmFsXG7Dp2EgZmF1dCBxdWUgamUgcmVnYXJkZSBsZXMgYXBpcyBjYW52YXNcblxuaHR0cHM6Ly9naXRodWIuY29tL3dlbGVmZW4vY2FudmFzMnZpZGVvL2Jsb2IvbWFzdGVyL3NyYy9pbmRleC50c1xuaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxDYW52YXNFbGVtZW50L2NhcHR1cmVTdHJlYW1cbmh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9NZWRpYVJlY29yZGVyXG5odHRwczovL3dlYmdsZnVuZGFtZW50YWxzLm9yZy93ZWJnbC9sZXNzb25zL3dlYmdsLXRpcHMuaHRtbFxuaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvYmxvYi9tYXN0ZXIvdHlwaW5ncy94dGVybS5kLnRzXG4qL1xuXG5pbXBvcnQgXCJAeHRlcm0vYWRkb24tZml0XCI7XG5pbXBvcnQgXCJAeHRlcm0vYWRkb24tc2VyaWFsaXplP2FzX2pzX21vZHVsZVwiO1xuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvMzA1ODUgd2hpY2ggaXMgYSBwcm9ibGVtIGZvciBtYWMgb3MgMTRcbmltcG9ydCBcIkB4dGVybS9hZGRvbi13ZWJnbFwiOyAvLyBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy90cmVlL21hc3Rlci9hZGRvbnMvYWRkb24td2ViZ2xcbmltcG9ydCBcIkB4dGVybS94dGVybVwiO1xuaW1wb3J0IHsgY3JlYXRlR2lmRW5jb2RlciB9IGZyb20gXCIuL2dpZl9lbmNvZGVyLmpzXCI7XG5cbmNvbnN0IHsgVGVybWluYWwgfSA9IHdpbmRvdztcbmNvbnN0IHsgRml0QWRkb24gfSA9IHdpbmRvdy5GaXRBZGRvbjtcbmNvbnN0IHsgV2ViZ2xBZGRvbiB9ID0gd2luZG93LldlYmdsQWRkb247XG5jb25zdCB7IFNlcmlhbGl6ZUFkZG9uIH0gPSB3aW5kb3cuU2VyaWFsaXplQWRkb247XG5cbmV4cG9ydCBjb25zdCBpbml0VGVybWluYWwgPSAoe1xuICBjb2xzID0gODAsXG4gIHJvd3MgPSAyNSxcbiAgcGFkZGluZ0xlZnQgPSAxNSxcbiAgcGFkZGluZ1JpZ2h0ID0gMTUsXG4gIGZvbnRGYW1pbHkgPSBcIlNhdWNlQ29kZVBybyBOZXJkIEZvbnQsIFNvdXJjZSBDb2RlIFBybywgQ291cmllclwiLFxuICBmb250U2l6ZSA9IDEyLFxuICBjb252ZXJ0RW9sID0gdHJ1ZSxcbiAgdGV4dEluVmlld3BvcnQsXG4gIGdpZixcbiAgdmlkZW8sXG4gIGxvZ3MsXG59KSA9PiB7XG4gIGlmICh0ZXh0SW5WaWV3cG9ydCA9PT0gdHJ1ZSkgdGV4dEluVmlld3BvcnQgPSB7fTtcbiAgaWYgKGdpZiA9PT0gdHJ1ZSkgZ2lmID0ge307XG4gIGlmICh2aWRlbyA9PT0gdHJ1ZSkgdmlkZW8gPSB7fTtcbiAgaWYgKCF0ZXh0SW5WaWV3cG9ydCAmJiAhdmlkZW8gJiYgIWdpZikge1xuICAgIHRocm93IG5ldyBFcnJvcihcImFuc2ksIHZpZGVvIG9yIGdpZiBtdXN0IGJlIGVuYWJsZWRcIik7XG4gIH1cblxuICBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChsb2dzKSB7XG4gICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICB9XG4gIH07XG5cbiAgbG9nKFwiaW5pdFwiLCB7IGNvbHMsIHJvd3MsIGZvbnRGYW1pbHksIGZvbnRTaXplLCBjb252ZXJ0RW9sLCBnaWYsIHZpZGVvIH0pO1xuXG4gIGNvbnN0IGNzc1VybCA9IG5ldyBVUkwoXCJAeHRlcm0veHRlcm0vY3NzL3h0ZXJtLmNzc1wiLCBpbXBvcnQubWV0YS51cmwpO1xuICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gIGxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XG4gIGxpbmsuaHJlZiA9IGNzc1VybDtcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcblxuICBjb25zdCB0ZXJtID0gbmV3IFRlcm1pbmFsKHtcbiAgICBjb252ZXJ0RW9sLFxuICAgIGRpc2FibGVTdGRpbjogdHJ1ZSxcbiAgICAvLyBjdXJzb3JCbGluazogZmFsc2UsXG4gICAgY3Vyc29ySW5hY3RpdmVTdHlsZTogXCJub25lXCIsXG4gICAgY29scyxcbiAgICByb3dzLFxuICAgIGZvbnRGYW1pbHksXG4gICAgZm9udFNpemUsXG4gICAgLy8gbGluZUhlaWdodDogMTgsXG4gICAgdGhlbWU6IHtcbiAgICAgIGJhY2tncm91bmQ6IFwiIzI4MmMzNFwiLFxuICAgICAgZm9yZWdyb3VuZDogXCIjYWJiMmJmXCIsXG4gICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiBcIiMwMDExMjJcIixcbiAgICAgIHNlbGVjdGlvbkZvcmVncm91bmQ6IFwiIzc3Nzc3N1wiLFxuICAgICAgYnJpZ2h0UmVkOiBcIiNCMjIyMjJcIixcbiAgICAgIGJyaWdodEJsdWU6IFwiIzg3Q0VFQlwiLFxuICAgIH0sXG4gIH0pO1xuICBjb25zdCBzZXJpYWxpemVBZGRvbiA9IG5ldyBTZXJpYWxpemVBZGRvbigpO1xuICB0ZXJtLmxvYWRBZGRvbihzZXJpYWxpemVBZGRvbik7XG4gIGNvbnN0IGZpdEFkZG9uID0gbmV3IEZpdEFkZG9uKCk7XG4gIHRlcm0ubG9hZEFkZG9uKGZpdEFkZG9uKTtcbiAgY29uc3Qgd2ViZ2xBZGRvbiA9IG5ldyBXZWJnbEFkZG9uKFxuICAgIC8vIHdlIHBhc3MgdHJ1ZSB0byBlbmFibGUgcHJlc2VydmVEcmF3aW5nQnVmZmVyXG4gICAgLy8gaXQncyBub3QgYWN0dWFsbHkgdXNlZnVsIHRoYW5rcyB0byB0ZXJtLndyaXRlIGNhbGxiYWNrICtcbiAgICAvLyBjYWxsIG9uIF9pbm5lclJlZnJlc2goKSBiZWZvcmUgY29udGV4dC5kcmF3SW1hZ2VcbiAgICAvLyBidXQgbGV0J3Mga2VlcCBpdCBuZXZlcnRoZWxlc3NcbiAgICB0cnVlLFxuICApO1xuICB0ZXJtLmxvYWRBZGRvbih3ZWJnbEFkZG9uKTtcbiAgY29uc3QgdGVybWluYWxFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN0ZXJtaW5hbFwiKTtcbiAgdGVybS5vcGVuKHRlcm1pbmFsRWxlbWVudCk7XG4gIGZpdEFkZG9uLmZpdCgpO1xuXG4gIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FudmFzXCIpO1xuICBpZiAoIWNhbnZhcykge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmQgPGNhbnZhcyBpZD1cImNhbnZhc1wiPiBpbiB0aGUgZG9jdW1lbnQnKTtcbiAgfVxuICBjb25zdCB4VGVybUNhbnZhc1NlbGVjdG9yID0gXCIjdGVybWluYWwgY2FudmFzLnh0ZXJtLWxpbmstbGF5ZXIgKyBjYW52YXNcIjtcbiAgY29uc3QgeHRlcm1DYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHhUZXJtQ2FudmFzU2VsZWN0b3IpO1xuICBpZiAoIXh0ZXJtQ2FudmFzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB4dGVybSBjYW52YXMgKCR7eFRlcm1DYW52YXNTZWxlY3Rvcn0pYCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRlcm0sXG4gICAgc3RhcnRSZWNvcmRpbmc6IGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIsIHsgd2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlIH0pO1xuICAgICAgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gNDA7XG4gICAgICBjYW52YXMud2lkdGggPSBwYWRkaW5nTGVmdCArIHh0ZXJtQ2FudmFzLndpZHRoICsgcGFkZGluZ1JpZ2h0O1xuICAgICAgY2FudmFzLmhlaWdodCA9IGhlYWRlckhlaWdodCArIHh0ZXJtQ2FudmFzLmhlaWdodDtcbiAgICAgIGRyYXdfaGVhZGVyOiB7XG4gICAgICAgIGRyYXdSZWN0YW5nbGUoY29udGV4dCwge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMCxcbiAgICAgICAgICB3aWR0aDogY2FudmFzLndpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzLmhlaWdodCxcbiAgICAgICAgICBmaWxsOiBcIiMyODJjMzRcIixcbiAgICAgICAgICBzdHJva2U6IFwicmdiYSgyNTUsMjU1LDI1NSwwLjM1KVwiLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAxMCxcbiAgICAgICAgICByYWRpdXM6IDgsXG4gICAgICAgIH0pO1xuICAgICAgICBkcmF3Q2lyY2xlKGNvbnRleHQsIHtcbiAgICAgICAgICB4OiAyMCxcbiAgICAgICAgICB5OiBoZWFkZXJIZWlnaHQgLyAyLFxuICAgICAgICAgIHJhZGl1czogNixcbiAgICAgICAgICBmaWxsOiBcIiNmZjVmNTdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGRyYXdDaXJjbGUoY29udGV4dCwge1xuICAgICAgICAgIHg6IDQwLFxuICAgICAgICAgIHk6IGhlYWRlckhlaWdodCAvIDIsXG4gICAgICAgICAgcmFkaXVzOiA2LFxuICAgICAgICAgIGZpbGw6IFwiI2ZlYmMyZVwiLFxuICAgICAgICB9KTtcbiAgICAgICAgZHJhd0NpcmNsZShjb250ZXh0LCB7XG4gICAgICAgICAgeDogNjAsXG4gICAgICAgICAgeTogaGVhZGVySGVpZ2h0IC8gMixcbiAgICAgICAgICByYWRpdXM6IDYsXG4gICAgICAgICAgZmlsbDogXCIjMjhjODQwXCIsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNfQVBJL1R1dG9yaWFsL0RyYXdpbmdfdGV4dFxuICAgICAgICBjb25zdCB0ZXh0ID0gXCJUZXJtaW5hbFwiO1xuICAgICAgICBjb250ZXh0LmZvbnQgPSBgJHtmb250U2l6ZX1weCAke2ZvbnRGYW1pbHl9YDtcbiAgICAgICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSBcIm1pZGRsZVwiO1xuICAgICAgICBjb250ZXh0LnRleHRBbGlnbiA9IFwiY2VudGVyXCI7XG4gICAgICAgIC8vIGNvbnN0IHRleHRTaXplID0gY29udGV4dC5tZWFzdXJlVGV4dCh0ZXh0KTtcbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBcIiNhYmIyYmZcIjtcbiAgICAgICAgY29udGV4dC5maWxsVGV4dCh0ZXh0LCBjYW52YXMud2lkdGggLyAyLCBoZWFkZXJIZWlnaHQgLyAyKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjb3JkcyA9IHt9O1xuICAgICAgbGV0IHdyaXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgY29uc3QgZnJhbWVDYWxsYmFja1NldCA9IG5ldyBTZXQoKTtcbiAgICAgIGNvbnN0IHN0b3BDYWxsYmFja1NldCA9IG5ldyBTZXQoKTtcbiAgICAgIGlmICh0ZXh0SW5WaWV3cG9ydCkge1xuICAgICAgICBsb2coXCJzdGFydCByZWNvcmRpbmcgdGV4dCBpbiB2aWV3cG9ydFwiKTtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2ODFcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3h0ZXJtanMveHRlcm0uanMvaXNzdWVzLzM2ODFcbiAgICAgICAgLy8gZ2V0IHRoZSBmaXJzdCBsaW5lXG4gICAgICAgIC8vIHRlcm0uYnVmZmVyLmFjdGl2ZS5nZXRMaW5lKHRlcm0uYnVmZmVyLmFjdGl2ZS52aWV3cG9ydFkpLnRyYW5zbGF0ZVRvU3RyaW5nKClcbiAgICAgICAgLy8gZ2V0IHRoZSBsYXN0IGxpbmVcbiAgICAgICAgLy8gdGVybS5idWZmZXIuYWN0aXZlLmdldExpbmUodGVybS5idWZmZXIuYWN0aXZlLmxlbmd0aCAtMSkudHJhbnNsYXRlVG9TdHJpbmcoKVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20veHRlcm1qcy94dGVybS5qcy9ibG9iL2E3OTUyZmYzNmM2MGVlNmRjZTkxNDE3NDRiMTM1NWE1ZDU4MmVlMzkvYWRkb25zL2FkZG9uLXNlcmlhbGl6ZS9zcmMvU2VyaWFsaXplQWRkb24udHNcbiAgICAgICAgc3RvcENhbGxiYWNrU2V0LmFkZCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRZID0gdGVybS5idWZmZXIuYWN0aXZlLnZpZXdwb3J0WTtcbiAgICAgICAgICBjb25zdCBlbmRZID0gdGVybS5idWZmZXIuYWN0aXZlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgY29uc3QgcmFuZ2UgPSB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRZLFxuICAgICAgICAgICAgZW5kOiBlbmRZLFxuICAgICAgICAgIH07XG4gICAgICAgICAgbG9nKGBsaW5lcyBpbiB2aWV3cG9ydDogJHtzdGFydFl9OiR7ZW5kWX1gKTtcbiAgICAgICAgICBjb25zdCBvdXRwdXQgPSBzZXJpYWxpemVBZGRvbi5zZXJpYWxpemUoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbG9nKGB0ZXh0IGluIHZpZXdwb3J0OiAke291dHB1dH1gKTtcbiAgICAgICAgICByZWNvcmRzLnRleHRJblZpZXdwb3J0ID0gb3V0cHV0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh2aWRlbykge1xuICAgICAgICBsb2coXCJzdGFydCByZWNvcmRpbmcgdmlkZW9cIik7XG4gICAgICAgIGNvbnN0IHsgbWltZVR5cGUgPSBcInZpZGVvL3dlYm07Y29kZWNzPWgyNjRcIiwgbXNBZGRlZEF0VGhlRW5kIH0gPSB2aWRlbztcbiAgICAgICAgaWYgKCFNZWRpYVJlY29yZGVyLmlzVHlwZVN1cHBvcnRlZChtaW1lVHlwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lZGlhUmVjb3JkZXIgZG9lcyBub3Qgc3VwcG9ydCBcIiR7bWltZVR5cGV9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdHJlYW0gPSBjYW52YXMuY2FwdHVyZVN0cmVhbSgpO1xuICAgICAgICBjb25zdCBtZWRpYVJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtLCB7XG4gICAgICAgICAgdmlkZW9CaXRzUGVyU2Vjb25kOiAyXzUwMF8wMDAsXG4gICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjaHVua3MgPSBbXTtcbiAgICAgICAgbWVkaWFSZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmRhdGEgJiYgZS5kYXRhLnNpemUpIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKGUuZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBsb2coXCJzdGFydGluZyBtZWRpYSByZWNvcmRlclwiKTtcbiAgICAgICAgY29uc3Qgc3RhcnRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIG1lZGlhUmVjb3JkZXIub25zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG1lZGlhUmVjb3JkZXIub25lcnJvciA9IChlKSA9PiB7XG4gICAgICAgICAgICBsb2coXCJtZWRpYSByZWNvcmRlciBlcnJvclwiKTtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RhcnQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCB0aW1lb3V0O1xuICAgICAgICBsZXQgaGFzVGltZWRvdXQgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgTVNfQUxMT0NBVEVEX1RPX01FRElBX1JFQ09SREVSID0gMl8wMDA7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgICAgc3RhcnRQcm9taXNlLFxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIGhhc1RpbWVkb3V0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSwgTVNfQUxMT0NBVEVEX1RPX01FRElBX1JFQ09SREVSKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSk7XG4gICAgICAgIGlmIChoYXNUaW1lZG91dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBtZWRpYSByZWNvcmRlciBkaWQgbm90IHN0YXJ0IGluIGxlc3MgdGhhbiAke01TX0FMTE9DQVRFRF9UT19NRURJQV9SRUNPUkRFUn1tc2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGxvZyhcIm1lZGlhIHJlY29yZGVyIHN0YXJ0ZWRcIik7XG5cbiAgICAgICAgc3RvcENhbGxiYWNrU2V0LmFkZChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKG1zQWRkZWRBdFRoZUVuZCkge1xuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBtc0FkZGVkQXRUaGVFbmQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXBsaWNhdGVYdGVybSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXBsaWNhdGVYdGVybSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCAxNTApO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIub25zdG9wID0gKCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbWVkaWFSZWNvcmRlci5vbmVycm9yID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIG1lZGlhUmVjb3JkZXIuc3RvcCgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihjaHVua3MsIHsgdHlwZTogbWVkaWFSZWNvcmRlci5taW1lVHlwZSB9KTtcbiAgICAgICAgICBjb25zdCB2aWRlb0JpbmFyeVN0cmluZyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4gcmVzb2x2ZShyZWFkZXIucmVzdWx0KTtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhibG9iKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZWNvcmRzLnZpZGVvID0gdmlkZW9CaW5hcnlTdHJpbmc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGdpZikge1xuICAgICAgICBsb2coXCJzdGFydCByZWNvcmRpbmcgZ2lmXCIpO1xuICAgICAgICBjb25zdCB7IHJlcGVhdCA9IC0xLCBxdWFsaXR5LCBtc0FkZGVkQXRUaGVFbmQgfSA9IGdpZjtcbiAgICAgICAgY29uc3QgZ2lmRW5jb2RlciA9IGNyZWF0ZUdpZkVuY29kZXIoe1xuICAgICAgICAgIHdpZHRoOiBjYW52YXMud2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXMuaGVpZ2h0LFxuICAgICAgICAgIHJlcGVhdDogcmVwZWF0ID09PSB0cnVlID8gMCA6IHJlcGVhdCA9PT0gZmFsc2UgPyAtMSA6IHJlcGVhdCxcbiAgICAgICAgICBxdWFsaXR5LFxuICAgICAgICB9KTtcbiAgICAgICAgZnJhbWVDYWxsYmFja1NldC5hZGQoKHsgZGVsYXkgfSkgPT4ge1xuICAgICAgICAgIGxvZyhgYWRkIGZyYW1lIHRvIGdpZiB3aXRoIGRlbGF5IG9mICR7ZGVsYXl9bXNgKTtcbiAgICAgICAgICBnaWZFbmNvZGVyLmFkZEZyYW1lKGNvbnRleHQsIHsgZGVsYXkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICBzdG9wQ2FsbGJhY2tTZXQuYWRkKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGRyYXdGcmFtZSh7XG4gICAgICAgICAgICBkZWxheTogbm93IC0gcHJldmlvdXNUaW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChtc0FkZGVkQXRUaGVFbmQpIHtcbiAgICAgICAgICAgIGRyYXdGcmFtZSh7XG4gICAgICAgICAgICAgIGRlbGF5OiBub3cgLSBtc0FkZGVkQXRUaGVFbmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2lmRW5jb2Rlci5maW5pc2goKTtcbiAgICAgICAgICBsb2coXCJnaWYgcmVjb3JkaW5nIHN0b3BwZWRcIik7XG4gICAgICAgICAgY29uc3QgZ2lmQmluYXJ5U3RyaW5nID0gZ2lmRW5jb2Rlci5yZWFkQXNCaW5hcnlTdHJpbmcoKTtcbiAgICAgICAgICByZWNvcmRzLmdpZiA9IGdpZkJpbmFyeVN0cmluZztcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZyhcImdpZiByZWNvcmRlciBzdGFydGVkXCIpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IHByZXZpb3VzVGltZSA9IHN0YXJ0VGltZTtcbiAgICAgIGxldCBpc0ZpcnN0RHJhdyA9IHRydWU7XG4gICAgICBjb25zdCBkcmF3RnJhbWUgPSAob3B0aW9ucykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZyYW1lQ2FsbGJhY2sgb2YgZnJhbWVDYWxsYmFja1NldCkge1xuICAgICAgICAgIGZyYW1lQ2FsbGJhY2sob3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlcGxpY2F0ZVh0ZXJtID0gKCkgPT4ge1xuICAgICAgICBjb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgICB4dGVybUNhbnZhcyxcbiAgICAgICAgICAwLFxuICAgICAgICAgIDAsXG4gICAgICAgICAgeHRlcm1DYW52YXMud2lkdGgsXG4gICAgICAgICAgeHRlcm1DYW52YXMuaGVpZ2h0LFxuICAgICAgICAgIHBhZGRpbmdMZWZ0LFxuICAgICAgICAgIGhlYWRlckhlaWdodCxcbiAgICAgICAgICB4dGVybUNhbnZhcy53aWR0aCxcbiAgICAgICAgICB4dGVybUNhbnZhcy5oZWlnaHQsXG4gICAgICAgICk7XG4gICAgICB9O1xuXG4gICAgICByZXBsaWNhdGVYdGVybSgpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZUludG9UZXJtaW5hbDogYXN5bmMgKGRhdGEsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICAgIGlmIChpc0ZpcnN0RHJhdykge1xuICAgICAgICAgICAgaXNGaXJzdERyYXcgPSBmYWxzZTtcbiAgICAgICAgICAgIGRyYXdGcmFtZSh7IGRlbGF5OiAwIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgeyBkZWxheSB9ID0gb3B0aW9ucztcbiAgICAgICAgICBpZiAoZGVsYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgIGRlbGF5ID0gbm93IC0gcHJldmlvdXNUaW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3cml0ZVByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgbG9nKGB3cml0ZSBkYXRhOmAsIGRhdGEpO1xuICAgICAgICAgICAgdGVybS53cml0ZShkYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRlcm0uX2NvcmUuX3JlbmRlclNlcnZpY2UuX3JlbmRlckRlYm91bmNlci5faW5uZXJSZWZyZXNoKCk7XG4gICAgICAgICAgICAgIHJlcGxpY2F0ZVh0ZXJtKCk7XG4gICAgICAgICAgICAgIGRyYXdGcmFtZSh7IGRlbGF5IH0pO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCB3cml0ZVByb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BSZWNvcmRpbmc6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB3cml0ZVByb21pc2U7XG4gICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHN0b3BDYWxsYmFjayBvZiBzdG9wQ2FsbGJhY2tTZXQpIHtcbiAgICAgICAgICAgIHByb21pc2VzLnB1c2goc3RvcENhbGxiYWNrKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZHM7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59O1xuXG5jb25zdCBkcmF3UmVjdGFuZ2xlID0gKFxuICBjb250ZXh0LFxuICB7IHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cywgZmlsbCwgc3Ryb2tlLCBzdHJva2VXaWR0aCB9LFxuKSA9PiB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGlmIChyYWRpdXMpIHtcbiAgICBjb250ZXh0LnJvdW5kUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBbcmFkaXVzXSk7XG4gIH0gZWxzZSB7XG4gICAgY29udGV4dC5yZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICB9XG4gIGlmIChmaWxsKSB7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBmaWxsO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG4gIGlmIChzdHJva2UpIHtcbiAgICBjb250ZXh0LnN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGg7XG4gICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZTtcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xuICB9XG59O1xuY29uc3QgZHJhd0NpcmNsZSA9IChjb250ZXh0LCB7IHgsIHksIHJhZGl1cywgZmlsbCwgc3Ryb2tlLCBib3JkZXJXaWR0aCB9KSA9PiB7XG4gIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gIGNvbnRleHQuYXJjKHgsIHksIHJhZGl1cywgMCwgMiAqIE1hdGguUEksIGZhbHNlKTtcbiAgaWYgKGZpbGwpIHtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGZpbGw7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH1cbiAgaWYgKGJvcmRlcldpZHRoKSB7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSA1O1xuICB9XG4gIGlmIChzdHJva2UpIHtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gc3Ryb2tlO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gIH1cbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQztBQUNELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXJDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDOztBQUVELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsbUdBQWtCO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsNEhBQXFDO0FBQzVDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx1R0FBb0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBGQUFjO0FBQ3JCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFrQjs7QUFFbkQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFaEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNYLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xELENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDLENBQUM7O0FBRUYsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQzs7QUFFSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFM0UsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyRkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRWpDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsRCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVoQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDZixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDOztBQUVGLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1QsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUF