UNPKG

@coon-js/siesta-lib-helper

Version:

Collection of utility- and helper-methods when working with Siesta (https://bryntum.com) in an ExtJS-Browser environment.

233 lines (206 loc) 55.7 kB
const t=e=>"string"==typeof e,r=e=>"object"==typeof e,n=e=>"object"==typeof e&&"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object,o=e=>"function"==typeof e,a=e=>Array.isArray?Array.isArray(e):"[object Array]"===Object.prototype.toString.call(e),c=e=>e instanceof RegExp,m=(e,t)=>{let n=null,o=r(t);return (a(t)?t:o?Object.entries(t):[]).some((t=>o&&t[0]===e?(n=t[1],!0):r(t)&&void 0!==t[e]?(n=t[e],!0):void 0)),n},b=function(e,r,n){if(!t(n))throw new Error('"str" must be a string');return e=[].concat(e),r=t(r)?new Array(e.length).fill(r):[].concat(r),e.forEach(((e,t)=>{n=n.replace(new RegExp(y(e),"g"),r[t]??"");})),n},d=function(e,r,n){if(!t(e)||!t(r)||!r)throw new Error('"str" must be a string');if(n&&!t(n)&&!a(n))throw new Error('"ignore" must be an array or a string');let o=new RegExp(`${y(r)}+`,"gi");if(void 0!==n){(n=(n=[].concat(n)).map((e=>y(e)))).map((t=>{let r=new RegExp(`(${y(t)+"*"})`,"gim");e=e.replace(r,t);})),n=new RegExp(`(${n.join("|")})`,"gim");let t="",i=0,a=[],c=(e,n,c,s)=>{let l=s.substring(i,c).replace(o,r);return a=a.concat([l,n]),i=c+e.length,t=s.substring(i),e};return e.match(n,c)?(e.replace(n,c),a.push(t.replace(o,r)),a.join("")):e.replace(o,r)}return e.replace(o,r)},w=function(e){const t="(?!("+Array.prototype.slice.call(arguments,1).join("|")+"))^",r=new RegExp(t,"g");return null!==e.match(r)};function y(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var j=Object.freeze({__proto__:null,replace:b,unify:d,isNot:w});const _=function(e,t={},r,n=!1){return (e=[].concat(e)).forEach((e=>{const i=e.split("."),a=(t,i)=>{let c;return c=i.shift(),t[c]&&(!0!==n||i.length)||(t[c]=i.length?{}:o(r)?r(e):r),i.length&&a(t[c],i),t};a(t,i);})),t},$=function(e,t,r){for(var n=e.split("."),i=t;void 0!==i&&n.length;)i=i[n.shift()];return o(r)?r(i):void 0===i?r:i},k=function(e){let t=Array.prototype.slice.call(arguments,1);return t=t.map((e=>{if(n(e))return e;if(a(e)){const[t,...r]=e,n=r[0];return Object.fromEntries(Object.entries(t).filter((e=>{let t=e[0];return c(n)?null!==t.match(n):w.apply(j,[t].concat(r))})))}})),Object.assign(e,...t)};async function T(e){let t;try{t=await C(e,{method:"HEAD"}),await t.text();}catch(e){return !1}return 200===t.status}async function z(e){const t=await C(e,{method:"GET"});return await t.text()}async function C(e,r){if(!t(e))throw new Error('"url" must be a string representing the resource location');let n=await fetch(e,r);if(n.status>=400)throw new Error(`Fetching the resource ${e} failed with ${n.status} ${n.statusText}`);return n}const I=e=>e.replace(/^( *)(>+)( >*)*(?!$)/m,(e=>e.replace(/(\s)*(?!$)/g,"")));Object.freeze({__proto__:null,toBlockquote:function(e){let t=(e=>{let t=e.split("\n"),r=[],n=-1,o=null;return t.forEach((e=>{e=I(e),o!==e.indexOf(">")&&n++,o=e.indexOf(">"),r[n]||(r[n]=[]),r[n].push(e);})),r})(e),r=[];return t.forEach((e=>{r.push((e=>{if(0!==e[0].indexOf(">"))return e.join("\n");const t=e=>{"\n"===e[e.length-1]&&e.pop();};let r,n,o=0,i=[];for(e.forEach((e=>{for(n=(e+"").trim().match(/^((>)+) *?(.*?$)/ms),r=n[1].length;r>o;)t(i),o++,i.push("<blockquote>");for(;o>r;)t(i),o--,i.push("</blockquote>");i.push(n[3]),i.push("\n");}));o>0;)t(i),o--,i.push("</blockquote>");return i.join("")})(e));})),r.join("")},toEmailLink:e=>e=e.replace(/[a-zA-Z0-9+._%-]{1,256}@[a-zA-Z0-9][a-zA-Z0-9-]{0,64}(\.[a-zA-Z0-9][a-zA-Z0-9-]{0,25})+/gi,(e=>'<a href="mailto:'+e+'">'+e+"</a>")),toHyperlink:e=>e=e.replace(/(\b(https?):\/\/[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|])/gi,(e=>'<a href="'+e+'">'+e+"</a>")),toLineBreak:e=>e=e.replace(/(\r\n|\n|\r)/gm,(e=>"<br />"))});class R{compile(e,t){}}class S{render(e){}}class Z extends S{constructor(e){if(super(),!o(e))throw new Error('"fn" must be of type "function"');this.fn=e;}render(e){const t=this;try{return t.fn.call({},e)}catch(e){throw new Error(`rendering "data" failed with message ${e.message}`)}}}class B extends R{compile(e,t){t.some((e=>{if(-1!==e.indexOf("-"))throw new Error(`Cannot compile template: Contains invalid key-name: ${e}`)}));const r=this,n=r.getKeys(e),o=r.buildArgumentList(n),i=r.getBlacklistedKeys(o,t||[]);if(i.length)throw new Error(`Cannot compile template: Contains invalid keys: ${i.join(", ")}`);const a=r.getFunctionConfig(o,e),c=r.getNativeFunction(a.args,a.fn);return new Z(c)}buildArgumentList(e){let t=e.map((e=>e.split(/\.|\[/)[0]));return [...new Set(t)]}getKeys(e){const t=/\$\{([^}]+)\}/gm,r=[];let n;for(;null!==(n=t.exec(e));)n.index===t.lastIndex&&t.lastIndex++,n.forEach(((e,t)=>{1===t&&r.push(e);}));return r}getBlacklistedKeys(e,t){return t.length?e.filter((e=>-1===t.indexOf(e))):[]}getFunctionConfig(e,t){return {args:`{${e.join(", ")}}`,fn:`return \`${t}\``}}getNativeFunction(e,t){return new Function(e,t)}}class K{render(e){}}class L extends K{constructor(e){super();this.compiler=new B,this.tpl=e;}render(e){const t=this;let r=Object.keys(e),n=r.join(".");return t.compiledTpls=t.compiledTpls||{},t.compiledTpls[n]||(t.compiledTpls[n]=t.compiler.compile(t.tpl,r)),t.compiledTpls[n].render(e)}}var N=Object.freeze({__proto__:null,StringCompiler:B,StringTemplate:L,make:e=>new L(e),Tpl:Z});Object.freeze({__proto__:null,esix:N,CompiledTpl:S,Compiler:R,Template:K}); /** * coon.js * siesta-lib-helper * Copyright (C) 2021 Thorsten Suckow-Homberg https://github.com/coon-js/siesta-lib-helper * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, * publish, distribute, sublicense, and/or sell copies of the Software, * and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Uses the specified testConfig for teh preLoader-section and applies the related paths found at * pathConfigUrl (config-file url()) to it, then passes it to getPaths() and returns the value. * content found at pathConfigUrl should be in a format @coon-js/extjs-link produces. * * @example * * json at "pathConfigUrl.json": * * { * css: [{ * modern: [ * "foo.css" * ], * classic: [ * "bar.css" * ] * * }], * js: { * modern: "modern.js", * classic: "classic.js" * * } * } * * * const config = { * loaderPath: { * "Ext.Package": "/node_modules/@coon-js/extjs-package-loader/packages/package-loader/src/src/Package.js", * "coon.core": "../src/", * }, * preloads: { * css: [{ * modern: [ * "/node_modules/@sencha/ext-modern-runtime/material/material-all_1.css", * "/node_modules/@sencha/ext-modern-runtime/material/material-all_2.css" * ], * classic: [ * "/node_modules/@sencha/ext-classic-runtime/material/material-all_1.css", * "/node_modules/@sencha/ext-classic-runtime/material/material-all_2.css", * "/node_modules/@sencha/ext-classic-runtime/material/material-all_3.css" * ] * }], * js: [ * "/node_modules/@l8js/l8/dist/l8.runtime.js", { * modern: "/node_modules/@sencha/ext-modern-runtime/modern.engine.enterprise.js", * classic: "/node_modules/@sencha/ext-modern-runtime/classic.engine.enterprise.js" * } * ] * }}; * * configureWithExtJsLinkPaths(config, "pathConfigUrl.json", true); // returns { * // preload : [ * // "foo.css", * // "/node_modules/@l8js/l8/dist/l8.runtime.js", * // "/node_modules/@sencha/ext-modern-runtime/modern.engine.enterprise.js" * // "modern.js" * // ], * // loaderPath : { * // "Ext.Package": "/node_modules/@coon-js/extjs-package-loader/packages/package-loader/src/src/Package.js", * // "coon.core": "../src/" * // } * // }; * * * @param {Object} testConfig * @param {String} pathConfigUrl * @param {Boolean} isModern * @returns {Promise<{loaderPath: {}, preload: *[]}>} */ const configureWithExtJsLinkPaths = async function (testConfig, pathConfigUrl, isModern) { if (await T(pathConfigUrl)) { const extjsLinkConfig = JSON.parse(await z(pathConfigUrl)), mergedCss = {}, mergedJs = {}, collect = (section, toolkit) => { let res = []; section.forEach(entry => { if (t(entry)) { res.push(entry); } else if (n(entry)) { res = res.concat(entry[toolkit] ?? []); } }); return res; }; ["classic", "modern"].forEach(toolkit => { let ff = m.bind(null, toolkit), css = collect([].concat($("preload.css", testConfig)), toolkit), js = collect([].concat($("preload.js", testConfig)), toolkit), extCss = $("css", extjsLinkConfig, ff), extJs = $("js", extjsLinkConfig, ff); _(toolkit, mergedCss, [].concat(css, [].concat(extCss))); _(toolkit, mergedJs, [].concat(js, [].concat(extJs))); }); _("preload.css", testConfig, mergedCss, true); _("preload.js", testConfig, mergedJs, true); } return getPaths(testConfig, isModern); }; /** * Consumes a configuration object and looks up js/css-related path information, * then returns it pre-configured to be used with Siestas Siesta.Harness.Browser.ExtJS()#config. * * @example * * const config = { * loaderPath: { * "Ext.Package": "/node_modules/@coon-js/extjs-package-loader/packages/package-loader/src/src/Package.js", * "coon.core": "../src/", * }, * preloads: { * css: [{ * modern: [ * "/node_modules/@sencha/ext-modern-runtime/material/material-all_1.css", * "/node_modules/@sencha/ext-modern-runtime/material/material-all_2.css" * ], * classic: [ * "/node_modules/@sencha/ext-classic-runtime/material/material-all_1.css", * "/node_modules/@sencha/ext-classic-runtime/material/material-all_2.css", * "/node_modules/@sencha/ext-classic-runtime/material/material-all_3.css" * ] * }], * js: [ * "/node_modules/@l8js/l8/dist/l8.runtime.js", { * modern: "/node_modules/@sencha/ext-modern-runtime/modern.engine.enterprise.js", * classic: "/node_modules/@sencha/ext-modern-runtime/classic.engine.enterprise.js" * } * ] * }}; * * getPaths(config, true); // returns { * // preload : [ * // "/node_modules/@sencha/ext-modern-runtime/material/material-all_1.css", * // "/node_modules/@sencha/ext-modern-runtime/material/material-all_2.css", * // "/node_modules/@l8js/l8/dist/l8.runtime.js", * // "/node_modules/@sencha/ext-modern-runtime/modern.engine.enterprise.js" * // ], * // loaderPath : { * // "Ext.Package": "/node_modules/@coon-js/extjs-package-loader/packages/package-loader/src/src/Package.js", * // "coon.core": "../src/" * // } * // }; * * * */ const getPaths = (config, isModern) => { const result = {preload: [], loaderPath: {}}, isObject = r, isArray = a, isString = t, toolkit = isModern ? "modern" : isModern === false ? "classic" : null, parseSection = (section) => { section = [].concat(section); section.forEach((entry) => { if (isString(entry)) { result.preload.push(entry); } else if (isObject(entry) && toolkit !== null) { if (isArray(entry[toolkit])) { result.preload = result.preload.concat(entry[toolkit]); } else if (isString(entry[toolkit])) { result.preload.push(entry[toolkit]); } } }); }; k( result.loaderPath, [config.loaderPath || {}, "classic", "modern"], config.loaderPath && config.loaderPath[toolkit] ? config.loaderPath[toolkit] : {} ); const {js, css} = config.preload || {}; parseSection(css); parseSection(js); return result; }; export { configureWithExtJsLinkPaths, getPaths }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2llc3RhLWxpYi1oZWxwZXIucnVudGltZS5lc20uanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy9AbDhqcy9sOC9kaXN0L2w4LnBhY2thZ2VzLmVzbS5qcyIsIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZSBmcm9tXCJjcnlwdG8tanMvbWQ1LmpzXCI7Y29uc3QgdD1lPT5cInN0cmluZ1wiPT10eXBlb2YgZSxyPWU9Plwib2JqZWN0XCI9PXR5cGVvZiBlLG49ZT0+XCJvYmplY3RcIj09dHlwZW9mIGUmJlwiW29iamVjdCBPYmplY3RdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkmJmUuY29uc3RydWN0b3I9PT1PYmplY3Qsbz1lPT5cImZ1bmN0aW9uXCI9PXR5cGVvZiBlLGk9ZT0+XCJudW1iZXJcIj09dHlwZW9mIGUsYT1lPT5BcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkoZSk6XCJbb2JqZWN0IEFycmF5XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLGM9ZT0+ZSBpbnN0YW5jZW9mIFJlZ0V4cCxzPWZ1bmN0aW9uKGUpe3JldHVybnthOnQ9PnR5cGVvZiBlPT09dCxvZjp0PT4hIW8odCkmJmUgaW5zdGFuY2VvZiB0fX0sbD17YXBwbHk6KGUsdCxyKT0+KGU9ZS5fX2xpcXVpZF9fP2UoKTplLG8oZS50aGVuKT91KGUudGhlbigoZT0+UmVmbGVjdC5hcHBseShlLHQscikpKSk6dShlLmFwcGx5KHQscikpKSxnZXQ6KGUsdCxyKT0+KGU9ZS5fX2xpcXVpZF9fP2UoKTplLFwidGhlblwiIT09dCYmbyhlLnRoZW4pP3UoZS50aGVuKChlPT5lW3RdLmJpbmQoZSkpKSk6byhlW3RdKT91KGVbdF0uYmluZChlKSk6ZVt0XSl9LHU9ZnVuY3Rpb24oZSl7aWYocihlKSl7Y29uc3QgdD0oKT0+ZTtyZXR1cm4gdC5fX2xpcXVpZF9fPSEwLG5ldyBQcm94eSh0LGwpfXJldHVybiBvKGUpP25ldyBQcm94eShlLGwpOmV9LHA9ZnVuY3Rpb24oZSx0KXt2YXIgcixuLG8saT1bXSxhPVtdO2ZvcigoaT0oaT1lLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUsMTApfSkpKS5maWx0ZXIoKGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gci5pbmRleE9mKGUsMCk9PT10fSkpKS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLXR9KSksbj0ocj1pLmluZGV4T2YocGFyc2VJbnQodCwxMCkpKS0xO24+PTAmJmlbbl09PT1pW24rMV0tMTtuLS0pYS51bnNoaWZ0KGlbbl0pO2ZvcihhLnB1c2goaVtyXSksbj1yKzEsbz1pLmxlbmd0aDtuPG8mJmlbbl09PT1pW24tMV0rMTtuKyspYS5wdXNoKGlbbl0pO3JldHVybiBhfSxmPWZ1bmN0aW9uKGUpe3ZhciB0LHI9W107aWYoIWEoZSkpdGhyb3cgbmV3IEVycm9yKFwiJ2xpc3QnIG11c3QgYmUgYW4gYXJyYXlcIik7cmV0dXJuKHQ9KHQ9ZS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlLDEwKX0pKSkuZmlsdGVyKChmdW5jdGlvbihlLHQscil7cmV0dXJuIHIuaW5kZXhPZihlKT09PXR9KSkpLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUtdH0pKSx0LnJlZHVjZSgoZnVuY3Rpb24oZSx0LG4sbyl7cmV0dXJuIHQ+ZSsxJiZyLnB1c2goW10pLHJbci5sZW5ndGgtMV0ucHVzaCh0KSx0fSksLTEpLHJ9LGg9ZnVuY3Rpb24oZSx0KXtpZighaShlKSl0aHJvdyBuZXcgRXJyb3IoXCInc3RhcnQnIG11c3QgYmUgYSBudW1iZXJcIik7aWYoIWkodCkpdGhyb3cgbmV3IEVycm9yKFwiJ2VuZCcgbXVzdCBiZSBhIG51bWJlclwiKTtpZihlPXBhcnNlSW50KGUsMTApLCh0PXBhcnNlSW50KHQsMTApKTxlKXRocm93IG5ldyBFcnJvcihgXCJlbmRcIiAoJHt0fSkgbXVzdCBiZSBhIG51bWJlciBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gXCJzdGFydFwiICgke2V9KWApO3JldHVybiBuZXcgQXJyYXkodC1lKzEpLmZpbGwodm9pZCAwKS5tYXAoKGZ1bmN0aW9uKCl7cmV0dXJuIGUrK30pKX0sbT0oZSx0KT0+e2xldCBuPW51bGwsbz1yKHQpO3JldHVybihhKHQpP3Q6bz9PYmplY3QuZW50cmllcyh0KTpbXSkuc29tZSgodD0+byYmdFswXT09PWU/KG49dFsxXSwhMCk6cih0KSYmdm9pZCAwIT09dFtlXT8obj10W2VdLCEwKTp2b2lkIDApKSxufSxnPWU9PmUuZmlsdGVyKCgoZSx0LHIpPT5yLmluZGV4T2YoZSk9PT1yLmxhc3RJbmRleE9mKGUpKSksYj1mdW5jdGlvbihlLHIsbil7aWYoIXQobikpdGhyb3cgbmV3IEVycm9yKCdcInN0clwiIG11c3QgYmUgYSBzdHJpbmcnKTtyZXR1cm4gZT1bXS5jb25jYXQoZSkscj10KHIpP25ldyBBcnJheShlLmxlbmd0aCkuZmlsbChyKTpbXS5jb25jYXQociksZS5mb3JFYWNoKCgoZSx0KT0+e249bi5yZXBsYWNlKG5ldyBSZWdFeHAoeShlKSxcImdcIiksclt0XT8/XCJcIil9KSksbn0sZD1mdW5jdGlvbihlLHIsbil7aWYoIXQoZSl8fCF0KHIpfHwhcil0aHJvdyBuZXcgRXJyb3IoJ1wic3RyXCIgbXVzdCBiZSBhIHN0cmluZycpO2lmKG4mJiF0KG4pJiYhYShuKSl0aHJvdyBuZXcgRXJyb3IoJ1wiaWdub3JlXCIgbXVzdCBiZSBhbiBhcnJheSBvciBhIHN0cmluZycpO2xldCBvPW5ldyBSZWdFeHAoYCR7eShyKX0rYCxcImdpXCIpO2lmKHZvaWQgMCE9PW4peyhuPShuPVtdLmNvbmNhdChuKSkubWFwKChlPT55KGUpKSkpLm1hcCgodD0+e2xldCByPW5ldyBSZWdFeHAoYCgke3kodCkrXCIqXCJ9KWAsXCJnaW1cIik7ZT1lLnJlcGxhY2Uocix0KX0pKSxuPW5ldyBSZWdFeHAoYCgke24uam9pbihcInxcIil9KWAsXCJnaW1cIik7bGV0IHQ9XCJcIixpPTAsYT1bXSxjPShlLG4sYyxzKT0+e2xldCBsPXMuc3Vic3RyaW5nKGksYykucmVwbGFjZShvLHIpO3JldHVybiBhPWEuY29uY2F0KFtsLG5dKSxpPWMrZS5sZW5ndGgsdD1zLnN1YnN0cmluZyhpKSxlfTtyZXR1cm4gZS5tYXRjaChuLGMpPyhlLnJlcGxhY2UobixjKSxhLnB1c2godC5yZXBsYWNlKG8scikpLGEuam9pbihcIlwiKSk6ZS5yZXBsYWNlKG8scil9cmV0dXJuIGUucmVwbGFjZShvLHIpfSx3PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9XCIoPyEoXCIrQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLmpvaW4oXCJ8XCIpK1wiKSleXCIscj1uZXcgUmVnRXhwKHQsXCJnXCIpO3JldHVybiBudWxsIT09ZS5tYXRjaChyKX07ZnVuY3Rpb24geShlKXtyZXR1cm4gZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZyxcIlxcXFwkJlwiKX12YXIgaj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxyZXBsYWNlOmIsdW5pZnk6ZCxpc05vdDp3fSk7Y29uc3QgRT1mdW5jdGlvbihlKXtjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIE9iamVjdC5hc3NpZ24odCxlKSx0fSxPPWZ1bmN0aW9uKGUsbixvKXtpZighcihlKXx8T2JqZWN0LmlzRnJvemVuKGUpfHxPYmplY3QuaXNTZWFsZWQoZSkpdGhyb3cgbmV3IEVycm9yKCdcInRhcmdldFwiIG11c3QgYmUgYW4gZXh0ZW5zaWJsZSBvYmplY3QuJyk7Y29uc3QgaT1hcmd1bWVudHMubGVuZ3RoO2lmKG89YXJndW1lbnRzW2ktMV0saTwyKXRocm93IG5ldyBFcnJvcignXCJwcm9wZXJ0eVwiIG11c3QgYmUgYSB2YWxpZCBwcm9wZXJ0eSBuYW1lLicpO2lmKGk+MyYmIXIobykpdGhyb3cgbmV3IEVycm9yKCdcInZhbHVlXCIgbXVzdCBiZSBhbiBvYmplY3QuJyk7aWYoMz09PWkmJmEobikmJiFyKG8pKXRocm93IG5ldyBFcnJvcignXCJ2YWx1ZVwiIG11c3QgYmUgYW4gb2JqZWN0LicpO2xldCBjPWEobikscz1jP246QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cyxbMSxpLTFdKTtyZXR1cm4gcy5mb3JFYWNoKChyPT57aWYoIXQocikpdGhyb3cgbmV3IEVycm9yKCdcInByb3BlcnR5XCIgbXVzdCBiZSBhIHZhbGlkIHByb3BlcnR5IG5hbWUuJyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscix7d3JpdGFibGU6ITEsY29uZmlndXJhYmxlOiExLHZhbHVlOmk+M3x8Yz9vW3JdOm99KX0pKSxlfSx4PWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0oZSxvKT0+KE9iamVjdC5lbnRyaWVzKGUpLm1hcCgoKFtpLGFdKT0+e2NvbnN0IGM9by5jb25jYXQoaSk7ZVtpXT1yKGEpP24oYSxjKTp0KGEsYyl9KSksZSk7cmV0dXJuIG4oZSxbXSksZX0sXz1mdW5jdGlvbihlLHQ9e30scixuPSExKXtyZXR1cm4oZT1bXS5jb25jYXQoZSkpLmZvckVhY2goKGU9Pntjb25zdCBpPWUuc3BsaXQoXCIuXCIpLGE9KHQsaSk9PntsZXQgYztyZXR1cm4gYz1pLnNoaWZ0KCksdFtjXSYmKCEwIT09bnx8aS5sZW5ndGgpfHwodFtjXT1pLmxlbmd0aD97fTpvKHIpP3IoZSk6ciksaS5sZW5ndGgmJmEodFtjXSxpKSx0fTthKHQsaSl9KSksdH0sdj1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwuLi5PYmplY3QuZW50cmllcyhlKS5tYXAoKChbZSx0XSk9Pih7W3RdOmV9KSkpKX0sQT1mdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoZSkuZmlsdGVyKCgoWyxlXSk9PmUhPT10KSkpfSwkPWZ1bmN0aW9uKGUsdCxyKXtmb3IodmFyIG49ZS5zcGxpdChcIi5cIiksaT10O3ZvaWQgMCE9PWkmJm4ubGVuZ3RoOylpPWlbbi5zaGlmdCgpXTtyZXR1cm4gbyhyKT9yKGkpOnZvaWQgMD09PWk/cjppfSxrPWZ1bmN0aW9uKGUpe2xldCB0PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdD10Lm1hcCgoZT0+e2lmKG4oZSkpcmV0dXJuIGU7aWYoYShlKSl7Y29uc3RbdCwuLi5yXT1lLG49clswXTtyZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLmZpbHRlcigoZT0+e2xldCB0PWVbMF07cmV0dXJuIGMobik/bnVsbCE9PXQubWF0Y2gobik6dy5hcHBseShqLFt0XS5jb25jYXQocikpfSkpKX19KSksT2JqZWN0LmFzc2lnbihlLC4uLnQpfTthc3luYyBmdW5jdGlvbiBUKGUpe2xldCB0O3RyeXt0PWF3YWl0IEMoZSx7bWV0aG9kOlwiSEVBRFwifSksYXdhaXQgdC50ZXh0KCl9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuIDIwMD09PXQuc3RhdHVzfWFzeW5jIGZ1bmN0aW9uIHooZSl7Y29uc3QgdD1hd2FpdCBDKGUse21ldGhvZDpcIkdFVFwifSk7cmV0dXJuIGF3YWl0IHQudGV4dCgpfWFzeW5jIGZ1bmN0aW9uIEMoZSxyKXtpZighdChlKSl0aHJvdyBuZXcgRXJyb3IoJ1widXJsXCIgbXVzdCBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlIGxvY2F0aW9uJyk7bGV0IG49YXdhaXQgZmV0Y2goZSxyKTtpZihuLnN0YXR1cz49NDAwKXRocm93IG5ldyBFcnJvcihgRmV0Y2hpbmcgdGhlIHJlc291cmNlICR7ZX0gZmFpbGVkIHdpdGggJHtuLnN0YXR1c30gJHtuLnN0YXR1c1RleHR9YCk7cmV0dXJuIG59Y29uc3QgcT10PT5lKHQpLnRvU3RyaW5nKCksST1lPT5lLnJlcGxhY2UoL14oICopKD4rKSggPiopKig/ISQpL20sKGU9PmUucmVwbGFjZSgvKFxccykqKD8hJCkvZyxcIlwiKSkpO3ZhciBGPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHRvQmxvY2txdW90ZTpmdW5jdGlvbihlKXtsZXQgdD0oZT0+e2xldCB0PWUuc3BsaXQoXCJcXG5cIikscj1bXSxuPS0xLG89bnVsbDtyZXR1cm4gdC5mb3JFYWNoKChlPT57ZT1JKGUpLG8hPT1lLmluZGV4T2YoXCI+XCIpJiZuKyssbz1lLmluZGV4T2YoXCI+XCIpLHJbbl18fChyW25dPVtdKSxyW25dLnB1c2goZSl9KSkscn0pKGUpLHI9W107cmV0dXJuIHQuZm9yRWFjaCgoZT0+e3IucHVzaCgoZT0+e2lmKDAhPT1lWzBdLmluZGV4T2YoXCI+XCIpKXJldHVybiBlLmpvaW4oXCJcXG5cIik7Y29uc3QgdD1lPT57XCJcXG5cIj09PWVbZS5sZW5ndGgtMV0mJmUucG9wKCl9O2xldCByLG4sbz0wLGk9W107Zm9yKGUuZm9yRWFjaCgoZT0+e2ZvcihuPShlK1wiXCIpLnRyaW0oKS5tYXRjaCgvXigoPikrKSAqPyguKj8kKS9tcykscj1uWzFdLmxlbmd0aDtyPm87KXQoaSksbysrLGkucHVzaChcIjxibG9ja3F1b3RlPlwiKTtmb3IoO28+cjspdChpKSxvLS0saS5wdXNoKFwiPC9ibG9ja3F1b3RlPlwiKTtpLnB1c2goblszXSksaS5wdXNoKFwiXFxuXCIpfSkpO28+MDspdChpKSxvLS0saS5wdXNoKFwiPC9ibG9ja3F1b3RlPlwiKTtyZXR1cm4gaS5qb2luKFwiXCIpfSkoZSkpfSkpLHIuam9pbihcIlwiKX0sdG9FbWFpbExpbms6ZT0+ZT1lLnJlcGxhY2UoL1thLXpBLVowLTkrLl8lLV17MSwyNTZ9QFthLXpBLVowLTldW2EtekEtWjAtOS1dezAsNjR9KFxcLlthLXpBLVowLTldW2EtekEtWjAtOS1dezAsMjV9KSsvZ2ksKGU9Pic8YSBocmVmPVwibWFpbHRvOicrZSsnXCI+JytlK1wiPC9hPlwiKSksdG9IeXBlcmxpbms6ZT0+ZT1lLnJlcGxhY2UoLyhcXGIoaHR0cHM/KTpcXC9cXC9bLUEtWjAtOSsmQCMvJT89fl98ITosLjtdKlstQS1aMC05KyZAIy8lPX5ffF0pL2dpLChlPT4nPGEgaHJlZj1cIicrZSsnXCI+JytlK1wiPC9hPlwiKSksdG9MaW5lQnJlYWs6ZT0+ZT1lLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sKGU9PlwiPGJyIC8+XCIpKX0pO2NsYXNzIFJ7Y29tcGlsZShlLHQpe319Y2xhc3MgU3tyZW5kZXIoZSl7fX1jbGFzcyBaIGV4dGVuZHMgU3tjb25zdHJ1Y3RvcihlKXtpZihzdXBlcigpLCFvKGUpKXRocm93IG5ldyBFcnJvcignXCJmblwiIG11c3QgYmUgb2YgdHlwZSBcImZ1bmN0aW9uXCInKTt0aGlzLmZuPWV9cmVuZGVyKGUpe2NvbnN0IHQ9dGhpczt0cnl7cmV0dXJuIHQuZm4uY2FsbCh7fSxlKX1jYXRjaChlKXt0aHJvdyBuZXcgRXJyb3IoYHJlbmRlcmluZyBcImRhdGFcIiBmYWlsZWQgd2l0aCBtZXNzYWdlICR7ZS5tZXNzYWdlfWApfX19Y2xhc3MgQiBleHRlbmRzIFJ7Y29tcGlsZShlLHQpe3Quc29tZSgoZT0+e2lmKC0xIT09ZS5pbmRleE9mKFwiLVwiKSl0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb21waWxlIHRlbXBsYXRlOiBDb250YWlucyBpbnZhbGlkIGtleS1uYW1lOiAke2V9YCl9KSk7Y29uc3Qgcj10aGlzLG49ci5nZXRLZXlzKGUpLG89ci5idWlsZEFyZ3VtZW50TGlzdChuKSxpPXIuZ2V0QmxhY2tsaXN0ZWRLZXlzKG8sdHx8W10pO2lmKGkubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbXBpbGUgdGVtcGxhdGU6IENvbnRhaW5zIGludmFsaWQga2V5czogJHtpLmpvaW4oXCIsIFwiKX1gKTtjb25zdCBhPXIuZ2V0RnVuY3Rpb25Db25maWcobyxlKSxjPXIuZ2V0TmF0aXZlRnVuY3Rpb24oYS5hcmdzLGEuZm4pO3JldHVybiBuZXcgWihjKX1idWlsZEFyZ3VtZW50TGlzdChlKXtsZXQgdD1lLm1hcCgoZT0+ZS5zcGxpdCgvXFwufFxcWy8pWzBdKSk7cmV0dXJuWy4uLm5ldyBTZXQodCldfWdldEtleXMoZSl7Y29uc3QgdD0vXFwkXFx7KFtefV0rKVxcfS9nbSxyPVtdO2xldCBuO2Zvcig7bnVsbCE9PShuPXQuZXhlYyhlKSk7KW4uaW5kZXg9PT10Lmxhc3RJbmRleCYmdC5sYXN0SW5kZXgrKyxuLmZvckVhY2goKChlLHQpPT57MT09PXQmJnIucHVzaChlKX0pKTtyZXR1cm4gcn1nZXRCbGFja2xpc3RlZEtleXMoZSx0KXtyZXR1cm4gdC5sZW5ndGg/ZS5maWx0ZXIoKGU9Pi0xPT09dC5pbmRleE9mKGUpKSk6W119Z2V0RnVuY3Rpb25Db25maWcoZSx0KXtyZXR1cm57YXJnczpgeyR7ZS5qb2luKFwiLCBcIil9fWAsZm46YHJldHVybiBcXGAke3R9XFxgYH19Z2V0TmF0aXZlRnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKGUsdCl9fWNsYXNzIEt7cmVuZGVyKGUpe319Y2xhc3MgTCBleHRlbmRzIEt7Y29uc3RydWN0b3IoZSl7c3VwZXIoKTt0aGlzLmNvbXBpbGVyPW5ldyBCLHRoaXMudHBsPWV9cmVuZGVyKGUpe2NvbnN0IHQ9dGhpcztsZXQgcj1PYmplY3Qua2V5cyhlKSxuPXIuam9pbihcIi5cIik7cmV0dXJuIHQuY29tcGlsZWRUcGxzPXQuY29tcGlsZWRUcGxzfHx7fSx0LmNvbXBpbGVkVHBsc1tuXXx8KHQuY29tcGlsZWRUcGxzW25dPXQuY29tcGlsZXIuY29tcGlsZSh0LnRwbCxyKSksdC5jb21waWxlZFRwbHNbbl0ucmVuZGVyKGUpfX12YXIgTj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxTdHJpbmdDb21waWxlcjpCLFN0cmluZ1RlbXBsYXRlOkwsbWFrZTplPT5uZXcgTChlKSxUcGw6Wn0pLFA9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsZXNpeDpOLENvbXBpbGVkVHBsOlMsQ29tcGlsZXI6UixUZW1wbGF0ZTpLfSk7ZXhwb3J0e2sgYXMgYXNzaWduLF8gYXMgY2hhaW4saCBhcyBjcmVhdGVSYW5nZSxnIGFzIGV4dHJhY3QsbSBhcyBmaW5kRmlyc3QsdiBhcyBmbGlwLGYgYXMgZ3JvdXBJbmRpY2VzLHMgYXMgaXMsYSBhcyBpc0FycmF5LG8gYXMgaXNGdW5jdGlvbix3IGFzIGlzTm90LGkgYXMgaXNOdW1iZXIsciBhcyBpc09iamVjdCxuIGFzIGlzUGxhaW5PYmplY3QsYyBhcyBpc1JlZ0V4cCx0IGFzIGlzU3RyaW5nLHUgYXMgbGlxdWlmeSxwIGFzIGxpc3ROZWlnaGJvdXJzLHogYXMgbG9hZCxPIGFzIGxvY2sscSBhcyBtZDUsRSBhcyBvYmosVCBhcyBwaW5nLEEgYXMgcHVyZ2UsYiBhcyByZXBsYWNlLEMgYXMgcmVxdWVzdCxQIGFzIHRlbXBsYXRlLEYgYXMgdGV4dCwkIGFzIHVuY2hhaW4sZCBhcyB1bmlmeSx4IGFzIHZpc2l0fTtcbiIsIi8qKlxuICogY29vbi5qc1xuICogc2llc3RhLWxpYi1oZWxwZXJcbiAqIENvcHlyaWdodCAoQykgMjAyMSBUaG9yc3RlbiBTdWNrb3ctSG9tYmVyZyBodHRwczovL2dpdGh1Yi5jb20vY29vbi1qcy9zaWVzdGEtbGliLWhlbHBlclxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uXG4gKiBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvblxuICogZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLFxuICogaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSxcbiAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsXG4gKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLFxuICogc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbiAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG4gKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVNcbiAqIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4gKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4gKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCAqIGFzIGw4IGZyb20gXCJAbDhqcy9sOFwiO1xuXG5cbi8qKlxuICogVXNlcyB0aGUgc3BlY2lmaWVkIHRlc3RDb25maWcgZm9yIHRlaCBwcmVMb2FkZXItc2VjdGlvbiBhbmQgYXBwbGllcyB0aGUgcmVsYXRlZCBwYXRocyBmb3VuZCBhdFxuICogcGF0aENvbmZpZ1VybCAoY29uZmlnLWZpbGUgdXJsKCkpIHRvIGl0LCB0aGVuIHBhc3NlcyBpdCB0byBnZXRQYXRocygpIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAqIGNvbnRlbnQgZm91bmQgYXQgcGF0aENvbmZpZ1VybCBzaG91bGQgYmUgaW4gYSBmb3JtYXQgQGNvb24tanMvZXh0anMtbGluayBwcm9kdWNlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqICBqc29uIGF0IFwicGF0aENvbmZpZ1VybC5qc29uXCI6XG4gKlxuICogIHtcbiAqICAgICAgIGNzczogW3tcbiAqICAgICAgICAgICAgICAgbW9kZXJuOiBbXG4gKiAgICAgICAgICAgICAgICAgICBcImZvby5jc3NcIlxuICogICAgICAgICAgICAgICBdLFxuICogICAgICAgICAgICAgICBjbGFzc2ljOiBbXG4gKiAgICAgICAgICAgICAgICAgICBcImJhci5jc3NcIlxuICogICAgICAgICAgICAgICBdXG4gKlxuICogICAgICAgfV0sXG4gKiAgICAgICBqczoge1xuICogICAgICAgICAgICAgICBtb2Rlcm46IFwibW9kZXJuLmpzXCIsXG4gKiAgICAgICAgICAgICAgIGNsYXNzaWM6IFwiY2xhc3NpYy5qc1wiXG4gKlxuICogICAgICB9XG4gKiAgIH1cbiAqXG4gKlxuICogIGNvbnN0IGNvbmZpZyA9IHtcbiAqICAgICAgbG9hZGVyUGF0aDoge1xuICogICAgICAgXCJFeHQuUGFja2FnZVwiOiBcIi9ub2RlX21vZHVsZXMvQGNvb24tanMvZXh0anMtcGFja2FnZS1sb2FkZXIvcGFja2FnZXMvcGFja2FnZS1sb2FkZXIvc3JjL3NyYy9QYWNrYWdlLmpzXCIsXG4gKiAgICAgICBcImNvb24uY29yZVwiOiBcIi4uL3NyYy9cIixcbiAqICAgfSxcbiAqICAgcHJlbG9hZHM6IHtcbiAqICAgICAgIGNzczogW3tcbiAqICAgICAgICAgICAgICAgbW9kZXJuOiBbXG4gKiAgICAgICAgICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtbW9kZXJuLXJ1bnRpbWUvbWF0ZXJpYWwvbWF0ZXJpYWwtYWxsXzEuY3NzXCIsXG4gKiAgICAgICAgICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtbW9kZXJuLXJ1bnRpbWUvbWF0ZXJpYWwvbWF0ZXJpYWwtYWxsXzIuY3NzXCJcbiAqICAgICAgICAgICAgICAgXSxcbiAqICAgICAgICAgICAgICAgY2xhc3NpYzogW1xuICogICAgICAgICAgICAgICAgICAgXCIvbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWNsYXNzaWMtcnVudGltZS9tYXRlcmlhbC9tYXRlcmlhbC1hbGxfMS5jc3NcIixcbiAqICAgICAgICAgICAgICAgICAgIFwiL25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1jbGFzc2ljLXJ1bnRpbWUvbWF0ZXJpYWwvbWF0ZXJpYWwtYWxsXzIuY3NzXCIsXG4gKiAgICAgICAgICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtY2xhc3NpYy1ydW50aW1lL21hdGVyaWFsL21hdGVyaWFsLWFsbF8zLmNzc1wiXG4gKiAgICAgICAgICAgICAgIF1cbiAqICAgICAgIH1dLFxuICogICAgICAganM6IFtcbiAqICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQGw4anMvbDgvZGlzdC9sOC5ydW50aW1lLmpzXCIsIHtcbiAqICAgICAgICAgICAgICAgbW9kZXJuOiBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtbW9kZXJuLXJ1bnRpbWUvbW9kZXJuLmVuZ2luZS5lbnRlcnByaXNlLmpzXCIsXG4gKiAgICAgICAgICAgICAgIGNsYXNzaWM6IFwiL25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1tb2Rlcm4tcnVudGltZS9jbGFzc2ljLmVuZ2luZS5lbnRlcnByaXNlLmpzXCJcbiAqICAgICAgICAgICB9XG4gKiAgICAgICBdXG4gKiAgIH19O1xuICpcbiAqICBjb25maWd1cmVXaXRoRXh0SnNMaW5rUGF0aHMoY29uZmlnLCBcInBhdGhDb25maWdVcmwuanNvblwiLCB0cnVlKTsgLy8gcmV0dXJucyB7XG4gKiAgIC8vICAgcHJlbG9hZCA6IFtcbiAqICAgLy8gICAgICAgXCJmb28uY3NzXCIsXG4gKiAgIC8vICAgICAgIFwiL25vZGVfbW9kdWxlcy9AbDhqcy9sOC9kaXN0L2w4LnJ1bnRpbWUuanNcIixcbiAqICAgLy8gICAgICAgXCIvbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LW1vZGVybi1ydW50aW1lL21vZGVybi5lbmdpbmUuZW50ZXJwcmlzZS5qc1wiXG4gKiAgIC8vICAgICAgIFwibW9kZXJuLmpzXCJcbiAqICAgLy8gICBdLFxuICogICAvLyAgIGxvYWRlclBhdGggOiB7XG4gKiAgIC8vICAgICAgIFwiRXh0LlBhY2thZ2VcIjogXCIvbm9kZV9tb2R1bGVzL0Bjb29uLWpzL2V4dGpzLXBhY2thZ2UtbG9hZGVyL3BhY2thZ2VzL3BhY2thZ2UtbG9hZGVyL3NyYy9zcmMvUGFja2FnZS5qc1wiLFxuICogICAvLyAgICAgICBcImNvb24uY29yZVwiOiBcIi4uL3NyYy9cIlxuICogICAvLyAgIH1cbiAqICAvLyB9O1xuICpcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGVzdENvbmZpZ1xuICogQHBhcmFtIHtTdHJpbmd9IHBhdGhDb25maWdVcmxcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNNb2Rlcm5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHtsb2FkZXJQYXRoOiB7fSwgcHJlbG9hZDogKltdfT59XG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWd1cmVXaXRoRXh0SnNMaW5rUGF0aHMgPSBhc3luYyBmdW5jdGlvbiAodGVzdENvbmZpZywgcGF0aENvbmZpZ1VybCwgaXNNb2Rlcm4pIHtcblxuICAgIGlmIChhd2FpdCBsOC5waW5nKHBhdGhDb25maWdVcmwpKSB7XG5cbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGV4dGpzTGlua0NvbmZpZyA9IEpTT04ucGFyc2UoYXdhaXQgbDgubG9hZChwYXRoQ29uZmlnVXJsKSksXG4gICAgICAgICAgICBtZXJnZWRDc3MgPSB7fSwgbWVyZ2VkSnMgPSB7fSxcbiAgICAgICAgICAgIGNvbGxlY3QgPSAoc2VjdGlvbiwgdG9vbGtpdCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCByZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBzZWN0aW9uLmZvckVhY2goZW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobDguaXNTdHJpbmcoZW50cnkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXMucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobDguaXNQbGFpbk9iamVjdChlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoZW50cnlbdG9vbGtpdF0gPz8gW10pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgW1wiY2xhc3NpY1wiLCBcIm1vZGVyblwiXS5mb3JFYWNoKHRvb2xraXQgPT4ge1xuXG4gICAgICAgICAgICBsZXQgZmYgPSBsOC5maW5kRmlyc3QuYmluZChudWxsLCB0b29sa2l0KSxcbiAgICAgICAgICAgICAgICBjc3MgPSBjb2xsZWN0KFtdLmNvbmNhdChsOC51bmNoYWluKFwicHJlbG9hZC5jc3NcIiwgdGVzdENvbmZpZykpLCB0b29sa2l0KSxcbiAgICAgICAgICAgICAgICBqcyA9IGNvbGxlY3QoW10uY29uY2F0KGw4LnVuY2hhaW4oXCJwcmVsb2FkLmpzXCIsIHRlc3RDb25maWcpKSwgdG9vbGtpdCksXG4gICAgICAgICAgICAgICAgZXh0Q3NzID0gbDgudW5jaGFpbihcImNzc1wiLCBleHRqc0xpbmtDb25maWcsIGZmKSxcbiAgICAgICAgICAgICAgICBleHRKcyA9ICBsOC51bmNoYWluKFwianNcIiwgZXh0anNMaW5rQ29uZmlnLCBmZik7XG5cblxuICAgICAgICAgICAgbDguY2hhaW4odG9vbGtpdCwgbWVyZ2VkQ3NzLCBbXS5jb25jYXQoY3NzLCBbXS5jb25jYXQoZXh0Q3NzKSkpO1xuICAgICAgICAgICAgbDguY2hhaW4odG9vbGtpdCwgbWVyZ2VkSnMsIFtdLmNvbmNhdChqcywgW10uY29uY2F0KGV4dEpzKSkpO1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGw4LmNoYWluKFwicHJlbG9hZC5jc3NcIiwgdGVzdENvbmZpZywgbWVyZ2VkQ3NzLCB0cnVlKTtcbiAgICAgICAgbDguY2hhaW4oXCJwcmVsb2FkLmpzXCIsIHRlc3RDb25maWcsIG1lcmdlZEpzLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0UGF0aHModGVzdENvbmZpZywgaXNNb2Rlcm4pO1xuXG59O1xuXG5cbi8qKlxuICogQ29uc3VtZXMgYSBjb25maWd1cmF0aW9uIG9iamVjdCBhbmQgbG9va3MgdXAganMvY3NzLXJlbGF0ZWQgcGF0aCBpbmZvcm1hdGlvbixcbiAqIHRoZW4gcmV0dXJucyBpdCBwcmUtY29uZmlndXJlZCB0byBiZSB1c2VkIHdpdGggU2llc3RhcyBTaWVzdGEuSGFybmVzcy5Ccm93c2VyLkV4dEpTKCkjY29uZmlnLlxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogIGNvbnN0IGNvbmZpZyA9IHtcbiAqICAgICAgbG9hZGVyUGF0aDoge1xuICogICAgICAgXCJFeHQuUGFja2FnZVwiOiBcIi9ub2RlX21vZHVsZXMvQGNvb24tanMvZXh0anMtcGFja2FnZS1sb2FkZXIvcGFja2FnZXMvcGFja2FnZS1sb2FkZXIvc3JjL3NyYy9QYWNrYWdlLmpzXCIsXG4gKiAgICAgICBcImNvb24uY29yZVwiOiBcIi4uL3NyYy9cIixcbiAqICAgfSxcbiAqICAgcHJlbG9hZHM6IHtcbiAqICAgICAgIGNzczogW3tcbiAqICAgICAgICAgICAgICAgbW9kZXJuOiBbXG4gKiAgICAgICAgICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtbW9kZXJuLXJ1bnRpbWUvbWF0ZXJpYWwvbWF0ZXJpYWwtYWxsXzEuY3NzXCIsXG4gKiAgICAgICAgICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtbW9kZXJuLXJ1bnRpbWUvbWF0ZXJpYWwvbWF0ZXJpYWwtYWxsXzIuY3NzXCJcbiAqICAgICAgICAgICAgICAgXSxcbiAqICAgICAgICAgICAgICAgY2xhc3NpYzogW1xuICogICAgICAgICAgICAgICAgICAgXCIvbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LWNsYXNzaWMtcnVudGltZS9tYXRlcmlhbC9tYXRlcmlhbC1hbGxfMS5jc3NcIixcbiAqICAgICAgICAgICAgICAgICAgIFwiL25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1jbGFzc2ljLXJ1bnRpbWUvbWF0ZXJpYWwvbWF0ZXJpYWwtYWxsXzIuY3NzXCIsXG4gKiAgICAgICAgICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtY2xhc3NpYy1ydW50aW1lL21hdGVyaWFsL21hdGVyaWFsLWFsbF8zLmNzc1wiXG4gKiAgICAgICAgICAgICAgIF1cbiAqICAgICAgIH1dLFxuICogICAgICAganM6IFtcbiAqICAgICAgICAgICBcIi9ub2RlX21vZHVsZXMvQGw4anMvbDgvZGlzdC9sOC5ydW50aW1lLmpzXCIsIHtcbiAqICAgICAgICAgICAgICAgbW9kZXJuOiBcIi9ub2RlX21vZHVsZXMvQHNlbmNoYS9leHQtbW9kZXJuLXJ1bnRpbWUvbW9kZXJuLmVuZ2luZS5lbnRlcnByaXNlLmpzXCIsXG4gKiAgICAgICAgICAgICAgIGNsYXNzaWM6IFwiL25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1tb2Rlcm4tcnVudGltZS9jbGFzc2ljLmVuZ2luZS5lbnRlcnByaXNlLmpzXCJcbiAqICAgICAgICAgIH1cbiAqICAgICAgIF1cbiAqICAgfX07XG4gKlxuICogIGdldFBhdGhzKGNvbmZpZywgdHJ1ZSk7IC8vIHJldHVybnMge1xuICogICAvLyAgIHByZWxvYWQgOiBbXG4gKiAgIC8vICAgICAgIFwiL25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1tb2Rlcm4tcnVudGltZS9tYXRlcmlhbC9tYXRlcmlhbC1hbGxfMS5jc3NcIixcbiAqICAgLy8gICAgICAgXCIvbm9kZV9tb2R1bGVzL0BzZW5jaGEvZXh0LW1vZGVybi1ydW50aW1lL21hdGVyaWFsL21hdGVyaWFsLWFsbF8yLmNzc1wiLFxuICogICAvLyAgICAgICBcIi9ub2RlX21vZHVsZXMvQGw4anMvbDgvZGlzdC9sOC5ydW50aW1lLmpzXCIsXG4gKiAgIC8vICAgICAgIFwiL25vZGVfbW9kdWxlcy9Ac2VuY2hhL2V4dC1tb2Rlcm4tcnVudGltZS9tb2Rlcm4uZW5naW5lLmVudGVycHJpc2UuanNcIlxuICogICAvLyAgIF0sXG4gKiAgIC8vICAgbG9hZGVyUGF0aCA6IHtcbiAqICAgLy8gICAgICAgXCJFeHQuUGFja2FnZVwiOiBcIi9ub2RlX21vZHVsZXMvQGNvb24tanMvZXh0anMtcGFja2FnZS1sb2FkZXIvcGFja2FnZXMvcGFja2FnZS1sb2FkZXIvc3JjL3NyYy9QYWNrYWdlLmpzXCIsXG4gKiAgIC8vICAgICAgIFwiY29vbi5jb3JlXCI6IFwiLi4vc3JjL1wiXG4gKiAgIC8vICAgfVxuICogIC8vIH07XG4gKlxuICpcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQYXRocyA9IChjb25maWcsIGlzTW9kZXJuKSA9PiB7XG5cbiAgICBjb25zdFxuICAgICAgICByZXN1bHQgPSB7cHJlbG9hZDogW10sIGxvYWRlclBhdGg6IHt9fSxcbiAgICAgICAgaXNPYmplY3QgPSBsOC5pc09iamVjdCxcbiAgICAgICAgaXNBcnJheSA9IGw4LmlzQXJyYXksXG4gICAgICAgIGlzU3RyaW5nID0gbDguaXNTdHJpbmcsXG4gICAgICAgIHRvb2xraXQgPSBpc01vZGVybiA/IFwibW9kZXJuXCIgOiBpc01vZGVybiA9PT0gZmFsc2UgPyBcImNsYXNzaWNcIiA6IG51bGwsXG4gICAgICAgIHBhcnNlU2VjdGlvbiA9IChzZWN0aW9uKSA9PiB7XG5cbiAgICAgICAgICAgIHNlY3Rpb24gPSBbXS5jb25jYXQoc2VjdGlvbik7XG5cbiAgICAgICAgICAgIHNlY3Rpb24uZm9yRWFjaCgoZW50cnkpID0+IHtcblxuICAgICAgICAgICAgICAgIGlmIChpc1N0cmluZyhlbnRyeSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnByZWxvYWQucHVzaChlbnRyeSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc09iamVjdChlbnRyeSkgJiYgdG9vbGtpdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShlbnRyeVt0b29sa2l0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcmVsb2FkID0gcmVzdWx0LnByZWxvYWQuY29uY2F0KGVudHJ5W3Rvb2xraXRdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1N0cmluZyhlbnRyeVt0b29sa2l0XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wcmVsb2FkLnB1c2goZW50cnlbdG9vbGtpdF0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9O1xuXG4gICAgbDguYXNzaWduKFxuICAgICAgICByZXN1bHQubG9hZGVyUGF0aCxcbiAgICAgICAgW2NvbmZpZy5sb2FkZXJQYXRoIHx8IHt9LCBcImNsYXNzaWNcIiwgXCJtb2Rlcm5cIl0sXG4gICAgICAgIGNvbmZpZy5sb2FkZXJQYXRoICYmIGNvbmZpZy5sb2FkZXJQYXRoW3Rvb2xraXRdID8gY29uZmlnLmxvYWRlclBhdGhbdG9vbGtpdF0gOiB7fVxuICAgICk7XG5cbiAgICBjb25zdCB7anMsIGNzc30gPSBjb25maWcucHJlbG9hZCB8fCB7fTtcblxuICAgIHBhcnNlU2VjdGlvbihjc3MpO1xuICAgIHBhcnNlU2VjdGlvbihqcyk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuXG59OyJdLCJuYW1lcyI6WyJsOC5waW5nIiwibDgubG9hZCIsImw4LmlzU3RyaW5nIiwibDguaXNQbGFpbk9iamVjdCIsImw4LmZpbmRGaXJzdCIsImw4LnVuY2hhaW4iLCJsOC5jaGFpbiIsImw4LmlzT2JqZWN0IiwibDguaXNBcnJheSIsImw4LmFzc2lnbiJdLCJtYXBwaW5ncyI6IkFBQXFDLE1BQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEVBQUUsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUF5QixDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksTUFBTSxDQUE4MEMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQTJELENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLE1BQXV5QixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUE4SyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxHQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBTSxNQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxHQUFTLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLDJGQUEyRixFQUFFLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtFQUFrRSxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDLENBQUMsb0RBQW9ELEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxnREFBZ0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFNLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUF