@sybil-center/zkc-preparator
Version:
ZKCredential preparator
483 lines • 32.8 kB
JavaScript
import * as u8a from "uint8arrays";
import ieee754 from "ieee754";
function isStr(encoding) {
return (value) => {
const isstr = typeof value === "string";
let result = true;
try {
u8a.fromString(value, encoding);
}
catch (e) {
result = false;
}
return isstr && result;
};
}
function isUint(num) {
const bignum = BigInt(num);
const max = 2n ** bignum - 1n;
return (value) => {
if (typeof value === "number" || typeof value === "bigint") {
const targetNum = typeof value === "number" ? BigInt(value) : value;
return 0n <= targetNum && targetNum <= max;
}
return false;
};
}
function isInt(num) {
const bignum = BigInt(num);
const max = ((2n ** bignum) / 2n) - 1n;
const min = -((2n ** bignum) / 2n);
return (value) => {
if (typeof value === "number" || typeof value === "bigint") {
const targetNum = typeof value === "number" ? BigInt(value) : value;
return min <= targetNum && targetNum <= max;
}
return false;
};
}
const BASE_NODES = {
utf8: {
name: "utf8",
isType: isStr("utf-8")
},
base64: {
name: "base64",
isType: isStr("base64")
},
base32: {
name: "base32",
isType: isStr("base32upper")
},
base16: {
name: "base16",
isType: isStr("base16upper")
},
base64url: {
name: "base64url",
isType: isStr("base64url")
},
base58: {
name: "base58",
isType: isStr("base58btc")
},
ascii: {
name: "ascii",
isType: isStr("ascii")
},
uint16: {
name: "uint16",
isType: isUint(16)
},
uint32: {
name: "uint32",
isType: isUint(32)
},
uint64: {
name: "uint64",
isType: isUint(64)
},
uint128: {
name: "uint128",
isType: isUint(128)
},
uint256: {
name: "uint256",
isType: isUint(256)
},
int16: {
name: "int16",
isType: isInt(16)
},
int32: {
name: "int32",
isType: isInt(32)
},
int64: {
name: "int64",
isType: isInt(64)
},
int128: {
name: "int128",
isType: isInt(128)
},
int256: {
name: "int256",
isType: isInt(256)
},
float32: {
name: "float32",
isType: (value) => typeof value === "number"
},
boolean: {
name: "boolean",
isType: (value) => typeof value === "boolean"
},
bytes: {
name: "bytes",
isType: (value) => value instanceof Uint8Array
},
uint: {
name: "uint",
isType: (value) => {
if (typeof value === "number") {
return value >= 0 && Number.isInteger(value);
}
return typeof value === "bigint" && value >= 0n;
}
}
};
function defaultLinks() {
return Object
.keys(BASE_NODES)
.reduce((prev, current) => {
if (current.startsWith("int") || current.startsWith("uint")) {
prev[current] = {
inputType: current,
outputType: current,
name: current,
transform: value => BigInt(value)
};
}
else {
prev[current] = {
inputType: current,
outputType: current,
name: current,
transform: value => value
};
}
return prev;
}, {});
}
function toBigInt(bytes) {
let result = BigInt(0);
for (let i = bytes.length - 1; i >= 0; i--) {
result = result * BigInt(256) + BigInt(bytes[i]);
}
return result;
}
function numToBytes(num) {
let target = typeof num === "number" ? BigInt(num) : num;
const bytes = [];
let count = 0;
while (target !== 0n) {
bytes[count] = Number(target % 256n);
count++;
target = target / 256n;
}
return new Uint8Array(bytes);
}
const uints = [
"uint",
"uint16",
"uint32",
"uint64",
"uint128",
"uint256",
];
function bytesToUint() {
return uints.reduce((prev, name) => {
prev[`bytes-${name}`] = {
inputType: "bytes",
outputType: name,
name: `bytes-${name}`,
transform: toBigInt
};
return prev;
}, {});
}
function uintsToBytes() {
return uints.reduce((prev, name) => {
prev[`${name}-bytes`] = {
inputType: name,
outputType: "bytes",
name: `${name}-bytes`,
transform: numToBytes
};
return prev;
}, {});
}
const intsMap = {
int16: { num: 16, bnum: 16n },
int32: { num: 32, bnum: 32n },
int64: { num: 64, bnum: 64n },
int128: { num: 128, bnum: 128n },
int256: { num: 256, bnum: 256n }
};
function bytesToInt() {
return Object.keys(intsMap)
.reduce((prev, name) => {
prev[`bytes-${name}`] = {
inputType: "bytes",
outputType: name,
name: name,
transform: (bytes) => {
const nBits = intsMap[name];
if (bytes.length > nBits.num / 8) {
throw new Error(`Graph transformation bytes-${name} error, more then ${nBits.num} bits`);
}
const max = ((2n ** nBits.bnum) / 2n) - 1n;
const target = toBigInt(bytes);
return target > max ? -(target - max) : target;
}
};
return prev;
}, {});
}
function intsToBytes() {
return Object.keys(intsMap)
.reduce((prev, name) => {
prev[`${name}-bytes`] = {
inputType: name,
outputType: "bytes",
name: `${name}-bytes`,
transform: (value) => {
const num = typeof value === "number" ? BigInt(value) : value;
const nBits = intsMap[name];
const max = ((2n ** nBits.bnum) / 2n) - 1n;
const target = num < 0 ? max + (-num) : num;
return numToBytes(target);
}
};
return prev;
}, {});
}
const encAliases = {
"utf8": "utf8",
"base64": "base64",
"base64url": "base64url",
"base32": "base32upper",
"base16": "base16upper",
"base58": "base58btc",
"ascii": "ascii"
};
function bytesToString() {
return Object.keys(encAliases)
.reduce((prev, name) => {
const encoding = encAliases[name];
prev[`bytes-${name}`] = {
inputType: "bytes",
outputType: name,
name: `bytes-${name}`,
transform: (bytes) => u8a.toString(bytes, encoding)
};
return prev;
}, {});
}
function stringToBytes() {
return Object.keys(encAliases)
.reduce((prev, name) => {
const encoding = encAliases[name];
prev[`${name}-bytes`] = {
inputType: name,
outputType: "bytes",
name: `${name}-bytes`,
transform: (str) => u8a.fromString(str, encoding)
};
return prev;
}, {});
}
function stringsToBoolean() {
return [
"utf8",
"ascii"
].reduce((prev, name) => {
prev[`${name}-boolean`] = {
inputType: name,
outputType: "boolean",
name: `${name}-boolean`,
transform: (str) => {
if (str === "true" || str === "false") {
return str === "true";
}
throw new Error(`For graph link ${name}-boolean value must to be "true" or "false"`);
}
};
return prev;
}, {});
}
function booleanToStrings() {
return [
"utf8",
"ascii"
].reduce((prev, name) => {
prev[`boolean-${name}`] = {
inputType: "boolean",
outputType: name,
name: `boolean-${name}`,
transform: (bool) => bool ? "true" : "false"
};
return prev;
}, {});
}
function booleanToNumbers() {
return uints.concat(Object.keys(intsMap))
.reduce((prev, name) => {
prev[`boolean-${name}`] = {
inputType: "boolean",
outputType: name,
name: `boolean-${name}`,
transform: (bool) => bool ? 1n : 0n
};
return prev;
}, {});
}
function numbersToBoolean() {
return uints.concat(Object.keys(intsMap))
.reduce((prev, name) => {
prev[`${name}-boolean`] = {
inputType: name,
outputType: "boolean",
name: `${name}-boolean`,
transform: (num) => {
const target = typeof num === "number" ? BigInt(num) : num;
if (target === 1n || target === 0n) {
return target === 1n;
}
throw new Error(`For graph link ${name}-boolean ${name} value must be 0 or 1`);
}
};
return prev;
}, {});
}
function stringsToNumbers() {
const result = {};
["utf8", "ascii"].forEach((strName) => {
uints.concat(Object.keys(intsMap))
.forEach((numName) => {
result[`${strName}-${numName}`] = {
inputType: strName,
outputType: numName,
name: `${strName}-${numName}`,
transform: (str) => BigInt(str)
};
});
});
return result;
}
function numbersToStrings() {
const result = {};
["utf8", "ascii"].forEach((strName) => {
uints.concat(Object.keys(intsMap))
.forEach((numName) => {
result[`${numName}-${strName}`] = {
inputType: numName,
outputType: strName,
name: `${numName}-${strName}`,
transform: (value) => {
const target = typeof value === "number" ? BigInt(value) : value;
return target.toString();
}
};
});
});
return result;
}
function stringsToFloat() {
return ["utf8", "ascii"].reduce((prev, name) => {
prev[`${name}-float32`] = {
inputType: name,
outputType: "float32",
name: `${name}-float32`,
transform: (str) => parseFloat(str)
};
return prev;
}, {});
}
function floatToStrings() {
return ["utf8", "ascii"].reduce((prev, name) => {
prev[`float32-${name}`] = {
inputType: "float32",
outputType: name,
name: `float32-${name}`,
transform: (num) => String(num)
};
return prev;
}, {});
}
const BASE_LINKS = {
...defaultLinks(),
...bytesToUint(),
...uintsToBytes(),
...bytesToInt(),
...intsToBytes(),
...bytesToString(),
...stringToBytes(),
...stringsToBoolean(),
...booleanToStrings(),
...booleanToNumbers(),
...numbersToBoolean(),
...stringsToNumbers(),
...numbersToStrings(),
...stringsToFloat(),
...floatToStrings(),
"bytes-float32": {
inputType: "bytes",
outputType: "float32",
name: "bytes-float32",
transform: (bytes) => {
return ieee754.read(bytes, 0, true, 23, 4);
}
},
"float32-bytes": {
inputType: "float32",
outputType: "bytes",
name: "float32-bytes",
transform: (num) => {
const bytes = new Uint8Array(4);
ieee754.write(bytes, num, 0, true, 23, 4);
return bytes;
}
},
};
export class TransformationGraph {
constructor() {
this.nodes = { ...BASE_NODES };
this.links = { ...BASE_LINKS };
}
extend(nodes, links) {
nodes.forEach(node => {
if (this.nodes[node.name]) {
throw new Error(`Node with name "${node.name}" already exists in transformation graph`);
}
this.nodes[node.name] = node;
});
links.forEach((link) => {
if (this.links[link.name]) {
throw new Error(`Link with name "${link.name}" already exists in transformation graph`);
}
this.links[link.name] = link;
});
}
transform(value, links) {
let result = value;
links.forEach((link) => {
const targetLink = this.links[link];
if (!targetLink) {
throw new Error(`${link} link is not supported by Transformation Graph`);
}
const { inputType, outputType, transform } = targetLink;
const input = this.nodes[inputType];
if (!input)
throw new Error(`Node with name ${inputType} not supported`);
const output = this.nodes[outputType];
if (!output)
throw new Error(`Node with mat ${outputType} not supported`);
if (!input.isType(result)) {
throw new Error(`Invalid transformation, input type ${input.name} is not matched to value`);
}
result = transform(result);
if (!output.isType(result)) {
throw new Error(`Invalid transformation, output type ${output.name} is not matched to value`);
}
});
return result;
}
toLastNode(links) {
const lastLink = links[links.length - 1];
const lastType = this.links[lastLink].outputType;
return this.nodes[lastType];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFOUIsU0FBUyxLQUFLLENBQUMsUUFBZ0M7SUFDN0MsT0FBTyxDQUFDLEtBQVUsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSTtZQUNGLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ3pCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxHQUFXO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUM5QixPQUFPLENBQUMsS0FBVSxFQUFXLEVBQUU7UUFDN0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzFELE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDcEUsT0FBTyxFQUFFLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxHQUFHLENBQUM7U0FDNUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLEtBQUssQ0FBQyxHQUFXO0lBQ3hCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN2QyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDbkMsT0FBTyxDQUFDLEtBQVUsRUFBVyxFQUFFO1FBQzdCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3BFLE9BQU8sR0FBRyxJQUFJLFNBQVMsSUFBSSxTQUFTLElBQUksR0FBRyxDQUFDO1NBQzdDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBZUQsTUFBTSxVQUFVLEdBQThCO0lBQzVDLElBQUksRUFBRTtRQUNKLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUM7S0FDdkI7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsUUFBUTtRQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDO0tBQ3hCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQztLQUM3QjtJQUNELE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUM7S0FDN0I7SUFDRCxTQUFTLEVBQUU7UUFDVCxJQUFJLEVBQUUsV0FBVztRQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQztLQUMzQjtJQUNELE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFLEtBQUssQ0FBQyxXQUFXLENBQUM7S0FDM0I7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsT0FBTztRQUNiLE1BQU0sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO0tBQ3ZCO0lBQ0QsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztLQUNuQjtJQUNELE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7S0FDbkI7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsUUFBUTtRQUNkLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO0tBQ25CO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQztLQUNwQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDcEI7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsT0FBTztRQUNiLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO0tBQ2xCO0lBQ0QsS0FBSyxFQUFFO1FBQ0wsSUFBSSxFQUFFLE9BQU87UUFDYixNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztLQUNsQjtJQUNELEtBQUssRUFBRTtRQUNMLElBQUksRUFBRSxPQUFPO1FBQ2IsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7S0FDbEI7SUFDRCxNQUFNLEVBQUU7UUFDTixJQUFJLEVBQUUsUUFBUTtRQUNkLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDO0tBQ25CO0lBQ0QsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQztLQUNuQjtJQUNELE9BQU8sRUFBRTtRQUNQLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRO0tBRWxEO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFNBQVM7S0FDbkQ7SUFDRCxLQUFLLEVBQUU7UUFDTCxJQUFJLEVBQUUsT0FBTztRQUNiLE1BQU0sRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsS0FBSyxZQUFZLFVBQVU7S0FDcEQ7SUFDRCxJQUFJLEVBQUU7UUFDSixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3JCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO2dCQUM3QixPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QztZQUNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDbEQsQ0FBQztLQUNGO0NBQ0YsQ0FBQztBQUVGLFNBQVMsWUFBWTtJQUNuQixPQUFPLE1BQU07U0FDVixJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ2hCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4QixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7Z0JBQ2QsU0FBUyxFQUFFLE9BQU87Z0JBQ2xCLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixJQUFJLEVBQUUsT0FBTztnQkFDYixTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2xDLENBQUM7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO2dCQUNkLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixVQUFVLEVBQUUsT0FBTztnQkFDbkIsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSzthQUMxQixDQUFDO1NBQ0g7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsRUFBRSxFQUErQixDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWlCO0lBQ2pDLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUUsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEdBQW9CO0lBQ3RDLElBQUksTUFBTSxHQUFHLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDekQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sTUFBTSxLQUFLLEVBQUUsRUFBRTtRQUNwQixLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyQyxLQUFLLEVBQUUsQ0FBQztRQUNSLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxLQUFLLEdBQUc7SUFDWixNQUFNO0lBQ04sUUFBUTtJQUNSLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7Q0FDVixDQUFDO0FBRUYsU0FBUyxXQUFXO0lBQ2xCLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNqQyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHO1lBQ3RCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLElBQUksRUFBRSxTQUFTLElBQUksRUFBRTtZQUNyQixTQUFTLEVBQUUsUUFBUTtTQUNwQixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBK0IsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLFlBQVk7SUFDbkIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pDLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUc7WUFDdEIsU0FBUyxFQUFFLElBQUk7WUFDZixVQUFVLEVBQUUsT0FBTztZQUNuQixJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVE7WUFDckIsU0FBUyxFQUFFLFVBQVU7U0FDdEIsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQStCLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQWtEO0lBQzdELEtBQUssRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtJQUM3QixLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUU7SUFDN0IsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO0lBQzdCLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtJQUNoQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7Q0FDakMsQ0FBQztBQUVGLFNBQVMsVUFBVTtJQUNqQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3hCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNyQixJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxHQUFHO1lBQ3RCLFNBQVMsRUFBRSxPQUFPO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLElBQUksRUFBRSxJQUFJO1lBQ1YsU0FBUyxFQUFFLENBQUMsS0FBaUIsRUFBRSxFQUFFO2dCQUMvQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFFLENBQUM7Z0JBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRTtvQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxxQkFBcUIsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7aUJBQzFGO2dCQUNELE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixPQUFPLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxDQUFDO1NBQ0YsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQStCLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsU0FBUyxXQUFXO0lBQ2xCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDeEIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxHQUFHLElBQUksUUFBUSxDQUFDLEdBQUc7WUFDdEIsU0FBUyxFQUFFLElBQUk7WUFDZixVQUFVLEVBQUUsT0FBTztZQUNuQixJQUFJLEVBQUUsR0FBRyxJQUFJLFFBQVE7WUFDckIsU0FBUyxFQUFFLENBQUMsS0FBc0IsRUFBYyxFQUFFO2dCQUNoRCxNQUFNLEdBQUcsR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2dCQUM5RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFFLENBQUM7Z0JBQzdCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDM0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUM1QyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1QixDQUFDO1NBQ0YsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQStCLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLEdBQTJDO0lBQ3pELE1BQU0sRUFBRSxNQUFNO0lBQ2QsUUFBUSxFQUFFLFFBQVE7SUFDbEIsV0FBVyxFQUFFLFdBQVc7SUFDeEIsUUFBUSxFQUFFLGFBQWE7SUFDdkIsUUFBUSxFQUFFLGFBQWE7SUFDdkIsUUFBUSxFQUFFLFdBQVc7SUFDckIsT0FBTyxFQUFFLE9BQU87Q0FDakIsQ0FBQztBQUVGLFNBQVMsYUFBYTtJQUNwQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQzNCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNyQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsR0FBRztZQUN0QixTQUFTLEVBQUUsT0FBTztZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQixJQUFJLEVBQUUsU0FBUyxJQUFJLEVBQUU7WUFDckIsU0FBUyxFQUFFLENBQUMsS0FBaUIsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1NBQ2hFLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsRUFBRSxFQUErQixDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELFNBQVMsYUFBYTtJQUNwQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQzNCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNyQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLEdBQUcsSUFBSSxRQUFRLENBQUMsR0FBRztZQUN0QixTQUFTLEVBQUUsSUFBSTtZQUNmLFVBQVUsRUFBRSxPQUFPO1lBQ25CLElBQUksRUFBRSxHQUFHLElBQUksUUFBUTtZQUNyQixTQUFTLEVBQUUsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztTQUMxRCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBK0IsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxTQUFTLGdCQUFnQjtJQUN2QixPQUFPO1FBQ0wsTUFBTTtRQUNOLE9BQU87S0FDUixDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN0QixJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHO1lBQ3hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsVUFBVSxFQUFFLFNBQVM7WUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO2dCQUN6QixJQUFJLEdBQUcsS0FBSyxNQUFNLElBQUksR0FBRyxLQUFLLE9BQU8sRUFBRTtvQkFDckMsT0FBTyxHQUFHLEtBQUssTUFBTSxDQUFDO2lCQUN2QjtnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixJQUFJLDZDQUE2QyxDQUFDLENBQUM7WUFDdkYsQ0FBQztTQUNGLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsRUFBRSxFQUErQixDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQVMsZ0JBQWdCO0lBQ3ZCLE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTztLQUNSLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3RCLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLEdBQUc7WUFDeEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsSUFBSSxFQUFFLFdBQVcsSUFBSSxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLElBQWEsRUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU87U0FDOUQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQStCLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLEdBQUc7WUFDeEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsSUFBSSxFQUFFLFdBQVcsSUFBSSxFQUFFO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLElBQWEsRUFBVSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDckQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxFQUFFLEVBQXlCLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsU0FBUyxnQkFBZ0I7SUFDdkIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3JCLElBQUksQ0FBQyxHQUFHLElBQUksVUFBVSxDQUFDLEdBQUc7WUFDeEIsU0FBUyxFQUFFLElBQUk7WUFDZixVQUFVLEVBQUUsU0FBUztZQUNyQixJQUFJLEVBQUUsR0FBRyxJQUFJLFVBQVU7WUFDdkIsU0FBUyxFQUFFLENBQUMsR0FBb0IsRUFBVyxFQUFFO2dCQUMzQyxNQUFNLE1BQU0sR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO2dCQUMzRCxJQUFJLE1BQU0sS0FBSyxFQUFFLElBQUksTUFBTSxLQUFLLEVBQUUsRUFBRTtvQkFDbEMsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDO2lCQUN0QjtnQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixJQUFJLFlBQVksSUFBSSx1QkFBdUIsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7U0FDRixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBK0IsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxTQUFTLGdCQUFnQjtJQUN2QixNQUFNLE1BQU0sR0FBOEIsRUFBRSxDQUFDO0lBQzdDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3BDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQixPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuQixNQUFNLENBQUMsR0FBRyxPQUFPLElBQUksT0FBTyxFQUFFLENBQUMsR0FBRztnQkFDaEMsU0FBUyxFQUFFLE9BQU87Z0JBQ2xCLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksT0FBTyxFQUFFO2dCQUM3QixTQUFTLEVBQUUsQ0FBQyxHQUFXLEVBQVUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDaEQsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxnQkFBZ0I7SUFDdkIsTUFBTSxNQUFNLEdBQThCLEVBQUUsQ0FBQztJQUM3QyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNwQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDL0IsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxDQUFDLEdBQUcsT0FBTyxJQUFJLE9BQU8sRUFBRSxDQUFDLEdBQUc7Z0JBQ2hDLFNBQVMsRUFBRSxPQUFPO2dCQUNsQixVQUFVLEVBQUUsT0FBTztnQkFDbkIsSUFBSSxFQUFFLEdBQUcsT0FBTyxJQUFJLE9BQU8sRUFBRTtnQkFDN0IsU0FBUyxFQUFFLENBQUMsS0FBc0IsRUFBVSxFQUFFO29CQUM1QyxNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUNqRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQzthQUNGLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsY0FBYztJQUNyQixPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUM3QyxJQUFJLENBQUMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHO1lBQ3hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsVUFBVSxFQUFFLFNBQVM7WUFDckIsSUFBSSxFQUFFLEdBQUcsSUFBSSxVQUFVO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLEdBQVcsRUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztTQUNwRCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLEVBQUUsRUFBK0IsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLGNBQWM7SUFDckIsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDN0MsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsR0FBRztZQUN4QixTQUFTLEVBQUUsU0FBUztZQUNwQixVQUFVLEVBQUUsSUFBSTtZQUNoQixJQUFJLEVBQUUsV0FBVyxJQUFJLEVBQUU7WUFDdkIsU0FBUyxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ3hDLENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUMsRUFBRSxFQUErQixDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUE4QjtJQUM1QyxHQUFHLFlBQVksRUFBRTtJQUNqQixHQUFHLFdBQVcsRUFBRTtJQUNoQixHQUFHLFlBQVksRUFBRTtJQUNqQixHQUFHLFVBQVUsRUFBRTtJQUNmLEdBQUcsV0FBVyxFQUFFO0lBQ2hCLEdBQUcsYUFBYSxFQUFFO0lBQ2xCLEdBQUcsYUFBYSxFQUFFO0lBQ2xCLEdBQUcsZ0JBQWdCLEVBQUU7SUFDckIsR0FBRyxnQkFBZ0IsRUFBRTtJQUNyQixHQUFHLGdCQUFnQixFQUFFO0lBQ3JCLEdBQUcsZ0JBQWdCLEVBQUU7SUFDckIsR0FBRyxnQkFBZ0IsRUFBRTtJQUNyQixHQUFHLGdCQUFnQixFQUFFO0lBQ3JCLEdBQUcsY0FBYyxFQUFFO0lBQ25CLEdBQUcsY0FBYyxFQUFFO0lBQ25CLGVBQWUsRUFBRTtRQUNmLFNBQVMsRUFBRSxPQUFPO1FBQ2xCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLElBQUksRUFBRSxlQUFlO1FBQ3JCLFNBQVMsRUFBRSxDQUFDLEtBQWlCLEVBQVUsRUFBRTtZQUN2QyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7S0FDRjtJQUNELGVBQWUsRUFBRTtRQUNmLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLElBQUksRUFBRSxlQUFlO1FBQ3JCLFNBQVMsRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxQyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRjtDQUNGLENBQUM7QUFPRixNQUFNLE9BQU8sbUJBQW1CO0lBQWhDO1FBRW1CLFVBQUssR0FBRyxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDMUIsVUFBSyxHQUFHLEVBQUUsR0FBRyxVQUFVLEVBQUUsQ0FBQztJQStDN0MsQ0FBQztJQTdDQyxNQUFNLENBQUMsS0FBa0IsRUFBRSxLQUFrQjtRQUMzQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxJQUFJLDBDQUEwQyxDQUFDLENBQUM7YUFDekY7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLElBQUksMENBQTBDLENBQUMsQ0FBQzthQUN6RjtZQUNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQXdCLEtBQVUsRUFBRSxLQUFlO1FBQzFELElBQUksTUFBTSxHQUFRLEtBQUssQ0FBQztRQUN4QixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDckIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLGdEQUFnRCxDQUFDLENBQUM7YUFDMUU7WUFDRCxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxVQUFVLENBQUM7WUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMsS0FBSztnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixTQUFTLGdCQUFnQixDQUFDLENBQUM7WUFDekUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsTUFBTTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixVQUFVLGdCQUFnQixDQUFDLENBQUM7WUFFMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLEtBQUssQ0FBQyxJQUFJLDBCQUEwQixDQUFDLENBQUM7YUFDN0Y7WUFDRCxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxNQUFNLENBQUMsSUFBSSwwQkFBMEIsQ0FBQyxDQUFDO2FBQy9GO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWU7UUFDeEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFFLENBQUM7UUFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUUsQ0FBQyxVQUFVLENBQUM7UUFDbEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7Q0FFRiJ9