ngx-touch-keyboard 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,11 +9,11 @@ export const fnButton = {
9
9
  };
10
10
  export const fnDisplay = {
11
11
  DONE: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="m12 15-5-5h10Z"/></svg>`,
12
- Enter: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="m9 18-6-6 6-6 1.4 1.4L6.8 11H19V7h2v6H6.8l3.6 3.6Z"/></svg>`,
12
+ ENTER: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="m9 18-6-6 6-6 1.4 1.4L6.8 11H19V7h2v6H6.8l3.6 3.6Z"/></svg>`,
13
13
  SHIFT: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="M10.8796773,2.4676627 C10.7983669,2.53542133 10.7233714,2.61041687 10.6556128,2.69172724 L2.79065437,12.1296773 C2.17191723,12.8721619 2.27223434,13.9756501 3.01471891,14.5943872 L3.15432027,14.6993778 C3.44275103,14.8945506 3.78413686,15 4.13504161,15 L6.999,15 L7,20.25 C7,21.2164983 7.78350169,22 8.75,22 L15.25,22 L15.3935272,21.9941988 C16.2928897,21.9211923 17,21.1681734 17,20.25 L16.999,15 L19.8649584,15 C20.8314567,15 21.6149584,14.2164983 21.6149584,13.25 C21.6149584,12.8406111 21.47143,12.4441786 21.2093456,12.1296773 L13.3443872,2.69172724 C12.7600244,1.99049181 11.7432755,1.8620539 11.0066223,2.37118457 L10.8796773,2.4676627 Z M12.1920553,3.65200384 L20.0570137,13.0899539 C20.0944543,13.1348827 20.1149584,13.1915159 20.1149584,13.25 C20.1149584,13.3880712 20.0030296,13.5 19.8649584,13.5 L16.25,13.5 C15.8357864,13.5 15.5,13.8357864 15.5,14.25 L15.5,20.25 C15.5,20.3880712 15.3880712,20.5 15.25,20.5 L8.75,20.5 C8.61192881,20.5 8.5,20.3880712 8.5,20.25 L8.5,14.25 C8.5,13.8357864 8.16421356,13.5 7.75,13.5 L4.13504161,13.5 C4.07655749,13.5 4.01992426,13.4794959 3.97499551,13.4420553 C3.86892629,13.3536643 3.85459527,13.1960231 3.94298629,13.0899539 L11.8079447,3.65200384 C11.8176245,3.64038807 11.8283381,3.62967442 11.8399539,3.61999462 C11.9460231,3.5316036 12.1036643,3.54593461 12.1920553,3.65200384 Z"></path></svg>`,
14
14
  BACKSPACE: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="M18.75,4 C20.4830315,4 21.8992459,5.35645477 21.9948552,7.06557609 L22,7.25 L22,16.75 C22,18.4830315 20.6435452,19.8992459 18.9344239,19.9948552 L18.75,20 L10.2488122,20 C9.48467584,20 8.74731983,19.7308489 8.16441163,19.243553 L8.00936186,19.1052839 L3.01367221,14.3552839 C1.71288481,13.1184697 1.66102433,11.0613371 2.89783857,9.76054971 L3.01367221,9.64471607 L8.00936186,4.89471607 C8.56313355,4.36817906 9.28295917,4.05514987 10.0411712,4.00663485 L10.2488122,4 L18.75,4 Z M18.75,5.5 L10.2488122,5.5 C9.85605678,5.5 9.47644043,5.63205173 9.16975262,5.87226779 L9.04295431,5.98177019 L4.04726465,10.7317702 L3.98489269,10.7941421 C3.3580909,11.4533647 3.34595643,12.473346 3.93064574,13.1462921 L4.04726465,13.2682298 L9.04295431,18.0182298 C9.32758521,18.2888625 9.69368599,18.4547433 10.0814672,18.4919848 L10.2488122,18.5 L18.75,18.5 C19.6681734,18.5 20.4211923,17.7928897 20.4941988,16.8935272 L20.5,16.75 L20.5,7.25 C20.5,6.3318266 19.7928897,5.57880766 18.8935272,5.5058012 L18.75,5.5 Z M11.4462117,8.39705176 L11.5303301,8.46966991 L14.000116,10.939 L16.4696699,8.46966991 C16.7625631,8.1767767 17.2374369,8.1767767 17.5303301,8.46966991 C17.7965966,8.73593648 17.8208027,9.15260016 17.6029482,9.44621165 L17.5303301,9.53033009 L15.061116,12 L17.5303301,14.4696699 C17.8232233,14.7625631 17.8232233,15.2374369 17.5303301,15.5303301 C17.2640635,15.7965966 16.8473998,15.8208027 16.5537883,15.6029482 L16.4696699,15.5303301 L14.000116,13.061 L11.5303301,15.5303301 C11.2374369,15.8232233 10.7625631,15.8232233 10.4696699,15.5303301 C10.2034034,15.2640635 10.1791973,14.8473998 10.3970518,14.5537883 L10.4696699,14.4696699 L12.939116,12 L10.4696699,9.53033009 C10.1767767,9.23743687 10.1767767,8.76256313 10.4696699,8.46966991 C10.7359365,8.20340335 11.1526002,8.1791973 11.4462117,8.39705176 Z"></path></svg>`,
15
15
  LANGUAGE: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="M12 22q-2.05 0-3.875-.788-1.825-.787-3.187-2.15-1.363-1.362-2.15-3.187Q2 14.05 2 12q0-2.075.788-3.887.787-1.813 2.15-3.175Q6.3 3.575 8.125 2.787 9.95 2 12 2q2.075 0 3.887.787 1.813.788 3.175 2.151 1.363 1.362 2.15 3.175Q22 9.925 22 12q0 2.05-.788 3.875-.787 1.825-2.15 3.187-1.362 1.363-3.175 2.15Q14.075 22 12 22Zm0-2.05q.65-.9 1.125-1.875T13.9 16h-3.8q.3 1.1.775 2.075.475.975 1.125 1.875Zm-2.6-.4q-.45-.825-.787-1.713Q8.275 16.95 8.05 16H5.1q.725 1.25 1.812 2.175Q8 19.1 9.4 19.55Zm5.2 0q1.4-.45 2.487-1.375Q18.175 17.25 18.9 16h-2.95q-.225.95-.562 1.837-.338.888-.788 1.713ZM4.25 14h3.4q-.075-.5-.113-.988Q7.5 12.525 7.5 12t.037-1.012q.038-.488.113-.988h-3.4q-.125.5-.188.988Q4 11.475 4 12t.062 1.012q.063.488.188.988Zm5.4 0h4.7q.075-.5.113-.988.037-.487.037-1.012t-.037-1.012q-.038-.488-.113-.988h-4.7q-.075.5-.112.988Q9.5 11.475 9.5 12t.038 1.012q.037.488.112.988Zm6.7 0h3.4q.125-.5.188-.988Q20 12.525 20 12t-.062-1.012q-.063-.488-.188-.988h-3.4q.075.5.112.988.038.487.038 1.012t-.038 1.012q-.037.488-.112.988Zm-.4-6h2.95q-.725-1.25-1.813-2.175Q16 4.9 14.6 4.45q.45.825.788 1.712.337.888.562 1.838ZM10.1 8h3.8q-.3-1.1-.775-2.075Q12.65 4.95 12 4.05q-.65.9-1.125 1.875T10.1 8Zm-5 0h2.95q.225-.95.563-1.838.337-.887.787-1.712Q8 4.9 6.912 5.825 5.825 6.75 5.1 8Z"/></svg>`,
16
16
  SPACE: ` `,
17
17
  TAB: `<svg xmlns="http://www.w3.org/2000/svg" height="20" width="20" viewBox="0 0 24 24"><path d="m12 18-1.425-1.4 3.6-3.6H2v-2h12.175L10.6 7.4 12 6l6 6Zm8 0V6h2v12Z"/></svg>`,
18
18
  };
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRvdWNoLWtleWJvYXJkL3NyYy9saWIvTG9jYWxlL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDdEIsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsU0FBUztJQUNoQixLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUUsYUFBYTtJQUN4QixRQUFRLEVBQUUsWUFBWTtJQUN0QixLQUFLLEVBQUUsU0FBUztJQUNoQixHQUFHLEVBQUUsT0FBTztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDdkIsSUFBSSxFQUFFLHFIQUFxSDtJQUMzSCxLQUFLLEVBQUUseUpBQXlKO0lBQ2hLLEtBQUssRUFBRSw2NUNBQTY1QztJQUNwNkMsU0FBUyxFQUFFLHczREFBdzNEO0lBQ240RCxRQUFRLEVBQUUsdTFDQUF1MUM7SUFDajJDLEtBQUssRUFBRSxHQUFHO0lBQ1YsR0FBRyxFQUFFLDBLQUEwSztDQUNoTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGZuQnV0dG9uID0ge1xyXG4gIERPTkU6IGB7ZG9uZX1gLFxyXG4gIEVOVEVSOiBge2VudGVyfWAsXHJcbiAgU0hJRlQ6IGB7c2hpZnR9YCxcclxuICBCQUNLU1BBQ0U6IGB7YmFja3NwYWNlfWAsXHJcbiAgTEFOR1VBR0U6IGB7bGFuZ3VhZ2V9YCxcclxuICBTUEFDRTogYHtzcGFjZX1gLFxyXG4gIFRBQjogYHt0YWJ9YCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmbkRpc3BsYXkgPSB7XHJcbiAgRE9ORTogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwibTEyIDE1LTUtNWgxMFpcIi8+PC9zdmc+YCxcclxuICBFbnRlcjogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwibTkgMTgtNi02IDYtNiAxLjQgMS40TDYuOCAxMUgxOVY3aDJ2Nkg2LjhsMy42IDMuNlpcIi8+PC9zdmc+YCxcclxuICBTSElGVDogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTEwLjg3OTY3NzMsMi40Njc2NjI3IEMxMC43OTgzNjY5LDIuNTM1NDIxMzMgMTAuNzIzMzcxNCwyLjYxMDQxNjg3IDEwLjY1NTYxMjgsMi42OTE3MjcyNCBMMi43OTA2NTQzNywxMi4xMjk2NzczIEMyLjE3MTkxNzIzLDEyLjg3MjE2MTkgMi4yNzIyMzQzNCwxMy45NzU2NTAxIDMuMDE0NzE4OTEsMTQuNTk0Mzg3MiBMMy4xNTQzMjAyNywxNC42OTkzNzc4IEMzLjQ0Mjc1MTAzLDE0Ljg5NDU1MDYgMy43ODQxMzY4NiwxNSA0LjEzNTA0MTYxLDE1IEw2Ljk5OSwxNSBMNywyMC4yNSBDNywyMS4yMTY0OTgzIDcuNzgzNTAxNjksMjIgOC43NSwyMiBMMTUuMjUsMjIgTDE1LjM5MzUyNzIsMjEuOTk0MTk4OCBDMTYuMjkyODg5NywyMS45MjExOTIzIDE3LDIxLjE2ODE3MzQgMTcsMjAuMjUgTDE2Ljk5OSwxNSBMMTkuODY0OTU4NCwxNSBDMjAuODMxNDU2NywxNSAyMS42MTQ5NTg0LDE0LjIxNjQ5ODMgMjEuNjE0OTU4NCwxMy4yNSBDMjEuNjE0OTU4NCwxMi44NDA2MTExIDIxLjQ3MTQzLDEyLjQ0NDE3ODYgMjEuMjA5MzQ1NiwxMi4xMjk2NzczIEwxMy4zNDQzODcyLDIuNjkxNzI3MjQgQzEyLjc2MDAyNDQsMS45OTA0OTE4MSAxMS43NDMyNzU1LDEuODYyMDUzOSAxMS4wMDY2MjIzLDIuMzcxMTg0NTcgTDEwLjg3OTY3NzMsMi40Njc2NjI3IFogTTEyLjE5MjA1NTMsMy42NTIwMDM4NCBMMjAuMDU3MDEzNywxMy4wODk5NTM5IEMyMC4wOTQ0NTQzLDEzLjEzNDg4MjcgMjAuMTE0OTU4NCwxMy4xOTE1MTU5IDIwLjExNDk1ODQsMTMuMjUgQzIwLjExNDk1ODQsMTMuMzg4MDcxMiAyMC4wMDMwMjk2LDEzLjUgMTkuODY0OTU4NCwxMy41IEwxNi4yNSwxMy41IEMxNS44MzU3ODY0LDEzLjUgMTUuNSwxMy44MzU3ODY0IDE1LjUsMTQuMjUgTDE1LjUsMjAuMjUgQzE1LjUsMjAuMzg4MDcxMiAxNS4zODgwNzEyLDIwLjUgMTUuMjUsMjAuNSBMOC43NSwyMC41IEM4LjYxMTkyODgxLDIwLjUgOC41LDIwLjM4ODA3MTIgOC41LDIwLjI1IEw4LjUsMTQuMjUgQzguNSwxMy44MzU3ODY0IDguMTY0MjEzNTYsMTMuNSA3Ljc1LDEzLjUgTDQuMTM1MDQxNjEsMTMuNSBDNC4wNzY1NTc0OSwxMy41IDQuMDE5OTI0MjYsMTMuNDc5NDk1OSAzLjk3NDk5NTUxLDEzLjQ0MjA1NTMgQzMuODY4OTI2MjksMTMuMzUzNjY0MyAzLjg1NDU5NTI3LDEzLjE5NjAyMzEgMy45NDI5ODYyOSwxMy4wODk5NTM5IEwxMS44MDc5NDQ3LDMuNjUyMDAzODQgQzExLjgxNzYyNDUsMy42NDAzODgwNyAxMS44MjgzMzgxLDMuNjI5Njc0NDIgMTEuODM5OTUzOSwzLjYxOTk5NDYyIEMxMS45NDYwMjMxLDMuNTMxNjAzNiAxMi4xMDM2NjQzLDMuNTQ1OTM0NjEgMTIuMTkyMDU1MywzLjY1MjAwMzg0IFpcIj48L3BhdGg+PC9zdmc+YCxcclxuICBCQUNLU1BBQ0U6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xOC43NSw0IEMyMC40ODMwMzE1LDQgMjEuODk5MjQ1OSw1LjM1NjQ1NDc3IDIxLjk5NDg1NTIsNy4wNjU1NzYwOSBMMjIsNy4yNSBMMjIsMTYuNzUgQzIyLDE4LjQ4MzAzMTUgMjAuNjQzNTQ1MiwxOS44OTkyNDU5IDE4LjkzNDQyMzksMTkuOTk0ODU1MiBMMTguNzUsMjAgTDEwLjI0ODgxMjIsMjAgQzkuNDg0Njc1ODQsMjAgOC43NDczMTk4MywxOS43MzA4NDg5IDguMTY0NDExNjMsMTkuMjQzNTUzIEw4LjAwOTM2MTg2LDE5LjEwNTI4MzkgTDMuMDEzNjcyMjEsMTQuMzU1MjgzOSBDMS43MTI4ODQ4MSwxMy4xMTg0Njk3IDEuNjYxMDI0MzMsMTEuMDYxMzM3MSAyLjg5NzgzODU3LDkuNzYwNTQ5NzEgTDMuMDEzNjcyMjEsOS42NDQ3MTYwNyBMOC4wMDkzNjE4Niw0Ljg5NDcxNjA3IEM4LjU2MzEzMzU1LDQuMzY4MTc5MDYgOS4yODI5NTkxNyw0LjA1NTE0OTg3IDEwLjA0MTE3MTIsNC4wMDY2MzQ4NSBMMTAuMjQ4ODEyMiw0IEwxOC43NSw0IFogTTE4Ljc1LDUuNSBMMTAuMjQ4ODEyMiw1LjUgQzkuODU2MDU2NzgsNS41IDkuNDc2NDQwNDMsNS42MzIwNTE3MyA5LjE2OTc1MjYyLDUuODcyMjY3NzkgTDkuMDQyOTU0MzEsNS45ODE3NzAxOSBMNC4wNDcyNjQ2NSwxMC43MzE3NzAyIEwzLjk4NDg5MjY5LDEwLjc5NDE0MjEgQzMuMzU4MDkwOSwxMS40NTMzNjQ3IDMuMzQ1OTU2NDMsMTIuNDczMzQ2IDMuOTMwNjQ1NzQsMTMuMTQ2MjkyMSBMNC4wNDcyNjQ2NSwxMy4yNjgyMjk4IEw5LjA0Mjk1NDMxLDE4LjAxODIyOTggQzkuMzI3NTg1MjEsMTguMjg4ODYyNSA5LjY5MzY4NTk5LDE4LjQ1NDc0MzMgMTAuMDgxNDY3MiwxOC40OTE5ODQ4IEwxMC4yNDg4MTIyLDE4LjUgTDE4Ljc1LDE4LjUgQzE5LjY2ODE3MzQsMTguNSAyMC40MjExOTIzLDE3Ljc5Mjg4OTcgMjAuNDk0MTk4OCwxNi44OTM1MjcyIEwyMC41LDE2Ljc1IEwyMC41LDcuMjUgQzIwLjUsNi4zMzE4MjY2IDE5Ljc5Mjg4OTcsNS41Nzg4MDc2NiAxOC44OTM1MjcyLDUuNTA1ODAxMiBMMTguNzUsNS41IFogTTExLjQ0NjIxMTcsOC4zOTcwNTE3NiBMMTEuNTMwMzMwMSw4LjQ2OTY2OTkxIEwxNC4wMDAxMTYsMTAuOTM5IEwxNi40Njk2Njk5LDguNDY5NjY5OTEgQzE2Ljc2MjU2MzEsOC4xNzY3NzY3IDE3LjIzNzQzNjksOC4xNzY3NzY3IDE3LjUzMDMzMDEsOC40Njk2Njk5MSBDMTcuNzk2NTk2Niw4LjczNTkzNjQ4IDE3LjgyMDgwMjcsOS4xNTI2MDAxNiAxNy42MDI5NDgyLDkuNDQ2MjExNjUgTDE3LjUzMDMzMDEsOS41MzAzMzAwOSBMMTUuMDYxMTE2LDEyIEwxNy41MzAzMzAxLDE0LjQ2OTY2OTkgQzE3LjgyMzIyMzMsMTQuNzYyNTYzMSAxNy44MjMyMjMzLDE1LjIzNzQzNjkgMTcuNTMwMzMwMSwxNS41MzAzMzAxIEMxNy4yNjQwNjM1LDE1Ljc5NjU5NjYgMTYuODQ3Mzk5OCwxNS44MjA4MDI3IDE2LjU1Mzc4ODMsMTUuNjAyOTQ4MiBMMTYuNDY5NjY5OSwxNS41MzAzMzAxIEwxNC4wMDAxMTYsMTMuMDYxIEwxMS41MzAzMzAxLDE1LjUzMDMzMDEgQzExLjIzNzQzNjksMTUuODIzMjIzMyAxMC43NjI1NjMxLDE1LjgyMzIyMzMgMTAuNDY5NjY5OSwxNS41MzAzMzAxIEMxMC4yMDM0MDM0LDE1LjI2NDA2MzUgMTAuMTc5MTk3MywxNC44NDczOTk4IDEwLjM5NzA1MTgsMTQuNTUzNzg4MyBMMTAuNDY5NjY5OSwxNC40Njk2Njk5IEwxMi45MzkxMTYsMTIgTDEwLjQ2OTY2OTksOS41MzAzMzAwOSBDMTAuMTc2Nzc2Nyw5LjIzNzQzNjg3IDEwLjE3Njc3NjcsOC43NjI1NjMxMyAxMC40Njk2Njk5LDguNDY5NjY5OTEgQzEwLjczNTkzNjUsOC4yMDM0MDMzNSAxMS4xNTI2MDAyLDguMTc5MTk3MyAxMS40NDYyMTE3LDguMzk3MDUxNzYgWlwiPjwvcGF0aD48L3N2Zz5gLFxyXG4gIExBTkdVQUdFOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjBcIiB3aWR0aD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTIgMjJxLTIuMDUgMC0zLjg3NS0uNzg4LTEuODI1LS43ODctMy4xODctMi4xNS0xLjM2My0xLjM2Mi0yLjE1LTMuMTg3UTIgMTQuMDUgMiAxMnEwLTIuMDc1Ljc4OC0zLjg4Ny43ODctMS44MTMgMi4xNS0zLjE3NVE2LjMgMy41NzUgOC4xMjUgMi43ODcgOS45NSAyIDEyIDJxMi4wNzUgMCAzLjg4Ny43ODcgMS44MTMuNzg4IDMuMTc1IDIuMTUxIDEuMzYzIDEuMzYyIDIuMTUgMy4xNzVRMjIgOS45MjUgMjIgMTJxMCAyLjA1LS43ODggMy44NzUtLjc4NyAxLjgyNS0yLjE1IDMuMTg3LTEuMzYyIDEuMzYzLTMuMTc1IDIuMTVRMTQuMDc1IDIyIDEyIDIyWm0wLTIuMDVxLjY1LS45IDEuMTI1LTEuODc1VDEzLjkgMTZoLTMuOHEuMyAxLjEuNzc1IDIuMDc1LjQ3NS45NzUgMS4xMjUgMS44NzVabS0yLjYtLjRxLS40NS0uODI1LS43ODctMS43MTNROC4yNzUgMTYuOTUgOC4wNSAxNkg1LjFxLjcyNSAxLjI1IDEuODEyIDIuMTc1UTggMTkuMSA5LjQgMTkuNTVabTUuMiAwcTEuNC0uNDUgMi40ODctMS4zNzVRMTguMTc1IDE3LjI1IDE4LjkgMTZoLTIuOTVxLS4yMjUuOTUtLjU2MiAxLjgzNy0uMzM4Ljg4OC0uNzg4IDEuNzEzWk00LjI1IDE0aDMuNHEtLjA3NS0uNS0uMTEzLS45ODhRNy41IDEyLjUyNSA3LjUgMTJ0LjAzNy0xLjAxMnEuMDM4LS40ODguMTEzLS45ODhoLTMuNHEtLjEyNS41LS4xODguOTg4UTQgMTEuNDc1IDQgMTJ0LjA2MiAxLjAxMnEuMDYzLjQ4OC4xODguOTg4Wm01LjQgMGg0LjdxLjA3NS0uNS4xMTMtLjk4OC4wMzctLjQ4Ny4wMzctMS4wMTJ0LS4wMzctMS4wMTJxLS4wMzgtLjQ4OC0uMTEzLS45ODhoLTQuN3EtLjA3NS41LS4xMTIuOTg4UTkuNSAxMS40NzUgOS41IDEydC4wMzggMS4wMTJxLjAzNy40ODguMTEyLjk4OFptNi43IDBoMy40cS4xMjUtLjUuMTg4LS45ODhRMjAgMTIuNTI1IDIwIDEydC0uMDYyLTEuMDEycS0uMDYzLS40ODgtLjE4OC0uOTg4aC0zLjRxLjA3NS41LjExMi45ODguMDM4LjQ4Ny4wMzggMS4wMTJ0LS4wMzggMS4wMTJxLS4wMzcuNDg4LS4xMTIuOTg4Wm0tLjQtNmgyLjk1cS0uNzI1LTEuMjUtMS44MTMtMi4xNzVRMTYgNC45IDE0LjYgNC40NXEuNDUuODI1Ljc4OCAxLjcxMi4zMzcuODg4LjU2MiAxLjgzOFpNMTAuMSA4aDMuOHEtLjMtMS4xLS43NzUtMi4wNzVRMTIuNjUgNC45NSAxMiA0LjA1cS0uNjUuOS0xLjEyNSAxLjg3NVQxMC4xIDhabS01IDBoMi45NXEuMjI1LS45NS41NjMtMS44MzguMzM3LS44ODcuNzg3LTEuNzEyUTggNC45IDYuOTEyIDUuODI1IDUuODI1IDYuNzUgNS4xIDhaXCIvPjwvc3ZnPmAsXHJcbiAgU1BBQ0U6IGAgYCxcclxuICBUQUI6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIm0xMiAxOC0xLjQyNS0xLjQgMy42LTMuNkgydi0yaDEyLjE3NUwxMC42IDcuNCAxMiA2bDYgNlptOCAwVjZoMnYxMlpcIi8+PC9zdmc+YCxcclxufTtcclxuIl19
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRvdWNoLWtleWJvYXJkL3NyYy9saWIvTG9jYWxlL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUc7SUFDdEIsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVBQUUsU0FBUztJQUNoQixLQUFLLEVBQUUsU0FBUztJQUNoQixTQUFTLEVBQUUsYUFBYTtJQUN4QixRQUFRLEVBQUUsWUFBWTtJQUN0QixLQUFLLEVBQUUsU0FBUztJQUNoQixHQUFHLEVBQUUsT0FBTztDQUNiLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUc7SUFDdkIsSUFBSSxFQUFFLHFIQUFxSDtJQUMzSCxLQUFLLEVBQUUseUpBQXlKO0lBQ2hLLEtBQUssRUFBRSw2NUNBQTY1QztJQUNwNkMsU0FBUyxFQUFFLHczREFBdzNEO0lBQ240RCxRQUFRLEVBQUUsdTFDQUF1MUM7SUFDajJDLEtBQUssRUFBRSxHQUFHO0lBQ1YsR0FBRyxFQUFFLDBLQUEwSztDQUNoTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGZuQnV0dG9uID0ge1xyXG4gIERPTkU6IGB7ZG9uZX1gLFxyXG4gIEVOVEVSOiBge2VudGVyfWAsXHJcbiAgU0hJRlQ6IGB7c2hpZnR9YCxcclxuICBCQUNLU1BBQ0U6IGB7YmFja3NwYWNlfWAsXHJcbiAgTEFOR1VBR0U6IGB7bGFuZ3VhZ2V9YCxcclxuICBTUEFDRTogYHtzcGFjZX1gLFxyXG4gIFRBQjogYHt0YWJ9YCxcclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBmbkRpc3BsYXkgPSB7XHJcbiAgRE9ORTogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwibTEyIDE1LTUtNWgxMFpcIi8+PC9zdmc+YCxcclxuICBFTlRFUjogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwibTkgMTgtNi02IDYtNiAxLjQgMS40TDYuOCAxMUgxOVY3aDJ2Nkg2LjhsMy42IDMuNlpcIi8+PC9zdmc+YCxcclxuICBTSElGVDogYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjIwXCIgd2lkdGg9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj48cGF0aCBkPVwiTTEwLjg3OTY3NzMsMi40Njc2NjI3IEMxMC43OTgzNjY5LDIuNTM1NDIxMzMgMTAuNzIzMzcxNCwyLjYxMDQxNjg3IDEwLjY1NTYxMjgsMi42OTE3MjcyNCBMMi43OTA2NTQzNywxMi4xMjk2NzczIEMyLjE3MTkxNzIzLDEyLjg3MjE2MTkgMi4yNzIyMzQzNCwxMy45NzU2NTAxIDMuMDE0NzE4OTEsMTQuNTk0Mzg3MiBMMy4xNTQzMjAyNywxNC42OTkzNzc4IEMzLjQ0Mjc1MTAzLDE0Ljg5NDU1MDYgMy43ODQxMzY4NiwxNSA0LjEzNTA0MTYxLDE1IEw2Ljk5OSwxNSBMNywyMC4yNSBDNywyMS4yMTY0OTgzIDcuNzgzNTAxNjksMjIgOC43NSwyMiBMMTUuMjUsMjIgTDE1LjM5MzUyNzIsMjEuOTk0MTk4OCBDMTYuMjkyODg5NywyMS45MjExOTIzIDE3LDIxLjE2ODE3MzQgMTcsMjAuMjUgTDE2Ljk5OSwxNSBMMTkuODY0OTU4NCwxNSBDMjAuODMxNDU2NywxNSAyMS42MTQ5NTg0LDE0LjIxNjQ5ODMgMjEuNjE0OTU4NCwxMy4yNSBDMjEuNjE0OTU4NCwxMi44NDA2MTExIDIxLjQ3MTQzLDEyLjQ0NDE3ODYgMjEuMjA5MzQ1NiwxMi4xMjk2NzczIEwxMy4zNDQzODcyLDIuNjkxNzI3MjQgQzEyLjc2MDAyNDQsMS45OTA0OTE4MSAxMS43NDMyNzU1LDEuODYyMDUzOSAxMS4wMDY2MjIzLDIuMzcxMTg0NTcgTDEwLjg3OTY3NzMsMi40Njc2NjI3IFogTTEyLjE5MjA1NTMsMy42NTIwMDM4NCBMMjAuMDU3MDEzNywxMy4wODk5NTM5IEMyMC4wOTQ0NTQzLDEzLjEzNDg4MjcgMjAuMTE0OTU4NCwxMy4xOTE1MTU5IDIwLjExNDk1ODQsMTMuMjUgQzIwLjExNDk1ODQsMTMuMzg4MDcxMiAyMC4wMDMwMjk2LDEzLjUgMTkuODY0OTU4NCwxMy41IEwxNi4yNSwxMy41IEMxNS44MzU3ODY0LDEzLjUgMTUuNSwxMy44MzU3ODY0IDE1LjUsMTQuMjUgTDE1LjUsMjAuMjUgQzE1LjUsMjAuMzg4MDcxMiAxNS4zODgwNzEyLDIwLjUgMTUuMjUsMjAuNSBMOC43NSwyMC41IEM4LjYxMTkyODgxLDIwLjUgOC41LDIwLjM4ODA3MTIgOC41LDIwLjI1IEw4LjUsMTQuMjUgQzguNSwxMy44MzU3ODY0IDguMTY0MjEzNTYsMTMuNSA3Ljc1LDEzLjUgTDQuMTM1MDQxNjEsMTMuNSBDNC4wNzY1NTc0OSwxMy41IDQuMDE5OTI0MjYsMTMuNDc5NDk1OSAzLjk3NDk5NTUxLDEzLjQ0MjA1NTMgQzMuODY4OTI2MjksMTMuMzUzNjY0MyAzLjg1NDU5NTI3LDEzLjE5NjAyMzEgMy45NDI5ODYyOSwxMy4wODk5NTM5IEwxMS44MDc5NDQ3LDMuNjUyMDAzODQgQzExLjgxNzYyNDUsMy42NDAzODgwNyAxMS44MjgzMzgxLDMuNjI5Njc0NDIgMTEuODM5OTUzOSwzLjYxOTk5NDYyIEMxMS45NDYwMjMxLDMuNTMxNjAzNiAxMi4xMDM2NjQzLDMuNTQ1OTM0NjEgMTIuMTkyMDU1MywzLjY1MjAwMzg0IFpcIj48L3BhdGg+PC9zdmc+YCxcclxuICBCQUNLU1BBQ0U6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIk0xOC43NSw0IEMyMC40ODMwMzE1LDQgMjEuODk5MjQ1OSw1LjM1NjQ1NDc3IDIxLjk5NDg1NTIsNy4wNjU1NzYwOSBMMjIsNy4yNSBMMjIsMTYuNzUgQzIyLDE4LjQ4MzAzMTUgMjAuNjQzNTQ1MiwxOS44OTkyNDU5IDE4LjkzNDQyMzksMTkuOTk0ODU1MiBMMTguNzUsMjAgTDEwLjI0ODgxMjIsMjAgQzkuNDg0Njc1ODQsMjAgOC43NDczMTk4MywxOS43MzA4NDg5IDguMTY0NDExNjMsMTkuMjQzNTUzIEw4LjAwOTM2MTg2LDE5LjEwNTI4MzkgTDMuMDEzNjcyMjEsMTQuMzU1MjgzOSBDMS43MTI4ODQ4MSwxMy4xMTg0Njk3IDEuNjYxMDI0MzMsMTEuMDYxMzM3MSAyLjg5NzgzODU3LDkuNzYwNTQ5NzEgTDMuMDEzNjcyMjEsOS42NDQ3MTYwNyBMOC4wMDkzNjE4Niw0Ljg5NDcxNjA3IEM4LjU2MzEzMzU1LDQuMzY4MTc5MDYgOS4yODI5NTkxNyw0LjA1NTE0OTg3IDEwLjA0MTE3MTIsNC4wMDY2MzQ4NSBMMTAuMjQ4ODEyMiw0IEwxOC43NSw0IFogTTE4Ljc1LDUuNSBMMTAuMjQ4ODEyMiw1LjUgQzkuODU2MDU2NzgsNS41IDkuNDc2NDQwNDMsNS42MzIwNTE3MyA5LjE2OTc1MjYyLDUuODcyMjY3NzkgTDkuMDQyOTU0MzEsNS45ODE3NzAxOSBMNC4wNDcyNjQ2NSwxMC43MzE3NzAyIEwzLjk4NDg5MjY5LDEwLjc5NDE0MjEgQzMuMzU4MDkwOSwxMS40NTMzNjQ3IDMuMzQ1OTU2NDMsMTIuNDczMzQ2IDMuOTMwNjQ1NzQsMTMuMTQ2MjkyMSBMNC4wNDcyNjQ2NSwxMy4yNjgyMjk4IEw5LjA0Mjk1NDMxLDE4LjAxODIyOTggQzkuMzI3NTg1MjEsMTguMjg4ODYyNSA5LjY5MzY4NTk5LDE4LjQ1NDc0MzMgMTAuMDgxNDY3MiwxOC40OTE5ODQ4IEwxMC4yNDg4MTIyLDE4LjUgTDE4Ljc1LDE4LjUgQzE5LjY2ODE3MzQsMTguNSAyMC40MjExOTIzLDE3Ljc5Mjg4OTcgMjAuNDk0MTk4OCwxNi44OTM1MjcyIEwyMC41LDE2Ljc1IEwyMC41LDcuMjUgQzIwLjUsNi4zMzE4MjY2IDE5Ljc5Mjg4OTcsNS41Nzg4MDc2NiAxOC44OTM1MjcyLDUuNTA1ODAxMiBMMTguNzUsNS41IFogTTExLjQ0NjIxMTcsOC4zOTcwNTE3NiBMMTEuNTMwMzMwMSw4LjQ2OTY2OTkxIEwxNC4wMDAxMTYsMTAuOTM5IEwxNi40Njk2Njk5LDguNDY5NjY5OTEgQzE2Ljc2MjU2MzEsOC4xNzY3NzY3IDE3LjIzNzQzNjksOC4xNzY3NzY3IDE3LjUzMDMzMDEsOC40Njk2Njk5MSBDMTcuNzk2NTk2Niw4LjczNTkzNjQ4IDE3LjgyMDgwMjcsOS4xNTI2MDAxNiAxNy42MDI5NDgyLDkuNDQ2MjExNjUgTDE3LjUzMDMzMDEsOS41MzAzMzAwOSBMMTUuMDYxMTE2LDEyIEwxNy41MzAzMzAxLDE0LjQ2OTY2OTkgQzE3LjgyMzIyMzMsMTQuNzYyNTYzMSAxNy44MjMyMjMzLDE1LjIzNzQzNjkgMTcuNTMwMzMwMSwxNS41MzAzMzAxIEMxNy4yNjQwNjM1LDE1Ljc5NjU5NjYgMTYuODQ3Mzk5OCwxNS44MjA4MDI3IDE2LjU1Mzc4ODMsMTUuNjAyOTQ4MiBMMTYuNDY5NjY5OSwxNS41MzAzMzAxIEwxNC4wMDAxMTYsMTMuMDYxIEwxMS41MzAzMzAxLDE1LjUzMDMzMDEgQzExLjIzNzQzNjksMTUuODIzMjIzMyAxMC43NjI1NjMxLDE1LjgyMzIyMzMgMTAuNDY5NjY5OSwxNS41MzAzMzAxIEMxMC4yMDM0MDM0LDE1LjI2NDA2MzUgMTAuMTc5MTk3MywxNC44NDczOTk4IDEwLjM5NzA1MTgsMTQuNTUzNzg4MyBMMTAuNDY5NjY5OSwxNC40Njk2Njk5IEwxMi45MzkxMTYsMTIgTDEwLjQ2OTY2OTksOS41MzAzMzAwOSBDMTAuMTc2Nzc2Nyw5LjIzNzQzNjg3IDEwLjE3Njc3NjcsOC43NjI1NjMxMyAxMC40Njk2Njk5LDguNDY5NjY5OTEgQzEwLjczNTkzNjUsOC4yMDM0MDMzNSAxMS4xNTI2MDAyLDguMTc5MTk3MyAxMS40NDYyMTE3LDguMzk3MDUxNzYgWlwiPjwvcGF0aD48L3N2Zz5gLFxyXG4gIExBTkdVQUdFOiBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjBcIiB3aWR0aD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiPjxwYXRoIGQ9XCJNMTIgMjJxLTIuMDUgMC0zLjg3NS0uNzg4LTEuODI1LS43ODctMy4xODctMi4xNS0xLjM2My0xLjM2Mi0yLjE1LTMuMTg3UTIgMTQuMDUgMiAxMnEwLTIuMDc1Ljc4OC0zLjg4Ny43ODctMS44MTMgMi4xNS0zLjE3NVE2LjMgMy41NzUgOC4xMjUgMi43ODcgOS45NSAyIDEyIDJxMi4wNzUgMCAzLjg4Ny43ODcgMS44MTMuNzg4IDMuMTc1IDIuMTUxIDEuMzYzIDEuMzYyIDIuMTUgMy4xNzVRMjIgOS45MjUgMjIgMTJxMCAyLjA1LS43ODggMy44NzUtLjc4NyAxLjgyNS0yLjE1IDMuMTg3LTEuMzYyIDEuMzYzLTMuMTc1IDIuMTVRMTQuMDc1IDIyIDEyIDIyWm0wLTIuMDVxLjY1LS45IDEuMTI1LTEuODc1VDEzLjkgMTZoLTMuOHEuMyAxLjEuNzc1IDIuMDc1LjQ3NS45NzUgMS4xMjUgMS44NzVabS0yLjYtLjRxLS40NS0uODI1LS43ODctMS43MTNROC4yNzUgMTYuOTUgOC4wNSAxNkg1LjFxLjcyNSAxLjI1IDEuODEyIDIuMTc1UTggMTkuMSA5LjQgMTkuNTVabTUuMiAwcTEuNC0uNDUgMi40ODctMS4zNzVRMTguMTc1IDE3LjI1IDE4LjkgMTZoLTIuOTVxLS4yMjUuOTUtLjU2MiAxLjgzNy0uMzM4Ljg4OC0uNzg4IDEuNzEzWk00LjI1IDE0aDMuNHEtLjA3NS0uNS0uMTEzLS45ODhRNy41IDEyLjUyNSA3LjUgMTJ0LjAzNy0xLjAxMnEuMDM4LS40ODguMTEzLS45ODhoLTMuNHEtLjEyNS41LS4xODguOTg4UTQgMTEuNDc1IDQgMTJ0LjA2MiAxLjAxMnEuMDYzLjQ4OC4xODguOTg4Wm01LjQgMGg0LjdxLjA3NS0uNS4xMTMtLjk4OC4wMzctLjQ4Ny4wMzctMS4wMTJ0LS4wMzctMS4wMTJxLS4wMzgtLjQ4OC0uMTEzLS45ODhoLTQuN3EtLjA3NS41LS4xMTIuOTg4UTkuNSAxMS40NzUgOS41IDEydC4wMzggMS4wMTJxLjAzNy40ODguMTEyLjk4OFptNi43IDBoMy40cS4xMjUtLjUuMTg4LS45ODhRMjAgMTIuNTI1IDIwIDEydC0uMDYyLTEuMDEycS0uMDYzLS40ODgtLjE4OC0uOTg4aC0zLjRxLjA3NS41LjExMi45ODguMDM4LjQ4Ny4wMzggMS4wMTJ0LS4wMzggMS4wMTJxLS4wMzcuNDg4LS4xMTIuOTg4Wm0tLjQtNmgyLjk1cS0uNzI1LTEuMjUtMS44MTMtMi4xNzVRMTYgNC45IDE0LjYgNC40NXEuNDUuODI1Ljc4OCAxLjcxMi4zMzcuODg4LjU2MiAxLjgzOFpNMTAuMSA4aDMuOHEtLjMtMS4xLS43NzUtMi4wNzVRMTIuNjUgNC45NSAxMiA0LjA1cS0uNjUuOS0xLjEyNSAxLjg3NVQxMC4xIDhabS01IDBoMi45NXEuMjI1LS45NS41NjMtMS44MzguMzM3LS44ODcuNzg3LTEuNzEyUTggNC45IDYuOTEyIDUuODI1IDUuODI1IDYuNzUgNS4xIDhaXCIvPjwvc3ZnPmAsXHJcbiAgU1BBQ0U6IGAgYCxcclxuICBUQUI6IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+PHBhdGggZD1cIm0xMiAxOC0xLjQyNS0xLjQgMy42LTMuNkgydi0yaDEyLjE3NUwxMC42IDcuNCAxMiA2bDYgNlptOCAwVjZoMnYxMlpcIi8+PC9zdmc+YCxcclxufTtcclxuIl19
@@ -27,6 +27,21 @@ export class NgxTouchKeyboardComponent {
27
27
  this.isStandardButton = (button) => button && !(button[0] === '{' && button[button.length - 1] === '}');
28
28
  }
29
29
  // -----------------------------------------------------------------------------------------------------
30
+ // @ Accessors
31
+ // -----------------------------------------------------------------------------------------------------
32
+ /**
33
+ * Getter for maxLength
34
+ */
35
+ get maxLength() {
36
+ return this._activeInputElement?.maxLength ?? -1;
37
+ }
38
+ /**
39
+ * Getter for type of input
40
+ */
41
+ get isTextarea() {
42
+ return this._activeInputElement?.type === 'textarea';
43
+ }
44
+ // -----------------------------------------------------------------------------------------------------
30
45
  // @ Decorated methods
31
46
  // -----------------------------------------------------------------------------------------------------
32
47
  /**
@@ -180,28 +195,34 @@ export class NgxTouchKeyboardComponent {
180
195
  true,
181
196
  ];
182
197
  let output = this._activeInputElement?.value || '';
198
+ // Handel functional button
183
199
  if (!this.isStandardButton(button)) {
184
- // Handel functional button
200
+ // Handel BACKSPACE
185
201
  if (button === fnButton.BACKSPACE) {
186
- if (output.length > 0)
187
- output = this._removeAt(output, ...commonParams);
202
+ output = this._removeAt(output, ...commonParams);
188
203
  }
204
+ // Handel SPACE
189
205
  else if (button === fnButton.SPACE) {
190
206
  output = this._addStringAt(output, ' ', ...commonParams);
191
207
  }
208
+ // Handel TAB
192
209
  else if (button === fnButton.TAB) {
193
210
  output = this._addStringAt(output, '\t', ...commonParams);
194
211
  }
212
+ // Handel ENTER
195
213
  else if (button === fnButton.ENTER) {
196
- output = this._addStringAt(output, '\n', ...commonParams);
214
+ if (this.isTextarea) {
215
+ output = this._addStringAt(output, '\n', ...commonParams);
216
+ }
197
217
  }
218
+ // Handel LAYOUT
198
219
  else {
199
220
  this.layoutName = button.substring(1, button.length - 1);
200
221
  return;
201
222
  }
202
223
  }
224
+ // Handel standard button
203
225
  else {
204
- // Handel standard button
205
226
  output = this._addStringAt(output, button, ...commonParams);
206
227
  }
207
228
  if (this._activeInputElement) {
@@ -316,6 +337,12 @@ export class NgxTouchKeyboardComponent {
316
337
  _updateCaretPos(length, minus = false) {
317
338
  const newCaretPos = this._updateCaretPosAction(length, minus);
318
339
  this._setCaretPosition(newCaretPos);
340
+ // Scroll to bottom
341
+ setTimeout(() => {
342
+ this._activeInputElement?.scrollTo({
343
+ top: this._activeInputElement.scrollHeight,
344
+ });
345
+ });
319
346
  }
320
347
  /**
321
348
  * Action method of updateCaretPos
@@ -405,6 +432,9 @@ export class NgxTouchKeyboardComponent {
405
432
  * @param moveCaret Whether to update virtual-keyboard cursor
406
433
  */
407
434
  _addStringAt(source, str, position = source.length, positionEnd = source.length, moveCaret = false) {
435
+ if (this.maxLength !== -1 && source.length >= this.maxLength) {
436
+ return source;
437
+ }
408
438
  let output;
409
439
  if (!position && position !== 0) {
410
440
  output = source + str;
@@ -594,10 +624,10 @@ export class NgxTouchKeyboardComponent {
594
624
  }
595
625
  }
596
626
  NgxTouchKeyboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgxTouchKeyboardComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component });
597
- NgxTouchKeyboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.3", type: NgxTouchKeyboardComponent, selector: "ngx-touch-keyboard", outputs: { closePanel: "closePanel" }, host: { listeners: { "window:keyup": "handleKeyUp($event)", "window:keydown": "handleKeyDown($event)", "window:pointerup": "handleMouseUp($event)", "window:select": "handleSelect($event)", "window:selectionchange": "handleSelectionChange($event)" } }, ngImport: i0, template: "<div dir=\"ltr\" class=\"touch-keyboard\" [ngClass]=\"'layout-' + layoutName\">\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[getButtonClass(key)]\"\r\n [attr.data-layout]=\"layoutName\"\r\n (pointerdown)=\"\r\n handleButtonClicked(key, $event); handleButtonMouseDown(key, $event)\r\n \"\r\n (pointerup)=\"handleButtonMouseUp(key, $event)\"\r\n (pointercancel)=\"handleButtonMouseUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n", styles: [".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}:root{--tk-color-text: #27272a;--tk-background: rgba(238, 238, 238, .87);--tk-background-button: rgba(255, 255, 255, .96);--tk-background-button-fn: rgba(255, 255, 255, .5);--tk-background-button-active: rgba(0, 0, 0, .04)}.dark{--tk-color-text: #ffffff;--tk-background: rgba(33, 33, 33, .87);--tk-background-button: rgba(66, 66, 66, .96);--tk-background-button-fn: rgba(66, 66, 66, .5);--tk-background-button-active: rgba(255, 255, 255, .2)}ngx-touch-keyboard{width:100%;padding:.25rem .25rem .375rem;border-radius:.375rem;touch-action:manipulation;-webkit-user-select:none;user-select:none;display:flex;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--tk-background);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.ngx-touch-keyboard-fullScreen>ngx-touch-keyboard{border-radius:0}.touch-keyboard{flex:1 1 auto;max-width:840px}.touch-keyboard .touch-keyboard-row{display:flex;flex-direction:row}.touch-keyboard .touch-keyboard-row:not(:last-child){margin-bottom:.25rem}.touch-keyboard .touch-keyboard-key{width:20px;box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;text-align:center;margin:0;line-height:32px;padding:.25rem;border-radius:.375rem;font-size:14px;font-weight:500;display:flex;flex-grow:1;align-items:center;justify-content:center;color:var(--tk-color-text);background-color:var(--tk-background-button);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.touch-keyboard .touch-keyboard-key>svg{fill:var(--tk-color-text)}.touch-keyboard .touch-keyboard-key.function-key:not(.space-key){background-color:var(--tk-background-button-fn)}.touch-keyboard .touch-keyboard-key.active{background-color:var(--tk-background-button-active)!important}.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:4rem}.touch-keyboard .touch-keyboard-key.space-key{min-width:40%}.touch-keyboard .touch-keyboard-key[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%;max-width:none}.touch-keyboard .touch-keyboard-key:not(:last-child){margin-right:.25rem}@media (min-width: 600px){.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
627
+ NgxTouchKeyboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.3", type: NgxTouchKeyboardComponent, selector: "ngx-touch-keyboard", outputs: { closePanel: "closePanel" }, host: { listeners: { "window:keyup": "handleKeyUp($event)", "window:keydown": "handleKeyDown($event)", "window:pointerup": "handleMouseUp($event)", "window:select": "handleSelect($event)", "window:selectionchange": "handleSelectionChange($event)" } }, ngImport: i0, template: "<div\r\n dir=\"ltr\"\r\n class=\"touch-keyboard\"\r\n [ngClass]=\"'layout-' + layoutMode + '-' + layoutName\"\r\n>\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[getButtonClass(key)]\"\r\n [attr.data-layout]=\"layoutMode\"\r\n (pointerdown)=\"\r\n handleButtonClicked(key, $event); handleButtonMouseDown(key, $event)\r\n \"\r\n (pointerup)=\"handleButtonMouseUp(key, $event)\"\r\n (pointercancel)=\"handleButtonMouseUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n", styles: [".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}:root{--tk-color-text: #27272a;--tk-background: rgba(238, 238, 238, .87);--tk-background-button: rgba(255, 255, 255, .96);--tk-background-button-fn: rgba(255, 255, 255, .5);--tk-background-button-active: rgba(0, 0, 0, .04)}.dark{--tk-color-text: #ffffff;--tk-background: rgba(33, 33, 33, .87);--tk-background-button: rgba(66, 66, 66, .96);--tk-background-button-fn: rgba(66, 66, 66, .5);--tk-background-button-active: rgba(255, 255, 255, .2)}ngx-touch-keyboard{width:100%;padding:.25rem .25rem .375rem;border-radius:.375rem;touch-action:manipulation;-webkit-user-select:none;user-select:none;display:flex;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--tk-background);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.ngx-touch-keyboard-fullScreen>ngx-touch-keyboard{border-radius:0}.touch-keyboard{flex:1 1 auto;max-width:840px}.touch-keyboard .touch-keyboard-row{display:flex;flex-direction:row}.touch-keyboard .touch-keyboard-row:not(:last-child){margin-bottom:.25rem}.touch-keyboard .touch-keyboard-key{width:20px;box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;text-align:center;margin:0;line-height:32px;padding:.25rem;border-radius:.375rem;font-size:14px;font-weight:500;display:flex;flex-grow:1;align-items:center;justify-content:center;color:var(--tk-color-text);background-color:var(--tk-background-button);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.touch-keyboard .touch-keyboard-key>svg{fill:var(--tk-color-text)}.touch-keyboard .touch-keyboard-key.function-key:not(.space-key){background-color:var(--tk-background-button-fn)}.touch-keyboard .touch-keyboard-key.active{background-color:var(--tk-background-button-active)!important}.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:4rem}.touch-keyboard .touch-keyboard-key.space-key{min-width:40%}.touch-keyboard .touch-keyboard-key[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%!important;max-width:none!important}.touch-keyboard .touch-keyboard-key:not(:last-child){margin-right:.25rem}@media (min-width: 600px){.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
598
628
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImport: i0, type: NgxTouchKeyboardComponent, decorators: [{
599
629
  type: Component,
600
- args: [{ selector: 'ngx-touch-keyboard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div dir=\"ltr\" class=\"touch-keyboard\" [ngClass]=\"'layout-' + layoutName\">\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[getButtonClass(key)]\"\r\n [attr.data-layout]=\"layoutName\"\r\n (pointerdown)=\"\r\n handleButtonClicked(key, $event); handleButtonMouseDown(key, $event)\r\n \"\r\n (pointerup)=\"handleButtonMouseUp(key, $event)\"\r\n (pointercancel)=\"handleButtonMouseUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n", styles: [".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}:root{--tk-color-text: #27272a;--tk-background: rgba(238, 238, 238, .87);--tk-background-button: rgba(255, 255, 255, .96);--tk-background-button-fn: rgba(255, 255, 255, .5);--tk-background-button-active: rgba(0, 0, 0, .04)}.dark{--tk-color-text: #ffffff;--tk-background: rgba(33, 33, 33, .87);--tk-background-button: rgba(66, 66, 66, .96);--tk-background-button-fn: rgba(66, 66, 66, .5);--tk-background-button-active: rgba(255, 255, 255, .2)}ngx-touch-keyboard{width:100%;padding:.25rem .25rem .375rem;border-radius:.375rem;touch-action:manipulation;-webkit-user-select:none;user-select:none;display:flex;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--tk-background);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.ngx-touch-keyboard-fullScreen>ngx-touch-keyboard{border-radius:0}.touch-keyboard{flex:1 1 auto;max-width:840px}.touch-keyboard .touch-keyboard-row{display:flex;flex-direction:row}.touch-keyboard .touch-keyboard-row:not(:last-child){margin-bottom:.25rem}.touch-keyboard .touch-keyboard-key{width:20px;box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;text-align:center;margin:0;line-height:32px;padding:.25rem;border-radius:.375rem;font-size:14px;font-weight:500;display:flex;flex-grow:1;align-items:center;justify-content:center;color:var(--tk-color-text);background-color:var(--tk-background-button);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.touch-keyboard .touch-keyboard-key>svg{fill:var(--tk-color-text)}.touch-keyboard .touch-keyboard-key.function-key:not(.space-key){background-color:var(--tk-background-button-fn)}.touch-keyboard .touch-keyboard-key.active{background-color:var(--tk-background-button-active)!important}.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:4rem}.touch-keyboard .touch-keyboard-key.space-key{min-width:40%}.touch-keyboard .touch-keyboard-key[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%;max-width:none}.touch-keyboard .touch-keyboard-key:not(:last-child){margin-right:.25rem}@media (min-width: 600px){.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"] }]
630
+ args: [{ selector: 'ngx-touch-keyboard', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\r\n dir=\"ltr\"\r\n class=\"touch-keyboard\"\r\n [ngClass]=\"'layout-' + layoutMode + '-' + layoutName\"\r\n>\r\n <ng-container\r\n *ngFor=\"\r\n let row of locale.layouts[layoutMode + '_' + layoutName];\r\n let rowIndex = index\r\n \"\r\n >\r\n <div class=\"touch-keyboard-row\">\r\n <ng-container *ngFor=\"let key of row; let keyIndex = index\">\r\n <button\r\n [name]=\"key\"\r\n [dir]=\"locale.dir\"\r\n class=\"touch-keyboard-key\"\r\n [ngClass]=\"[getButtonClass(key)]\"\r\n [attr.data-layout]=\"layoutMode\"\r\n (pointerdown)=\"\r\n handleButtonClicked(key, $event); handleButtonMouseDown(key, $event)\r\n \"\r\n (pointerup)=\"handleButtonMouseUp(key, $event)\"\r\n (pointercancel)=\"handleButtonMouseUp(key, $event)\"\r\n [innerHtml]=\"getButtonDisplayName(key)\"\r\n ></button>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n</div>\r\n", styles: [".cdk-overlay-container,.cdk-global-overlay-wrapper{pointer-events:none;top:0;left:0;height:100%;width:100%}.cdk-overlay-container{position:fixed;z-index:1000}.cdk-overlay-container:empty{display:none}.cdk-global-overlay-wrapper{display:flex;position:absolute;z-index:1000}.cdk-overlay-pane{position:absolute;pointer-events:auto;box-sizing:border-box;z-index:1000;display:flex;max-width:100%;max-height:100%}.cdk-overlay-backdrop{position:absolute;inset:0;z-index:1000;pointer-events:auto;-webkit-tap-highlight-color:rgba(0,0,0,0);transition:opacity .4s cubic-bezier(.25,.8,.25,1);opacity:0}.cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:1}.cdk-high-contrast-active .cdk-overlay-backdrop.cdk-overlay-backdrop-showing{opacity:.6}.cdk-overlay-dark-backdrop{background:rgba(0,0,0,.32)}.cdk-overlay-transparent-backdrop{transition:visibility 1ms linear,opacity 1ms linear;visibility:hidden;opacity:1}.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing{opacity:0;visibility:visible}.cdk-overlay-backdrop-noop-animation{transition:none}.cdk-overlay-connected-position-bounding-box{position:absolute;z-index:1000;display:flex;flex-direction:column;min-width:1px;min-height:1px}.cdk-global-scrollblock{position:fixed;width:100%;overflow-y:scroll}:root{--tk-color-text: #27272a;--tk-background: rgba(238, 238, 238, .87);--tk-background-button: rgba(255, 255, 255, .96);--tk-background-button-fn: rgba(255, 255, 255, .5);--tk-background-button-active: rgba(0, 0, 0, .04)}.dark{--tk-color-text: #ffffff;--tk-background: rgba(33, 33, 33, .87);--tk-background-button: rgba(66, 66, 66, .96);--tk-background-button-fn: rgba(66, 66, 66, .5);--tk-background-button-active: rgba(255, 255, 255, .2)}ngx-touch-keyboard{width:100%;padding:.25rem .25rem .375rem;border-radius:.375rem;touch-action:manipulation;-webkit-user-select:none;user-select:none;display:flex;justify-content:center;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:var(--tk-background);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.ngx-touch-keyboard-fullScreen>ngx-touch-keyboard{border-radius:0}.touch-keyboard{flex:1 1 auto;max-width:840px}.touch-keyboard .touch-keyboard-row{display:flex;flex-direction:row}.touch-keyboard .touch-keyboard-row:not(:last-child){margin-bottom:.25rem}.touch-keyboard .touch-keyboard-key{width:20px;box-sizing:border-box;position:relative;-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;text-align:center;margin:0;line-height:32px;padding:.25rem;border-radius:.375rem;font-size:14px;font-weight:500;display:flex;flex-grow:1;align-items:center;justify-content:center;color:var(--tk-color-text);background-color:var(--tk-background-button);box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.touch-keyboard .touch-keyboard-key>svg{fill:var(--tk-color-text)}.touch-keyboard .touch-keyboard-key.function-key:not(.space-key){background-color:var(--tk-background-button-fn)}.touch-keyboard .touch-keyboard-key.active{background-color:var(--tk-background-button-active)!important}.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:4rem}.touch-keyboard .touch-keyboard-key.space-key{min-width:40%}.touch-keyboard .touch-keyboard-key[data-layout=numeric],.touch-keyboard .touch-keyboard-key[data-layout=decimal],.touch-keyboard .touch-keyboard-key[data-layout=tel]{width:33%!important;max-width:none!important}.touch-keyboard .touch-keyboard-key:not(:last-child){margin-right:.25rem}@media (min-width: 600px){.touch-keyboard .touch-keyboard-key.alphabetic-key,.touch-keyboard .touch-keyboard-key.backspace-key,.touch-keyboard .touch-keyboard-key.shift-key,.touch-keyboard .touch-keyboard-key.numeric-key,.touch-keyboard .touch-keyboard-key.symbolic-key,.touch-keyboard .touch-keyboard-key.language-key,.touch-keyboard .touch-keyboard-key.enter-key,.touch-keyboard .touch-keyboard-key.done-key{max-width:6rem}}\n"] }]
601
631
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ElementRef }, { type: undefined, decorators: [{
602
632
  type: Inject,
603
633
  args: [LOCALE_ID]
@@ -619,4 +649,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.3", ngImpor
619
649
  type: HostListener,
620
650
  args: ['window:selectionchange', ['$event']]
621
651
  }] } });
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDOzs7OztBQVNwQyxNQUFNLE9BQU8seUJBQXlCO0lBZ0JwQzs7T0FFRztJQUNILFlBQ1UsVUFBd0IsRUFDeEIsV0FBeUMsRUFDdEIsY0FBc0I7UUFGekMsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBOEI7UUFDdEIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFyQm5ELFdBQU0sR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzlCLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDcEIsZUFBVSxHQUFHLFlBQVksQ0FBQztRQUMxQixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRUosZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFeEMsdUJBQWtCLEdBQUcsUUFBUSxDQUFDO1FBSTlCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQyxzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBNEloRDs7V0FFRztRQUNILHFCQUFnQixHQUFHLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FDcEMsTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBdEluRSxDQUFDO0lBRUosd0dBQXdHO0lBQ3hHLHNCQUFzQjtJQUN0Qix3R0FBd0c7SUFFeEc7O09BRUc7SUFFSCxXQUFXLENBQUMsS0FBb0I7UUFDOUIsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbkM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFFSCxhQUFhLENBQUMsS0FBb0I7UUFDaEMsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO1lBQ25CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUVILGFBQWEsQ0FBQyxLQUFpQjtRQUM3QixJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBRUgsWUFBWSxDQUFDLEtBQVk7UUFDdkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUVILHFCQUFxQixDQUFDLEtBQVk7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCx3R0FBd0c7SUFDeEcsbUJBQW1CO0lBQ25CLHdHQUF3RztJQUV4Rzs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLFFBQWdCLElBQUksQ0FBQyxjQUFjO1FBQzNDLGtCQUFrQjtRQUNsQixLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsMEJBQTBCO1FBQzFCLElBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQXVCLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQy9ELElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQWUsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0Qsc0NBQXNDO2FBQ2pDO1lBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsS0FBNkM7UUFDMUQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztRQUVqQzs7V0FFRztRQUNILE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLENBQUM7UUFDdEQsSUFDRSxTQUFTO1lBQ1QsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQ2xFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxDQUN2QixFQUNEO1lBQ0EsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7U0FDN0I7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1NBQzFCO1FBRUQsSUFDRSxTQUFTO1lBQ1QsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxFQUMxRDtZQUNBLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1NBQzdCO2FBQU07WUFDTCxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQztTQUNoQztRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQ7O1dBRUc7UUFDSCxJQUFJLENBQUMsaUJBQWlCLENBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLEVBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQ3RDLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUNULGlCQUFpQixFQUNqQixJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsaUJBQWlCLENBQ3ZCLENBQUM7U0FDSDtRQUVELHlCQUF5QjtRQUN6QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBUUQ7Ozs7O09BS0c7SUFDSCxhQUFhLENBQUMsTUFBYztRQUMxQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsY0FBYyxDQUFDLE1BQWM7UUFDM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckUsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFFMUIsSUFBSSxlQUFlLEtBQUssY0FBYztZQUNwQyxnQkFBZ0IsR0FBRyxHQUFHLG1CQUFtQixNQUFNLENBQUM7UUFFbEQsT0FBTyxHQUFHLGVBQWUsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG9CQUFvQixDQUFDLE1BQWM7UUFDakMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQ3RDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsQ0FBUztRQUMzQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFVBQVU7Z0JBQ2IsSUFBSSxDQUFDLFVBQVUsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1lBQzVELE9BQU87U0FDUjthQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QixPQUFPO1NBQ1I7UUFFRCxNQUFNLFlBQVksR0FBOEI7WUFDOUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDO1lBQzNCLElBQUk7U0FDTCxDQUFDO1FBQ0YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFbkQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQywyQkFBMkI7WUFDM0IsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLFNBQVMsRUFBRTtnQkFDakMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7b0JBQUUsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7YUFDekU7aUJBQU0sSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRTtnQkFDcEMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDO2FBQzFEO2lCQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2xDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQzthQUMzRDtpQkFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxFQUFFO2dCQUNwQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsWUFBWSxDQUFDLENBQUM7YUFDM0Q7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPO2FBQ1I7U0FDRjthQUFNO1lBQ0wseUJBQXlCO1lBQ3pCLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsQ0FBQztTQUM3RDtRQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1lBRXhDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxPQUFPLENBQUMsR0FBRyxDQUNULFdBQVcsRUFDWCxJQUFJLENBQUMsY0FBYyxFQUNuQixJQUFJLENBQUMsaUJBQWlCLEVBQ3RCLFFBQVEsRUFDUixDQUFDLENBQ0YsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILHFCQUFxQixDQUFDLE1BQWMsRUFBRSxDQUFTO1FBQzdDLElBQUksQ0FBQyxFQUFFO1lBQ0w7O2VBRUc7WUFDSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3JCO1FBRUQ7O1dBRUc7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCO1lBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUM3QyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6Qjs7V0FFRztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDekMsSUFDRSxJQUFJLENBQUMsWUFBWTtnQkFDakIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQy9DLE1BQU0sS0FBSyxRQUFRLENBQUMsU0FBUztvQkFDN0IsTUFBTSxLQUFLLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDNUI7Z0JBQ0EsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO29CQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2lCQUNyQztnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDL0I7WUFDRCxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2xDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILG1CQUFtQixDQUFDLE1BQWMsRUFBRSxDQUFTO1FBQzNDLElBQUksQ0FBQyxFQUFFO1lBQ0w7O2VBRUc7WUFDSCxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDbkIsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQ3JCO1FBRUQ7O1dBRUc7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUUzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyx1QkFBdUI7WUFDOUIsWUFBWSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNILGdCQUFnQixDQUFDLE1BQWM7UUFDN0IsSUFBSSxJQUFJLENBQUMsdUJBQXVCO1lBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUU3Qzs7V0FFRztRQUNILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNwRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQzthQUM1QztRQUNILENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCx3R0FBd0c7SUFDeEcsb0JBQW9CO0lBQ3BCLHdHQUF3RztJQUV4Rzs7Ozs7O09BTUc7SUFDSyxpQkFBaUIsQ0FDdkIsUUFBdUIsRUFDdkIsV0FBVyxHQUFHLFFBQVE7UUFFdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssZUFBZSxDQUFDLE1BQWMsRUFBRSxLQUFLLEdBQUcsS0FBSztRQUNuRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0sscUJBQXFCLENBQUMsTUFBYyxFQUFFLEtBQUssR0FBRyxLQUFLO1FBQ3pELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFeEMsSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksYUFBYSxHQUFHLENBQUM7b0JBQUUsYUFBYSxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDL0Q7aUJBQU07Z0JBQ0wsYUFBYSxHQUFHLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDeEM7U0FDRjtRQUVELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssU0FBUyxDQUNmLE1BQWMsRUFDZCxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFDeEIsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQzNCLFNBQVMsR0FBRyxLQUFLO1FBRWpCLElBQUksUUFBUSxLQUFLLENBQUMsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksUUFBUSxLQUFLLFdBQVcsRUFBRTtZQUM1QixJQUFJLFlBQVksQ0FBQztZQUNqQixJQUFJLFlBQVksQ0FBQztZQUNqQixNQUFNLGVBQWUsR0FBRyxtQ0FBbUMsQ0FBQztZQUU1RDs7O2VBR0c7WUFDSCxJQUFJLFFBQVEsSUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO2dCQUM3QixZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN4RCxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbEUsSUFBSSxTQUFTO3dCQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUM5QztxQkFBTTtvQkFDTCxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2xFLElBQUksU0FBUzt3QkFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDOUM7YUFDRjtpQkFBTTtnQkFDTCxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQyxZQUFZLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFbkQsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLFNBQVM7d0JBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzlDO3FCQUFNO29CQUNMLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLFNBQVM7d0JBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzlDO2FBQ0Y7U0FDRjthQUFNO1lBQ0wsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0QsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxZQUFZLENBQ2xCLE1BQWMsRUFDZCxHQUFXLEVBQ1gsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQ3hCLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUMzQixTQUFTLEdBQUcsS0FBSztRQUVqQixJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksQ0FBQyxRQUFRLElBQUksUUFBUSxLQUFLLENBQUMsRUFBRTtZQUMvQixNQUFNLEdBQUcsTUFBTSxHQUFHLEdBQUcsQ0FBQztTQUN2QjthQUFNO1lBQ0wsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3ZFLEVBQUUsQ0FDSCxDQUFDO1lBQ0YsSUFBSSxTQUFTO2dCQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN4RDtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGVBQWUsQ0FBQyxNQUFjO1FBQ3BDLElBQUksR0FBRyxFQUFFLElBQUksQ0FBQztRQUNkLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ2hELGtCQUFrQjtZQUNsQixHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN2RCxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksR0FBRyxHQUFHLENBQUM7U0FDWjthQUFNO1lBQ0wsR0FBRyxHQUFHLE1BQU0sQ0FBQztZQUNiLElBQUksR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckMsQ0FBQyxDQUFDLFFBQVEsTUFBTSxFQUFFO2dCQUNsQixDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztTQUNsQztRQUVELE1BQU0sU0FBUyxHQUFzQjtZQUNuQyxPQUFPLEVBQUUsSUFBSTtZQUNiLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU87WUFDcEMsR0FBRyxFQUFFLEdBQUc7WUFDUixJQUFJLEVBQUUsSUFBSTtZQUNWLFFBQVEsRUFBRSxDQUFDO1NBQ1osQ0FBQztRQUVGLDZDQUE2QztRQUM3QyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUNyQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ3hDLENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUNyQyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQ3pDLENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLEVBQUUsYUFBYSxDQUNyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FDdEMsQ0FBQztRQUNGLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxhQUFhLENBQ3JDLElBQUksYUFBYSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FDdEMsQ0FBQztRQUVGLHlCQUF5QjtRQUN6QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxLQUFVO1FBQ25DLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN2QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ3hCLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNwRDtRQUVELE1BQU0sV0FBVyxHQUNmLGFBQWEsS0FBSyxVQUFVO1lBQzVCLENBQUMsYUFBYSxLQUFLLE9BQU87Z0JBQ3hCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQzVELEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNsQixDQUFDLENBQUM7UUFFUCxNQUFNLFVBQVUsR0FDZCxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYTtZQUMvQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRTFFLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQzNEOzs7ZUFHRztZQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FDcEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQzNCLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUMxQixDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxHQUFHLENBQ1QsV0FBVyxFQUNYLElBQUksQ0FBQyxjQUFjLEVBQ25CLElBQUksQ0FBQyxpQkFBaUIsRUFDdEIsS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUMzQyxLQUFLLENBQ04sQ0FBQzthQUNIO1NBQ0Y7YUFBTSxJQUNMLEtBQUssQ0FBQyxJQUFJLEtBQUssV0FBVztZQUMxQixJQUFJLENBQUMsbUJBQW1CLEtBQUssUUFBUSxDQUFDLGFBQWEsRUFDbkQ7WUFDQSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUM5QjtZQUNELE9BQU87U0FDUjthQUFNLElBQUksQ0FBQyxVQUFVLElBQUksS0FBSyxFQUFFLElBQUksS0FBSyxpQkFBaUIsRUFBRTtZQUMzRDs7ZUFFRztZQUNILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUU3QixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FDVCxnQ0FBZ0MsS0FBSyxFQUFFLElBQUksU0FBUyxFQUNwRCxLQUFLLENBQ04sQ0FBQzthQUNIO1lBRUQ7O2VBRUc7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEtBQUssRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FDekMsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssdUJBQXVCLENBQUMsS0FBb0I7UUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hEOztXQUVHO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLHFCQUFxQixDQUFDLEtBQW9CO1FBQ2hELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RDs7V0FFRztRQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxxQkFBcUIsQ0FBQyxLQUFvQjtRQUNoRCxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDO1FBRXRDLElBQ0UsS0FBSyxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDeEIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDekIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDNUIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUM7WUFDM0IsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFDdkI7WUFDQSxNQUFNLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDO1NBQ2xDO2FBQU0sSUFDTCxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUMxQixLQUFLLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztZQUN4QixLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUN0QjtZQUNBLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7U0FDakM7YUFBTTtZQUNMLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztTQUMxQjtRQUVELE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsVUFBa0I7UUFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhO2FBQ3hDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQzthQUM5QixTQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CLENBQUMsVUFBbUI7UUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUUsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3pDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNwRDtTQUNGO0lBQ0gsQ0FBQzs7c0hBMXNCVSx5QkFBeUIsd0VBc0IxQixTQUFTOzBHQXRCUix5QkFBeUIsNlZDeEJ0Qyw2OEJBMEJBOzJGREZhLHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDRSxvQkFBb0IsaUJBR2YsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs7MEJBd0I1QyxNQUFNOzJCQUFDLFNBQVM7NENBaEJULFVBQVU7c0JBQW5CLE1BQU07Z0JBMkJQLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWXhDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXMUMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVM1QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN6QyxxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIExPQ0FMRV9JRCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7IGZuQnV0dG9uIH0gZnJvbSAnLi9Mb2NhbGUvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnLi9Mb2NhbGUvdHlwZSc7XHJcbmltcG9ydCAqIGFzIExvY2FsZXMgZnJvbSAnLi9Mb2NhbGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtdG91Y2gta2V5Ym9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkQ29tcG9uZW50IHtcclxuICBsb2NhbGU6IExvY2FsZSA9IExvY2FsZXMuZW5VUztcclxuICBsYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gIGxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGNsb3NlUGFuZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgX2FjdGl2ZUJ1dHRvbkNsYXNzID0gJ2FjdGl2ZSc7XHJcbiAgcHJpdmF0ZSBfaG9sZEludGVyYWN0aW9uVGltZW91dCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9ob2xkVGltZW91dCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9pc01vdXNlSG9sZCE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfY2FyZXRQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2FyZXRQb3NpdGlvbkVuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYWN0aXZlSW5wdXRFbGVtZW50ITogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxyXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgX2RlZmF1bHRMb2NhbGU6IHN0cmluZ1xyXG4gICkge31cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIERlY29yYXRlZCBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5dXBcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICAgICAgdGhpcy5faGFuZGxlSGlnaGxpZ2h0S2V5VXAoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5ZG93blxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUhpZ2hsaWdodEtleURvd24oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gcG9pbnRlcnVwIChtb3VzZXVwIG9yIHRvdWNoZW5kKVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHNlbGVjdFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWxlY3QnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZVNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHNlbGVjdGlvbmNoYW5nZVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWxlY3Rpb25jaGFuZ2UnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZVNlbGVjdGlvbkNoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQCBQdWJsaWMgbWV0aG9kc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBsYXlvdXQga2V5Ym9hcmQgZm9yIGxvY2FsZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbHVlXHJcbiAgICovXHJcbiAgc2V0TG9jYWxlKHZhbHVlOiBzdHJpbmcgPSB0aGlzLl9kZWZhdWx0TG9jYWxlKTogdm9pZCB7XHJcbiAgICAvLyBub3JtYWxpemUgdmFsdWVcclxuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnLScsICcnKS50cmltKCk7XHJcbiAgICAvLyBTZXQgTG9jYWxlIGlmIHN1cHBvcnRlZFxyXG4gICAgaWYgKChPYmplY3Qua2V5cyhMb2NhbGVzKSBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgIHRoaXMubG9jYWxlID0gTG9jYWxlc1t2YWx1ZSBhcyAnZW5VUyddO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGRlZmF1bHQgTG9jYWxlIGlmIG5vdCBzdXBwb3J0ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmxvY2FsZSA9IExvY2FsZXMuZW5VUztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhY3RpdmUgaW5wdXRcclxuICAgKlxyXG4gICAqIEBwYXJhbSBpbnB1dCBJbnB1dCBuYXRpdmUgZWxlbWVudFxyXG4gICAqL1xyXG4gIHNldEFjdGl2ZUlucHV0KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50ID0gaW5wdXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFja2luZyBrZXlib2FyZCBsYXlvdXRcclxuICAgICAqL1xyXG4gICAgY29uc3QgaW5wdXRNb2RlID0gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5pbnB1dE1vZGU7XHJcbiAgICBpZiAoXHJcbiAgICAgIGlucHV0TW9kZSAmJlxyXG4gICAgICBbJ3RleHQnLCAnc2VhcmNoJywgJ2VtYWlsJywgJ3VybCcsICdudW1lcmljJywgJ2RlY2ltYWwnLCAndGVsJ10uc29tZShcclxuICAgICAgICAoaSkgPT4gaSA9PT0gaW5wdXRNb2RlXHJcbiAgICAgIClcclxuICAgICkge1xyXG4gICAgICB0aGlzLmxheW91dE1vZGUgPSBpbnB1dE1vZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dE1vZGUgPSAndGV4dCc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpbnB1dE1vZGUgJiZcclxuICAgICAgWydudW1lcmljJywgJ2RlY2ltYWwnLCAndGVsJ10uc29tZSgoaSkgPT4gaSA9PT0gaW5wdXRNb2RlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9ICdkZWZhdWx0JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9ICdhbHBoYWJldGljJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmxvZygnTG9jYWxlOicsIGAke3RoaXMubG9jYWxlLmNvZGUgfHwgdGhpcy5fZGVmYXVsdExvY2FsZX1gKTtcclxuICAgICAgY29uc29sZS5sb2coJ0xheW91dDonLCBgJHt0aGlzLmxheW91dE1vZGV9XyR7dGhpcy5sYXlvdXROYW1lfWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogd2UgbXVzdCBlbnN1cmUgY2FyZXRQb3NpdGlvbiBkb2Vzbid0IHBlcnNpc3Qgb25jZSByZWFjdGl2YXRlZC5cclxuICAgICAqL1xyXG4gICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0LFxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdDYXJldCBzdGFydCBhdDonLFxyXG4gICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFuZCBzZXQgZm9jdXMgdG8gaW5wdXRcclxuICAgIHRoaXMuX2ZvY3VzQWN0aXZlSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBhIHN0YW5kYXJkIGJ1dHRvblxyXG4gICAqL1xyXG4gIGlzU3RhbmRhcmRCdXR0b24gPSAoYnV0dG9uOiBzdHJpbmcpID0+XHJcbiAgICBidXR0b24gJiYgIShidXR0b25bMF0gPT09ICd7JyAmJiBidXR0b25bYnV0dG9uLmxlbmd0aCAtIDFdID09PSAnfScpO1xyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBidXR0b24gdHlwZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBidXR0b24gdHlwZVxyXG4gICAqL1xyXG4gIGdldEJ1dHRvblR5cGUoYnV0dG9uOiBzdHJpbmcpOiAnc3RhbmRhcmQta2V5JyB8ICdmdW5jdGlvbi1rZXknIHtcclxuICAgIHJldHVybiB0aGlzLmlzU3RhbmRhcmRCdXR0b24oYnV0dG9uKSA/ICdzdGFuZGFyZC1rZXknIDogJ2Z1bmN0aW9uLWtleSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGRlZmF1bHQgY2xhc3NlcyB0byBhIGdpdmVuIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBidXR0b25cclxuICAgKi9cclxuICBnZXRCdXR0b25DbGFzcyhidXR0b246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBidXR0b25UeXBlQ2xhc3MgPSB0aGlzLmdldEJ1dHRvblR5cGUoYnV0dG9uKTtcclxuICAgIGNvbnN0IGJ1dHRvbldpdGhvdXRCcmFjZXMgPSBidXR0b24ucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCd9JywgJycpO1xyXG4gICAgbGV0IGJ1dHRvbk5vcm1hbGl6ZWQgPSAnJztcclxuXHJcbiAgICBpZiAoYnV0dG9uVHlwZUNsYXNzICE9PSAnc3RhbmRhcmQta2V5JylcclxuICAgICAgYnV0dG9uTm9ybWFsaXplZCA9IGAke2J1dHRvbldpdGhvdXRCcmFjZXN9LWtleWA7XHJcblxyXG4gICAgcmV0dXJuIGAke2J1dHRvblR5cGVDbGFzc30gJHtidXR0b25Ob3JtYWxpemVkfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IChsYWJlbCkgbmFtZSBmb3IgYSBnaXZlbiBidXR0b25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbidzIGxheW91dCBuYW1lXHJcbiAgICogQHJldHVybiBUaGUgZGlzcGxheSBuYW1lIHRvIGJlIHNob3cgdG8gdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGdldEJ1dHRvbkRpc3BsYXlOYW1lKGJ1dHRvbjogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcclxuICAgICAgdGhpcy5sb2NhbGUuZGlzcGxheVtidXR0b25dIHx8IGJ1dHRvblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgY2xpY2tzIG1hZGUgdG8ga2V5Ym9hcmQgYnV0dG9uc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbkNsaWNrZWQoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBwcmVzc2VkOicsIGJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uU0hJRlQpIHtcclxuICAgICAgdGhpcy5sYXlvdXROYW1lID1cclxuICAgICAgICB0aGlzLmxheW91dE5hbWUgPT09ICdhbHBoYWJldGljJyA/ICdzaGlmdCcgOiAnYWxwaGFiZXRpYyc7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5ET05FKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQYW5lbC5lbWl0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21tb25QYXJhbXM6IFtudW1iZXIsIG51bWJlciwgYm9vbGVhbl0gPSBbXHJcbiAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb24gfHwgMCxcclxuICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZCB8fCAwLFxyXG4gICAgICB0cnVlLFxyXG4gICAgXTtcclxuICAgIGxldCBvdXRwdXQgPSB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnZhbHVlIHx8ICcnO1xyXG5cclxuICAgIGlmICghdGhpcy5pc1N0YW5kYXJkQnV0dG9uKGJ1dHRvbikpIHtcclxuICAgICAgLy8gSGFuZGVsIGZ1bmN0aW9uYWwgYnV0dG9uXHJcbiAgICAgIGlmIChidXR0b24gPT09IGZuQnV0dG9uLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgIGlmIChvdXRwdXQubGVuZ3RoID4gMCkgb3V0cHV0ID0gdGhpcy5fcmVtb3ZlQXQob3V0cHV0LCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgICB9IGVsc2UgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uU1BBQ0UpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsICcgJywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfSBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLlRBQikge1xyXG4gICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJ1xcdCcsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5FTlRFUikge1xyXG4gICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJ1xcbicsIC4uLmNvbW1vblBhcmFtcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5sYXlvdXROYW1lID0gYnV0dG9uLnN1YnN0cmluZygxLCBidXR0b24ubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBIYW5kZWwgc3RhbmRhcmQgYnV0dG9uXHJcbiAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgYnV0dG9uLCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnZhbHVlID0gb3V0cHV0O1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICAnQnV0dG9uJyxcclxuICAgICAgICAgIGVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGlzcGF0Y2hFdmVudHMoYnV0dG9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIG1vdXNlZG93blxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbk1vdXNlRG93bihidXR0b246IHN0cmluZywgZT86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogSGFuZGxlIGV2ZW50IG9wdGlvbnNcclxuICAgICAgICovXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZCBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fc2V0QWN0aXZlQnV0dG9uKGJ1dHRvbik7XHJcblxyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpXHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICAgIGlmICh0aGlzLl9ob2xkVGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KTtcclxuICAgIHRoaXMuX2lzTW91c2VIb2xkID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpbWUgdG8gd2FpdCB1bnRpbCBhIGtleSBob2xkIGlzIGRldGVjdGVkXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX2hvbGRUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5faXNNb3VzZUhvbGQgJiZcclxuICAgICAgICAoKCFidXR0b24uaW5jbHVkZXMoJ3snKSAmJiAhYnV0dG9uLmluY2x1ZGVzKCd9JykpIHx8XHJcbiAgICAgICAgICBidXR0b24gPT09IGZuQnV0dG9uLkJBQ0tTUEFDRSB8fFxyXG4gICAgICAgICAgYnV0dG9uID09PSBmbkJ1dHRvbi5TUEFDRSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdCdXR0b24gaGVsZDonLCBidXR0b24pO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbkhvbGQoYnV0dG9uKTtcclxuICAgICAgfVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZFRpbWVvdXQpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIG1vdXNldXBcclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBsYXlvdXQgbmFtZS5cclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGJ1dHRvbiBldmVudC5cclxuICAgKi9cclxuICBoYW5kbGVCdXR0b25Nb3VzZVVwKGJ1dHRvbjogc3RyaW5nLCBlPzogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmIChlKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBIYW5kbGUgZXZlbnQgb3B0aW9uc1xyXG4gICAgICAgKi9cclxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVtb3ZlIGFjdGl2ZSBjbGFzc1xyXG4gICAgICovXHJcbiAgICB0aGlzLl9yZW1vdmVBY3RpdmVCdXR0b24oKTtcclxuXHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpXHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgYnV0dG9uIGhvbGRcclxuICAgKi9cclxuICBoYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dClcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGltZW91dCBkaWN0YXRpbmcgdGhlIHNwZWVkIG9mIGtleSBob2xkIGl0ZXJhdGlvbnNcclxuICAgICAqL1xyXG4gICAgdGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKHRoaXMuX2lzTW91c2VIb2xkKSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25DbGlja2VkKGJ1dHRvbik7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpO1xyXG4gICAgICB9XHJcbiAgICB9LCAxMDApO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIFByaXZhdGUgbWV0aG9kc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZXMgdGhlIGludGVybmFsIGNhcmV0IHBvc2l0aW9uXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgY2FyZXQncyBzdGFydCBwb3NpdGlvblxyXG4gICAqIEBwYXJhbSBwb3NpdGlvbkVuZCBUaGUgY2FyZXQncyBlbmQgcG9zaXRpb25cclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRDYXJldFBvc2l0aW9uKFxyXG4gICAgcG9zaXRpb246IG51bWJlciB8IG51bGwsXHJcbiAgICBlbmRQb3NpdGlvbiA9IHBvc2l0aW9uXHJcbiAgKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jYXJldFBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kID0gZW5kUG9zaXRpb247XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHBvc2l0aW9uIGJ5IGEgZ2l2ZW4gYW1vdW50XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBsZW5ndGggUmVwcmVzZW50cyBieSBob3cgbWFueSBjaGFyYWN0ZXJzIHRoZSBpbnB1dCBzaG91bGQgYmUgbW92ZWRcclxuICAgKiBAcGFyYW0gbWludXMgV2hldGhlciB0aGUgY3Vyc29yIHNob3VsZCBiZSBtb3ZlZCB0byB0aGUgbGVmdCBvciBub3QuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfdXBkYXRlQ2FyZXRQb3MobGVuZ3RoOiBudW1iZXIsIG1pbnVzID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG5ld0NhcmV0UG9zID0gdGhpcy5fdXBkYXRlQ2FyZXRQb3NBY3Rpb24obGVuZ3RoLCBtaW51cyk7XHJcbiAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKG5ld0NhcmV0UG9zKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGlvbiBtZXRob2Qgb2YgdXBkYXRlQ2FyZXRQb3NcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGxlbmd0aCBSZXByZXNlbnRzIGJ5IGhvdyBtYW55IGNoYXJhY3RlcnMgdGhlIGlucHV0IHNob3VsZCBiZSBtb3ZlZFxyXG4gICAqIEBwYXJhbSBtaW51cyBXaGV0aGVyIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBsZWZ0IG9yIG5vdC5cclxuICAgKi9cclxuICBwcml2YXRlIF91cGRhdGVDYXJldFBvc0FjdGlvbihsZW5ndGg6IG51bWJlciwgbWludXMgPSBmYWxzZSkge1xyXG4gICAgbGV0IGNhcmV0UG9zaXRpb24gPSB0aGlzLl9jYXJldFBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChjYXJldFBvc2l0aW9uICE9IG51bGwpIHtcclxuICAgICAgaWYgKG1pbnVzKSB7XHJcbiAgICAgICAgaWYgKGNhcmV0UG9zaXRpb24gPiAwKSBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiAtIGxlbmd0aDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiArIGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjYXJldFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhbiBhbW91bnQgb2YgY2hhcmFjdGVycyBiZWZvcmUgYSBnaXZlbiBwb3NpdGlvblxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgaW5wdXRcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIChjdXJzb3IpIHBvc2l0aW9uIGZyb20gd2hlcmUgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHJlbW92ZWRcclxuICAgKiBAcGFyYW0gbW92ZUNhcmV0IFdoZXRoZXIgdG8gdXBkYXRlIGlucHV0IGN1cnNvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3JlbW92ZUF0KFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBwb3NpdGlvbiA9IHNvdXJjZS5sZW5ndGgsXHJcbiAgICBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsXHJcbiAgICBtb3ZlQ2FyZXQgPSBmYWxzZVxyXG4gICkge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSAwICYmIHBvc2l0aW9uRW5kID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG91dHB1dDtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPT09IHBvc2l0aW9uRW5kKSB7XHJcbiAgICAgIGxldCBwcmV2VHdvQ2hhcnM7XHJcbiAgICAgIGxldCBlbW9qaU1hdGNoZWQ7XHJcbiAgICAgIGNvbnN0IGVtb2ppTWF0Y2hlZFJlZyA9IC8oW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXSkvZztcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBFbW9qaXMgYXJlIG1hZGUgb3V0IG9mIHR3byBjaGFyYWN0ZXJzLCBzbyB3ZSBtdXN0IHRha2UgYSBjdXN0b20gYXBwcm9hY2ggdG8gdHJpbSB0aGVtLlxyXG4gICAgICAgKiBGb3IgbW9yZSBpbmZvOiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlXHJcbiAgICAgICAqL1xyXG4gICAgICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24gPj0gMCkge1xyXG4gICAgICAgIHByZXZUd29DaGFycyA9IHNvdXJjZS5zdWJzdHJpbmcocG9zaXRpb24gLSAyLCBwb3NpdGlvbik7XHJcbiAgICAgICAgZW1vamlNYXRjaGVkID0gcHJldlR3b0NoYXJzLm1hdGNoKGVtb2ppTWF0Y2hlZFJlZyk7XHJcblxyXG4gICAgICAgIGlmIChlbW9qaU1hdGNoZWQpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zdWJzdHIoMCwgcG9zaXRpb24gLSAyKSArIHNvdXJjZS5zdWJzdHIocG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMiwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zdWJzdHIoMCwgcG9zaXRpb24gLSAxKSArIHNvdXJjZS5zdWJzdHIocG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByZXZUd29DaGFycyA9IHNvdXJjZS5zbGljZSgtMik7XHJcbiAgICAgICAgZW1vamlNYXRjaGVkID0gcHJldlR3b0NoYXJzLm1hdGNoKGVtb2ppTWF0Y2hlZFJlZyk7XHJcblxyXG4gICAgICAgIGlmIChlbW9qaU1hdGNoZWQpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zbGljZSgwLCAtMik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygyLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKDEsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIHBvc2l0aW9uKSArIHNvdXJjZS5zbGljZShwb3NpdGlvbkVuZCk7XHJcbiAgICAgIGlmIChtb3ZlQ2FyZXQpIHtcclxuICAgICAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgc3RyaW5nIHRvIHRoZSBpbnB1dCBhdCBhIGdpdmVuIHBvc2l0aW9uXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbnB1dFxyXG4gICAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBhZGRcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIChjdXJzb3IpIHBvc2l0aW9uIHdoZXJlIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGFkZGVkXHJcbiAgICogQHBhcmFtIG1vdmVDYXJldCBXaGV0aGVyIHRvIHVwZGF0ZSB2aXJ0dWFsLWtleWJvYXJkIGN1cnNvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FkZFN0cmluZ0F0KFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBzdHI6IHN0cmluZyxcclxuICAgIHBvc2l0aW9uID0gc291cmNlLmxlbmd0aCxcclxuICAgIHBvc2l0aW9uRW5kID0gc291cmNlLmxlbmd0aCxcclxuICAgIG1vdmVDYXJldCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmICghcG9zaXRpb24gJiYgcG9zaXRpb24gIT09IDApIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlICsgc3RyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gW3NvdXJjZS5zbGljZSgwLCBwb3NpdGlvbiksIHN0ciwgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKV0uam9pbihcclxuICAgICAgICAnJ1xyXG4gICAgICApO1xyXG4gICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcyhzdHIubGVuZ3RoLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZCB0byBkaXNwYXRjaCBuZWNlc3Nhcnkga2V5Ym9hcmQgZXZlbnRzIHRvIGN1cnJlbnQgaW5wdXQgZWxlbWVudC5cclxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby91aWV2ZW50cy90b29scy9rZXktZXZlbnQtdmlld2VyLmh0bWxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25cclxuICAgKi9cclxuICBwcml2YXRlIF9kaXNwYXRjaEV2ZW50cyhidXR0b246IHN0cmluZykge1xyXG4gICAgbGV0IGtleSwgY29kZTtcclxuICAgIGlmIChidXR0b24uaW5jbHVkZXMoJ3snKSAmJiBidXR0b24uaW5jbHVkZXMoJ30nKSkge1xyXG4gICAgICAvLyBDYXBpdGFsaXplIG5hbWVcclxuICAgICAga2V5ID0gYnV0dG9uLnNsaWNlKDEsIGJ1dHRvbi5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XHJcbiAgICAgIGNvZGUgPSBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBrZXkgPSBidXR0b247XHJcbiAgICAgIGNvZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihidXR0b24pKVxyXG4gICAgICAgID8gYERpZ2l0JHtidXR0b259YFxyXG4gICAgICAgIDogYEtleSR7YnV0dG9uLnRvVXBwZXJDYXNlKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBldmVudEluaXQ6IEtleWJvYXJkRXZlbnRJbml0ID0ge1xyXG4gICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlLFxyXG4gICAgICBzaGlmdEtleTogdGhpcy5sYXlvdXROYW1lID09ICdzaGlmdCcsXHJcbiAgICAgIGtleToga2V5LFxyXG4gICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICBsb2NhdGlvbjogMCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gU2ltdWxhdGUgYWxsIG5lZWRlZCBldmVudHMgb24gYmFzZSBlbGVtZW50XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgIG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBbmQgc2V0IGZvY3VzIHRvIGlucHV0XHJcbiAgICB0aGlzLl9mb2N1c0FjdGl2ZUlucHV0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhbiBldmVudCB0aGF0IHdhcnJhbnRzIGEgY3Vyc29yIHBvc2l0aW9uIHVwZGF0ZSBpcyB0cmlnZ2VyZWRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IHRhcmdldFRhZ05hbWUgPSAnJztcclxuICAgIGlmIChldmVudC50YXJnZXQudGFnTmFtZSkge1xyXG4gICAgICB0YXJnZXRUYWdOYW1lID0gZXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc1RleHRJbnB1dCA9XHJcbiAgICAgIHRhcmdldFRhZ05hbWUgPT09ICd0ZXh0YXJlYScgfHxcclxuICAgICAgKHRhcmdldFRhZ05hbWUgPT09ICdpbnB1dCcgJiZcclxuICAgICAgICBbJ3RleHQnLCAnc2VhcmNoJywgJ2VtYWlsJywgJ3Bhc3N3b3JkJywgJ3VybCcsICd0ZWwnXS5pbmNsdWRlcyhcclxuICAgICAgICAgIGV2ZW50LnRhcmdldC50eXBlXHJcbiAgICAgICAgKSk7XHJcblxyXG4gICAgY29uc3QgaXNLZXlib2FyZCA9XHJcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IHx8XHJcbiAgICAgIChldmVudC50YXJnZXQgJiYgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpO1xyXG5cclxuICAgIGlmIChpc1RleHRJbnB1dCAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBUcmFja3MgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICogQXMga2V5cyBhcmUgcHJlc3NlZCwgdGV4dCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgYXQgdGhhdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0LlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICBldmVudCAmJiBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBldmVudC50eXBlID09PSAncG9pbnRlcnVwJyAmJlxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5faXNNb3VzZUhvbGQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbk1vdXNlVXAoJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoIWlzS2V5Ym9hcmQgJiYgZXZlbnQ/LnR5cGUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihudWxsKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBgQ2FyZXQgcG9zaXRpb24gcmVzZXQgZHVlIHRvIFwiJHtldmVudD8udHlwZX1cIiBldmVudGAsXHJcbiAgICAgICAgICBldmVudFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBDbG9zZSBwYW5lbFxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvY3VzIHRvIGlucHV0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2ZvY3VzQWN0aXZlSW5wdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKFxyXG4gICAgICB0aGlzLl9jYXJldFBvc2l0aW9uLFxyXG4gICAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGVsIGhpZ2hsaWdodCBvbiBrZXkgZG93blxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9oYW5kbGVIaWdobGlnaHRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRlbCBoaWdobGlnaHQgb24ga2V5IHVwXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUhpZ2hsaWdodEtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3JlbW92ZUFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgYSBLZXlib2FyZEV2ZW50J3MgXCJrZXkuY29kZVwiIHN0cmluZyBpbnRvIGEgdmlydHVhbC1rZXlib2FyZCBsYXlvdXQgZm9ybWF0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldEtleWJvYXJkTGF5b3V0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gJyc7XHJcbiAgICBjb25zdCBrZXlJZCA9IGV2ZW50LmNvZGUgfHwgZXZlbnQua2V5O1xyXG5cclxuICAgIGlmIChcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdTcGFjZScpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnTnVtcGFkJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdCYWNrc3BhY2UnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0NhcHNMb2NrJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdNZXRhJylcclxuICAgICkge1xyXG4gICAgICBvdXRwdXQgPSBgeyR7ZXZlbnQuY29kZX19YCB8fCAnJztcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnQ29udHJvbCcpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnU2hpZnQnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0FsdCcpXHJcbiAgICApIHtcclxuICAgICAgb3V0cHV0ID0gYHske2V2ZW50LmtleX19YCB8fCAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG91dHB1dCA9IGV2ZW50LmtleSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IDEgPyBvdXRwdXQ/LnRvTG93ZXJDYXNlKCkgOiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgYWN0aXZlIGNsYXNzIGluIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbk5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRBY3RpdmVCdXR0b24oYnV0dG9uTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgLm5hbWVkSXRlbShidXR0b25OYW1lKTtcclxuICAgIGlmIChub2RlICYmIG5vZGUuY2xhc3NMaXN0KSB7XHJcbiAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCh0aGlzLl9hY3RpdmVCdXR0b25DbGFzcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYWN0aXZlIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbk5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIF9yZW1vdmVBY3RpdmVCdXR0b24oYnV0dG9uTmFtZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgaWYgKGJ1dHRvbk5hbWUpIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLm5hbWVkSXRlbShidXR0b25OYW1lKTtcclxuICAgICAgaWYgKG5vZGUgJiYgbm9kZS5jbGFzc0xpc3QpIHtcclxuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbm9kZXNbaV0uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9hY3RpdmVCdXR0b25DbGFzcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBkaXI9XCJsdHJcIiBjbGFzcz1cInRvdWNoLWtleWJvYXJkXCIgW25nQ2xhc3NdPVwiJ2xheW91dC0nICsgbGF5b3V0TmFtZVwiPlxyXG4gIDxuZy1jb250YWluZXJcclxuICAgICpuZ0Zvcj1cIlxyXG4gICAgICBsZXQgcm93IG9mIGxvY2FsZS5sYXlvdXRzW2xheW91dE1vZGUgKyAnXycgKyBsYXlvdXROYW1lXTtcclxuICAgICAgbGV0IHJvd0luZGV4ID0gaW5kZXhcclxuICAgIFwiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cInRvdWNoLWtleWJvYXJkLXJvd1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBrZXkgb2Ygcm93OyBsZXQga2V5SW5kZXggPSBpbmRleFwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIFtuYW1lXT1cImtleVwiXHJcbiAgICAgICAgICBbZGlyXT1cImxvY2FsZS5kaXJcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZC1rZXlcIlxyXG4gICAgICAgICAgW25nQ2xhc3NdPVwiW2dldEJ1dHRvbkNsYXNzKGtleSldXCJcclxuICAgICAgICAgIFthdHRyLmRhdGEtbGF5b3V0XT1cImxheW91dE5hbWVcIlxyXG4gICAgICAgICAgKHBvaW50ZXJkb3duKT1cIlxyXG4gICAgICAgICAgICBoYW5kbGVCdXR0b25DbGlja2VkKGtleSwgJGV2ZW50KTsgaGFuZGxlQnV0dG9uTW91c2VEb3duKGtleSwgJGV2ZW50KVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIChwb2ludGVydXApPVwiaGFuZGxlQnV0dG9uTW91c2VVcChrZXksICRldmVudClcIlxyXG4gICAgICAgICAgKHBvaW50ZXJjYW5jZWwpPVwiaGFuZGxlQnV0dG9uTW91c2VVcChrZXksICRldmVudClcIlxyXG4gICAgICAgICAgW2lubmVySHRtbF09XCJnZXRCdXR0b25EaXNwbGF5TmFtZShrZXkpXCJcclxuICAgICAgICA+PC9idXR0b24+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG4iXX0=
652
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRvdWNoLWtleWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10b3VjaC1rZXlib2FyZC9zcmMvbGliL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG91Y2gta2V5Ym9hcmQvc3JjL2xpYi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRTlDLE9BQU8sS0FBSyxPQUFPLE1BQU0sVUFBVSxDQUFDOzs7OztBQVNwQyxNQUFNLE9BQU8seUJBQXlCO0lBZ0JwQzs7T0FFRztJQUNILFlBQ1UsVUFBd0IsRUFDeEIsV0FBeUMsRUFDdEIsY0FBc0I7UUFGekMsZUFBVSxHQUFWLFVBQVUsQ0FBYztRQUN4QixnQkFBVyxHQUFYLFdBQVcsQ0FBOEI7UUFDdEIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFyQm5ELFdBQU0sR0FBVyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQzlCLGVBQVUsR0FBRyxNQUFNLENBQUM7UUFDcEIsZUFBVSxHQUFHLFlBQVksQ0FBQztRQUMxQixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRUosZUFBVSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFeEMsdUJBQWtCLEdBQUcsUUFBUSxDQUFDO1FBSTlCLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQyxzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBOEpoRDs7V0FFRztRQUNILHFCQUFnQixHQUFHLENBQUMsTUFB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QUksQ0FBQyxTQUFTLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7YUFBTTtZQUNMLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQzthQUNwRDtTQUNGO0lBQ0gsQ0FBQzs7c0hBbHZCVSx5QkFBeUIsd0VBc0IxQixTQUFTOzBHQXRCUix5QkFBeUIsNlZDeEJ0QyxtL0JBOEJBOzJGRE5hLHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDRSxvQkFBb0IsaUJBR2YsaUJBQWlCLENBQUMsSUFBSSxtQkFDcEIsdUJBQXVCLENBQUMsTUFBTTs7MEJBd0I1QyxNQUFNOzJCQUFDLFNBQVM7NENBaEJULFVBQVU7c0JBQW5CLE1BQU07Z0JBNkNQLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxjQUFjLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBWXhDLGFBQWE7c0JBRFosWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXMUMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVM1QyxZQUFZO3NCQURYLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVN6QyxxQkFBcUI7c0JBRHBCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5qZWN0LFxyXG4gIExPQ0FMRV9JRCxcclxuICBPdXRwdXQsXHJcbiAgVmlld0VuY2Fwc3VsYXRpb24sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuXHJcbmltcG9ydCB7IGZuQnV0dG9uIH0gZnJvbSAnLi9Mb2NhbGUvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgTG9jYWxlIH0gZnJvbSAnLi9Mb2NhbGUvdHlwZSc7XHJcbmltcG9ydCAqIGFzIExvY2FsZXMgZnJvbSAnLi9Mb2NhbGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtdG91Y2gta2V5Ym9hcmQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9uZ3gtdG91Y2gta2V5Ym9hcmQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL25neC10b3VjaC1rZXlib2FyZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOZ3hUb3VjaEtleWJvYXJkQ29tcG9uZW50IHtcclxuICBsb2NhbGU6IExvY2FsZSA9IExvY2FsZXMuZW5VUztcclxuICBsYXlvdXRNb2RlID0gJ3RleHQnO1xyXG4gIGxheW91dE5hbWUgPSAnYWxwaGFiZXRpYyc7XHJcbiAgZGVidWcgPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIGNsb3NlUGFuZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgX2FjdGl2ZUJ1dHRvbkNsYXNzID0gJ2FjdGl2ZSc7XHJcbiAgcHJpdmF0ZSBfaG9sZEludGVyYWN0aW9uVGltZW91dCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9ob2xkVGltZW91dCE6IG51bWJlcjtcclxuICBwcml2YXRlIF9pc01vdXNlSG9sZCE6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfY2FyZXRQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY2FyZXRQb3NpdGlvbkVuZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfYWN0aXZlSW5wdXRFbGVtZW50ITogSFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RvclxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+LFxyXG4gICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgX2RlZmF1bHRMb2NhbGU6IHN0cmluZ1xyXG4gICkge31cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIEFjY2Vzc29yc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHRlciBmb3IgbWF4TGVuZ3RoXHJcbiAgICovXHJcbiAgZ2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8ubWF4TGVuZ3RoID8/IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0dGVyIGZvciB0eXBlIG9mIGlucHV0XHJcbiAgICovXHJcbiAgZ2V0IGlzVGV4dGFyZWEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py50eXBlID09PSAndGV4dGFyZWEnO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICAvLyBAIERlY29yYXRlZCBtZXRob2RzXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5dXBcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5dXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICAgICAgdGhpcy5faGFuZGxlSGlnaGxpZ2h0S2V5VXAoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24ga2V5ZG93blxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZXZlbnQuaXNUcnVzdGVkKSB7XHJcbiAgICAgIHRoaXMuX2hhbmRsZUhpZ2hsaWdodEtleURvd24oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT24gcG9pbnRlcnVwIChtb3VzZXVwIG9yIHRvdWNoZW5kKVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpwb2ludGVydXAnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZU1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHNlbGVjdFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWxlY3QnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZVNlbGVjdChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHNlbGVjdGlvbmNoYW5nZVxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzZWxlY3Rpb25jaGFuZ2UnLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZVNlbGVjdGlvbkNoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuX2NhcmV0RXZlbnRIYW5kbGVyKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQCBQdWJsaWMgbWV0aG9kc1xyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBsYXlvdXQga2V5Ym9hcmQgZm9yIGxvY2FsZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIHZhbHVlXHJcbiAgICovXHJcbiAgc2V0TG9jYWxlKHZhbHVlOiBzdHJpbmcgPSB0aGlzLl9kZWZhdWx0TG9jYWxlKTogdm9pZCB7XHJcbiAgICAvLyBub3JtYWxpemUgdmFsdWVcclxuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnLScsICcnKS50cmltKCk7XHJcbiAgICAvLyBTZXQgTG9jYWxlIGlmIHN1cHBvcnRlZFxyXG4gICAgaWYgKChPYmplY3Qua2V5cyhMb2NhbGVzKSBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpKSB7XHJcbiAgICAgIHRoaXMubG9jYWxlID0gTG9jYWxlc1t2YWx1ZSBhcyAnZW5VUyddO1xyXG4gICAgfVxyXG4gICAgLy8gU2V0IGRlZmF1bHQgTG9jYWxlIGlmIG5vdCBzdXBwb3J0ZWRcclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmxvY2FsZSA9IExvY2FsZXMuZW5VUztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBhY3RpdmUgaW5wdXRcclxuICAgKlxyXG4gICAqIEBwYXJhbSBpbnB1dCBJbnB1dCBuYXRpdmUgZWxlbWVudFxyXG4gICAqL1xyXG4gIHNldEFjdGl2ZUlucHV0KGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50ID0gaW5wdXQ7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUcmFja2luZyBrZXlib2FyZCBsYXlvdXRcclxuICAgICAqL1xyXG4gICAgY29uc3QgaW5wdXRNb2RlID0gdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5pbnB1dE1vZGU7XHJcbiAgICBpZiAoXHJcbiAgICAgIGlucHV0TW9kZSAmJlxyXG4gICAgICBbJ3RleHQnLCAnc2VhcmNoJywgJ2VtYWlsJywgJ3VybCcsICdudW1lcmljJywgJ2RlY2ltYWwnLCAndGVsJ10uc29tZShcclxuICAgICAgICAoaSkgPT4gaSA9PT0gaW5wdXRNb2RlXHJcbiAgICAgIClcclxuICAgICkge1xyXG4gICAgICB0aGlzLmxheW91dE1vZGUgPSBpbnB1dE1vZGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmxheW91dE1vZGUgPSAndGV4dCc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpbnB1dE1vZGUgJiZcclxuICAgICAgWydudW1lcmljJywgJ2RlY2ltYWwnLCAndGVsJ10uc29tZSgoaSkgPT4gaSA9PT0gaW5wdXRNb2RlKVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9ICdkZWZhdWx0JztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9ICdhbHBoYWJldGljJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xyXG4gICAgICBjb25zb2xlLmxvZygnTG9jYWxlOicsIGAke3RoaXMubG9jYWxlLmNvZGUgfHwgdGhpcy5fZGVmYXVsdExvY2FsZX1gKTtcclxuICAgICAgY29uc29sZS5sb2coJ0xheW91dDonLCBgJHt0aGlzLmxheW91dE1vZGV9XyR7dGhpcy5sYXlvdXROYW1lfWApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogd2UgbXVzdCBlbnN1cmUgY2FyZXRQb3NpdGlvbiBkb2Vzbid0IHBlcnNpc3Qgb25jZSByZWFjdGl2YXRlZC5cclxuICAgICAqL1xyXG4gICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0LFxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICdDYXJldCBzdGFydCBhdDonLFxyXG4gICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFuZCBzZXQgZm9jdXMgdG8gaW5wdXRcclxuICAgIHRoaXMuX2ZvY3VzQWN0aXZlSW5wdXQoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBhIHN0YW5kYXJkIGJ1dHRvblxyXG4gICAqL1xyXG4gIGlzU3RhbmRhcmRCdXR0b24gPSAoYnV0dG9uOiBzdHJpbmcpID0+XHJcbiAgICBidXR0b24gJiYgIShidXR0b25bMF0gPT09ICd7JyAmJiBidXR0b25bYnV0dG9uLmxlbmd0aCAtIDFdID09PSAnfScpO1xyXG5cclxuICAvKipcclxuICAgKiBSZXRyaWV2ZSBidXR0b24gdHlwZVxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBidXR0b24gdHlwZVxyXG4gICAqL1xyXG4gIGdldEJ1dHRvblR5cGUoYnV0dG9uOiBzdHJpbmcpOiAnc3RhbmRhcmQta2V5JyB8ICdmdW5jdGlvbi1rZXknIHtcclxuICAgIHJldHVybiB0aGlzLmlzU3RhbmRhcmRCdXR0b24oYnV0dG9uKSA/ICdzdGFuZGFyZC1rZXknIDogJ2Z1bmN0aW9uLWtleSc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGRlZmF1bHQgY2xhc3NlcyB0byBhIGdpdmVuIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uJ3MgbGF5b3V0IG5hbWVcclxuICAgKiBAcmV0dXJuIFRoZSBjbGFzc2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBidXR0b25cclxuICAgKi9cclxuICBnZXRCdXR0b25DbGFzcyhidXR0b246IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBidXR0b25UeXBlQ2xhc3MgPSB0aGlzLmdldEJ1dHRvblR5cGUoYnV0dG9uKTtcclxuICAgIGNvbnN0IGJ1dHRvbldpdGhvdXRCcmFjZXMgPSBidXR0b24ucmVwbGFjZSgneycsICcnKS5yZXBsYWNlKCd9JywgJycpO1xyXG4gICAgbGV0IGJ1dHRvbk5vcm1hbGl6ZWQgPSAnJztcclxuXHJcbiAgICBpZiAoYnV0dG9uVHlwZUNsYXNzICE9PSAnc3RhbmRhcmQta2V5JylcclxuICAgICAgYnV0dG9uTm9ybWFsaXplZCA9IGAke2J1dHRvbldpdGhvdXRCcmFjZXN9LWtleWA7XHJcblxyXG4gICAgcmV0dXJuIGAke2J1dHRvblR5cGVDbGFzc30gJHtidXR0b25Ob3JtYWxpemVkfWA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBkaXNwbGF5IChsYWJlbCkgbmFtZSBmb3IgYSBnaXZlbiBidXR0b25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbidzIGxheW91dCBuYW1lXHJcbiAgICogQHJldHVybiBUaGUgZGlzcGxheSBuYW1lIHRvIGJlIHNob3cgdG8gdGhlIGJ1dHRvblxyXG4gICAqL1xyXG4gIGdldEJ1dHRvbkRpc3BsYXlOYW1lKGJ1dHRvbjogc3RyaW5nKTogU2FmZUh0bWwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Nhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcclxuICAgICAgdGhpcy5sb2NhbGUuZGlzcGxheVtidXR0b25dIHx8IGJ1dHRvblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZXMgY2xpY2tzIG1hZGUgdG8ga2V5Ym9hcmQgYnV0dG9uc1xyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbiBUaGUgYnV0dG9uIGxheW91dCBuYW1lLlxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgYnV0dG9uIGV2ZW50LlxyXG4gICAqL1xyXG4gIGhhbmRsZUJ1dHRvbkNsaWNrZWQoYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgY29uc29sZS5sb2coJ0tleSBwcmVzc2VkOicsIGJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJ1dHRvbiA9PT0gZm5CdXR0b24uU0hJRlQpIHtcclxuICAgICAgdGhpcy5sYXlvdXROYW1lID1cclxuICAgICAgICB0aGlzLmxheW91dE5hbWUgPT09ICdhbHBoYWJldGljJyA/ICdzaGlmdCcgOiAnYWxwaGFiZXRpYyc7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5ET05FKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VQYW5lbC5lbWl0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb21tb25QYXJhbXM6IFtudW1iZXIsIG51bWJlciwgYm9vbGVhbl0gPSBbXHJcbiAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb24gfHwgMCxcclxuICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZCB8fCAwLFxyXG4gICAgICB0cnVlLFxyXG4gICAgXTtcclxuICAgIGxldCBvdXRwdXQgPSB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnZhbHVlIHx8ICcnO1xyXG5cclxuICAgIC8vIEhhbmRlbCBmdW5jdGlvbmFsIGJ1dHRvblxyXG4gICAgaWYgKCF0aGlzLmlzU3RhbmRhcmRCdXR0b24oYnV0dG9uKSkge1xyXG4gICAgICAvLyBIYW5kZWwgQkFDS1NQQUNFXHJcbiAgICAgIGlmIChidXR0b24gPT09IGZuQnV0dG9uLkJBQ0tTUEFDRSkge1xyXG4gICAgICAgIG91dHB1dCA9IHRoaXMuX3JlbW92ZUF0KG91dHB1dCwgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBIYW5kZWwgU1BBQ0VcclxuICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5TUEFDRSkge1xyXG4gICAgICAgIG91dHB1dCA9IHRoaXMuX2FkZFN0cmluZ0F0KG91dHB1dCwgJyAnLCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEhhbmRlbCBUQUJcclxuICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSBmbkJ1dHRvbi5UQUIpIHtcclxuICAgICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsICdcXHQnLCAuLi5jb21tb25QYXJhbXMpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIEhhbmRlbCBFTlRFUlxyXG4gICAgICBlbHNlIGlmIChidXR0b24gPT09IGZuQnV0dG9uLkVOVEVSKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNUZXh0YXJlYSkge1xyXG4gICAgICAgICAgb3V0cHV0ID0gdGhpcy5fYWRkU3RyaW5nQXQob3V0cHV0LCAnXFxuJywgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gSGFuZGVsIExBWU9VVFxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmxheW91dE5hbWUgPSBidXR0b24uc3Vic3RyaW5nKDEsIGJ1dHRvbi5sZW5ndGggLSAxKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIEhhbmRlbCBzdGFuZGFyZCBidXR0b25cclxuICAgIGVsc2Uge1xyXG4gICAgICBvdXRwdXQgPSB0aGlzLl9hZGRTdHJpbmdBdChvdXRwdXQsIGJ1dHRvbiwgLi4uY29tbW9uUGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50KSB7XHJcbiAgICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudC52YWx1ZSA9IG91dHB1dDtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAnQ2FyZXQgYXQ6JyxcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb24sXHJcbiAgICAgICAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kLFxyXG4gICAgICAgICAgJ0J1dHRvbicsXHJcbiAgICAgICAgICBlXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2Rpc3BhdGNoRXZlbnRzKGJ1dHRvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiBtb3VzZWRvd25cclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b24gVGhlIGJ1dHRvbiBsYXlvdXQgbmFtZS5cclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGJ1dHRvbiBldmVudC5cclxuICAgKi9cclxuICBoYW5kbGVCdXR0b25Nb3VzZURvd24oYnV0dG9uOiBzdHJpbmcsIGU/OiBFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGUpIHtcclxuICAgICAgLyoqXHJcbiAgICAgICAqIEhhbmRsZSBldmVudCBvcHRpb25zXHJcbiAgICAgICAqL1xyXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b24pO1xyXG5cclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgICBpZiAodGhpcy5faG9sZFRpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkVGltZW91dCk7XHJcbiAgICB0aGlzLl9pc01vdXNlSG9sZCA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaW1lIHRvIHdhaXQgdW50aWwgYSBrZXkgaG9sZCBpcyBkZXRlY3RlZFxyXG4gICAgICovXHJcbiAgICB0aGlzLl9ob2xkVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX2lzTW91c2VIb2xkICYmXHJcbiAgICAgICAgKCghYnV0dG9uLmluY2x1ZGVzKCd7JykgJiYgIWJ1dHRvbi5pbmNsdWRlcygnfScpKSB8fFxyXG4gICAgICAgICAgYnV0dG9uID09PSBmbkJ1dHRvbi5CQUNLU1BBQ0UgfHxcclxuICAgICAgICAgIGJ1dHRvbiA9PT0gZm5CdXR0b24uU1BBQ0UpXHJcbiAgICAgICkge1xyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQnV0dG9uIGhlbGQ6JywgYnV0dG9uKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oYW5kbGVCdXR0b25Ib2xkKGJ1dHRvbik7XHJcbiAgICAgIH1cclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvbGRUaW1lb3V0KTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiBtb3VzZXVwXHJcbiAgICpcclxuICAgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gbGF5b3V0IG5hbWUuXHJcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBidXR0b24gZXZlbnQuXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uTW91c2VVcChidXR0b246IHN0cmluZywgZT86IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoZSkge1xyXG4gICAgICAvKipcclxuICAgICAgICogSGFuZGxlIGV2ZW50IG9wdGlvbnNcclxuICAgICAgICovXHJcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlbW92ZSBhY3RpdmUgY2xhc3NcclxuICAgICAqL1xyXG4gICAgdGhpcy5fcmVtb3ZlQWN0aXZlQnV0dG9uKCk7XHJcblxyXG4gICAgdGhpcy5faXNNb3VzZUhvbGQgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KVxyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG9sZEludGVyYWN0aW9uVGltZW91dCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGVzIGJ1dHRvbiBob2xkXHJcbiAgICovXHJcbiAgaGFuZGxlQnV0dG9uSG9sZChidXR0b246IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQpXHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRpbWVvdXQgZGljdGF0aW5nIHRoZSBzcGVlZCBvZiBrZXkgaG9sZCBpdGVyYXRpb25zXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX2hvbGRJbnRlcmFjdGlvblRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLl9pc01vdXNlSG9sZCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uQ2xpY2tlZChidXR0b24pO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQnV0dG9uSG9sZChidXR0b24pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob2xkSW50ZXJhY3Rpb25UaW1lb3V0KTtcclxuICAgICAgfVxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgLy8gQCBQcml2YXRlIG1ldGhvZHNcclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG5cclxuICAvKipcclxuICAgKiBDaGFuZ2VzIHRoZSBpbnRlcm5hbCBjYXJldCBwb3NpdGlvblxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIGNhcmV0J3Mgc3RhcnQgcG9zaXRpb25cclxuICAgKiBAcGFyYW0gcG9zaXRpb25FbmQgVGhlIGNhcmV0J3MgZW5kIHBvc2l0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgIHBvc2l0aW9uOiBudW1iZXIgfCBudWxsLFxyXG4gICAgZW5kUG9zaXRpb24gPSBwb3NpdGlvblxyXG4gICk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2FyZXRQb3NpdGlvbiA9IHBvc2l0aW9uO1xyXG4gICAgdGhpcy5fY2FyZXRQb3NpdGlvbkVuZCA9IGVuZFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGN1cnNvciBwb3NpdGlvbiBieSBhIGdpdmVuIGFtb3VudFxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gbGVuZ3RoIFJlcHJlc2VudHMgYnkgaG93IG1hbnkgY2hhcmFjdGVycyB0aGUgaW5wdXQgc2hvdWxkIGJlIG1vdmVkXHJcbiAgICogQHBhcmFtIG1pbnVzIFdoZXRoZXIgdGhlIGN1cnNvciBzaG91bGQgYmUgbW92ZWQgdG8gdGhlIGxlZnQgb3Igbm90LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3VwZGF0ZUNhcmV0UG9zKGxlbmd0aDogbnVtYmVyLCBtaW51cyA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBuZXdDYXJldFBvcyA9IHRoaXMuX3VwZGF0ZUNhcmV0UG9zQWN0aW9uKGxlbmd0aCwgbWludXMpO1xyXG4gICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihuZXdDYXJldFBvcyk7XHJcbiAgICAvLyBTY3JvbGwgdG8gYm90dG9tXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5fYWN0aXZlSW5wdXRFbGVtZW50Py5zY3JvbGxUbyh7XHJcbiAgICAgICAgdG9wOiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LFxyXG4gICAgICB9IGFzIFNjcm9sbFRvT3B0aW9ucyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGlvbiBtZXRob2Qgb2YgdXBkYXRlQ2FyZXRQb3NcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGxlbmd0aCBSZXByZXNlbnRzIGJ5IGhvdyBtYW55IGNoYXJhY3RlcnMgdGhlIGlucHV0IHNob3VsZCBiZSBtb3ZlZFxyXG4gICAqIEBwYXJhbSBtaW51cyBXaGV0aGVyIHRoZSBjdXJzb3Igc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBsZWZ0IG9yIG5vdC5cclxuICAgKi9cclxuICBwcml2YXRlIF91cGRhdGVDYXJldFBvc0FjdGlvbihsZW5ndGg6IG51bWJlciwgbWludXMgPSBmYWxzZSkge1xyXG4gICAgbGV0IGNhcmV0UG9zaXRpb24gPSB0aGlzLl9jYXJldFBvc2l0aW9uO1xyXG5cclxuICAgIGlmIChjYXJldFBvc2l0aW9uICE9IG51bGwpIHtcclxuICAgICAgaWYgKG1pbnVzKSB7XHJcbiAgICAgICAgaWYgKGNhcmV0UG9zaXRpb24gPiAwKSBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiAtIGxlbmd0aDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbiArIGxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjYXJldFBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyBhbiBhbW91bnQgb2YgY2hhcmFjdGVycyBiZWZvcmUgYSBnaXZlbiBwb3NpdGlvblxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gc291cmNlIFRoZSBzb3VyY2UgaW5wdXRcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIChjdXJzb3IpIHBvc2l0aW9uIGZyb20gd2hlcmUgdGhlIGNoYXJhY3RlcnMgc2hvdWxkIGJlIHJlbW92ZWRcclxuICAgKiBAcGFyYW0gbW92ZUNhcmV0IFdoZXRoZXIgdG8gdXBkYXRlIGlucHV0IGN1cnNvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3JlbW92ZUF0KFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBwb3NpdGlvbiA9IHNvdXJjZS5sZW5ndGgsXHJcbiAgICBwb3NpdGlvbkVuZCA9IHNvdXJjZS5sZW5ndGgsXHJcbiAgICBtb3ZlQ2FyZXQgPSBmYWxzZVxyXG4gICkge1xyXG4gICAgaWYgKHBvc2l0aW9uID09PSAwICYmIHBvc2l0aW9uRW5kID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBzb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IG91dHB1dDtcclxuXHJcbiAgICBpZiAocG9zaXRpb24gPT09IHBvc2l0aW9uRW5kKSB7XHJcbiAgICAgIGxldCBwcmV2VHdvQ2hhcnM7XHJcbiAgICAgIGxldCBlbW9qaU1hdGNoZWQ7XHJcbiAgICAgIGNvbnN0IGVtb2ppTWF0Y2hlZFJlZyA9IC8oW1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXSkvZztcclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBFbW9qaXMgYXJlIG1hZGUgb3V0IG9mIHR3byBjaGFyYWN0ZXJzLCBzbyB3ZSBtdXN0IHRha2UgYSBjdXN0b20gYXBwcm9hY2ggdG8gdHJpbSB0aGVtLlxyXG4gICAgICAgKiBGb3IgbW9yZSBpbmZvOiBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC11bmljb2RlXHJcbiAgICAgICAqL1xyXG4gICAgICBpZiAocG9zaXRpb24gJiYgcG9zaXRpb24gPj0gMCkge1xyXG4gICAgICAgIHByZXZUd29DaGFycyA9IHNvdXJjZS5zdWJzdHJpbmcocG9zaXRpb24gLSAyLCBwb3NpdGlvbik7XHJcbiAgICAgICAgZW1vamlNYXRjaGVkID0gcHJldlR3b0NoYXJzLm1hdGNoKGVtb2ppTWF0Y2hlZFJlZyk7XHJcblxyXG4gICAgICAgIGlmIChlbW9qaU1hdGNoZWQpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zdWJzdHIoMCwgcG9zaXRpb24gLSAyKSArIHNvdXJjZS5zdWJzdHIocG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMiwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zdWJzdHIoMCwgcG9zaXRpb24gLSAxKSArIHNvdXJjZS5zdWJzdHIocG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKG1vdmVDYXJldCkgdGhpcy5fdXBkYXRlQ2FyZXRQb3MoMSwgdHJ1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByZXZUd29DaGFycyA9IHNvdXJjZS5zbGljZSgtMik7XHJcbiAgICAgICAgZW1vamlNYXRjaGVkID0gcHJldlR3b0NoYXJzLm1hdGNoKGVtb2ppTWF0Y2hlZFJlZyk7XHJcblxyXG4gICAgICAgIGlmIChlbW9qaU1hdGNoZWQpIHtcclxuICAgICAgICAgIG91dHB1dCA9IHNvdXJjZS5zbGljZSgwLCAtMik7XHJcbiAgICAgICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcygyLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIC0xKTtcclxuICAgICAgICAgIGlmIChtb3ZlQ2FyZXQpIHRoaXMuX3VwZGF0ZUNhcmV0UG9zKDEsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlLnNsaWNlKDAsIHBvc2l0aW9uKSArIHNvdXJjZS5zbGljZShwb3NpdGlvbkVuZCk7XHJcbiAgICAgIGlmIChtb3ZlQ2FyZXQpIHtcclxuICAgICAgICB0aGlzLl9zZXRDYXJldFBvc2l0aW9uKHBvc2l0aW9uKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgc3RyaW5nIHRvIHRoZSBpbnB1dCBhdCBhIGdpdmVuIHBvc2l0aW9uXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBpbnB1dFxyXG4gICAqIEBwYXJhbSBzdHIgVGhlIHN0cmluZyB0byBhZGRcclxuICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIChjdXJzb3IpIHBvc2l0aW9uIHdoZXJlIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGFkZGVkXHJcbiAgICogQHBhcmFtIG1vdmVDYXJldCBXaGV0aGVyIHRvIHVwZGF0ZSB2aXJ0dWFsLWtleWJvYXJkIGN1cnNvclxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2FkZFN0cmluZ0F0KFxyXG4gICAgc291cmNlOiBzdHJpbmcsXHJcbiAgICBzdHI6IHN0cmluZyxcclxuICAgIHBvc2l0aW9uID0gc291cmNlLmxlbmd0aCxcclxuICAgIHBvc2l0aW9uRW5kID0gc291cmNlLmxlbmd0aCxcclxuICAgIG1vdmVDYXJldCA9IGZhbHNlXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5tYXhMZW5ndGggIT09IC0xICYmIHNvdXJjZS5sZW5ndGggPj0gdGhpcy5tYXhMZW5ndGgpIHtcclxuICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgb3V0cHV0O1xyXG5cclxuICAgIGlmICghcG9zaXRpb24gJiYgcG9zaXRpb24gIT09IDApIHtcclxuICAgICAgb3V0cHV0ID0gc291cmNlICsgc3RyO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3V0cHV0ID0gW3NvdXJjZS5zbGljZSgwLCBwb3NpdGlvbiksIHN0ciwgc291cmNlLnNsaWNlKHBvc2l0aW9uRW5kKV0uam9pbihcclxuICAgICAgICAnJ1xyXG4gICAgICApO1xyXG4gICAgICBpZiAobW92ZUNhcmV0KSB0aGlzLl91cGRhdGVDYXJldFBvcyhzdHIubGVuZ3RoLCBmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG91dHB1dDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZCB0byBkaXNwYXRjaCBuZWNlc3Nhcnkga2V5Ym9hcmQgZXZlbnRzIHRvIGN1cnJlbnQgaW5wdXQgZWxlbWVudC5cclxuICAgKiBAc2VlIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby91aWV2ZW50cy90b29scy9rZXktZXZlbnQtdmlld2VyLmh0bWxcclxuICAgKlxyXG4gICAqIEBwYXJhbSBidXR0b25cclxuICAgKi9cclxuICBwcml2YXRlIF9kaXNwYXRjaEV2ZW50cyhidXR0b246IHN0cmluZykge1xyXG4gICAgbGV0IGtleSwgY29kZTtcclxuICAgIGlmIChidXR0b24uaW5jbHVkZXMoJ3snKSAmJiBidXR0b24uaW5jbHVkZXMoJ30nKSkge1xyXG4gICAgICAvLyBDYXBpdGFsaXplIG5hbWVcclxuICAgICAga2V5ID0gYnV0dG9uLnNsaWNlKDEsIGJ1dHRvbi5sZW5ndGggLSAxKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSk7XHJcbiAgICAgIGNvZGUgPSBrZXk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBrZXkgPSBidXR0b247XHJcbiAgICAgIGNvZGUgPSBOdW1iZXIuaXNJbnRlZ2VyKE51bWJlcihidXR0b24pKVxyXG4gICAgICAgID8gYERpZ2l0JHtidXR0b259YFxyXG4gICAgICAgIDogYEtleSR7YnV0dG9uLnRvVXBwZXJDYXNlKCl9YDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBldmVudEluaXQ6IEtleWJvYXJkRXZlbnRJbml0ID0ge1xyXG4gICAgICBidWJibGVzOiB0cnVlLFxyXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlLFxyXG4gICAgICBzaGlmdEtleTogdGhpcy5sYXlvdXROYW1lID09ICdzaGlmdCcsXHJcbiAgICAgIGtleToga2V5LFxyXG4gICAgICBjb2RlOiBjb2RlLFxyXG4gICAgICBsb2NhdGlvbjogMCxcclxuICAgIH07XHJcblxyXG4gICAgLy8gU2ltdWxhdGUgYWxsIG5lZWRlZCBldmVudHMgb24gYmFzZSBlbGVtZW50XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQoXHJcbiAgICAgIG5ldyBLZXlib2FyZEV2ZW50KCdrZXlkb3duJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleXByZXNzJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSB9KVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2FjdGl2ZUlucHV0RWxlbWVudD8uZGlzcGF0Y2hFdmVudChcclxuICAgICAgbmV3IEtleWJvYXJkRXZlbnQoJ2tleXVwJywgZXZlbnRJbml0KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBBbmQgc2V0IGZvY3VzIHRvIGlucHV0XHJcbiAgICB0aGlzLl9mb2N1c0FjdGl2ZUlucHV0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiBhbiBldmVudCB0aGF0IHdhcnJhbnRzIGEgY3Vyc29yIHBvc2l0aW9uIHVwZGF0ZSBpcyB0cmlnZ2VyZWRcclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHBhcmFtIGV2ZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfY2FyZXRFdmVudEhhbmRsZXIoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IHRhcmdldFRhZ05hbWUgPSAnJztcclxuICAgIGlmIChldmVudC50YXJnZXQudGFnTmFtZSkge1xyXG4gICAgICB0YXJnZXRUYWdOYW1lID0gZXZlbnQudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBpc1RleHRJbnB1dCA9XHJcbiAgICAgIHRhcmdldFRhZ05hbWUgPT09ICd0ZXh0YXJlYScgfHxcclxuICAgICAgKHRhcmdldFRhZ05hbWUgPT09ICdpbnB1dCcgJiZcclxuICAgICAgICBbJ3RleHQnLCAnc2VhcmNoJywgJ2VtYWlsJywgJ3Bhc3N3b3JkJywgJ3VybCcsICd0ZWwnXS5pbmNsdWRlcyhcclxuICAgICAgICAgIGV2ZW50LnRhcmdldC50eXBlXHJcbiAgICAgICAgKSk7XHJcblxyXG4gICAgY29uc3QgaXNLZXlib2FyZCA9XHJcbiAgICAgIGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IHx8XHJcbiAgICAgIChldmVudC50YXJnZXQgJiYgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpO1xyXG5cclxuICAgIGlmIChpc1RleHRJbnB1dCAmJiB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBUcmFja3MgY3VycmVudCBjdXJzb3IgcG9zaXRpb25cclxuICAgICAgICogQXMga2V5cyBhcmUgcHJlc3NlZCwgdGV4dCB3aWxsIGJlIGFkZGVkL3JlbW92ZWQgYXQgdGhhdCBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0LlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihcclxuICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKHRoaXMuZGVidWcpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICdDYXJldCBhdDonLFxyXG4gICAgICAgICAgdGhpcy5fY2FyZXRQb3NpdGlvbixcclxuICAgICAgICAgIHRoaXMuX2NhcmV0UG9zaXRpb25FbmQsXHJcbiAgICAgICAgICBldmVudCAmJiBldmVudC50YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpLFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBldmVudC50eXBlID09PSAncG9pbnRlcnVwJyAmJlxyXG4gICAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQgPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcclxuICAgICkge1xyXG4gICAgICBpZiAodGhpcy5faXNNb3VzZUhvbGQpIHtcclxuICAgICAgICB0aGlzLmhhbmRsZUJ1dHRvbk1vdXNlVXAoJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH0gZWxzZSBpZiAoIWlzS2V5Ym9hcmQgJiYgZXZlbnQ/LnR5cGUgIT09ICdzZWxlY3Rpb25jaGFuZ2UnKSB7XHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiB3ZSBtdXN0IGVuc3VyZSBjYXJldFBvc2l0aW9uIGRvZXNuJ3QgcGVyc2lzdCBvbmNlIHJlYWN0aXZhdGVkLlxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5fc2V0Q2FyZXRQb3NpdGlvbihudWxsKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmRlYnVnKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICBgQ2FyZXQgcG9zaXRpb24gcmVzZXQgZHVlIHRvIFwiJHtldmVudD8udHlwZX1cIiBldmVudGAsXHJcbiAgICAgICAgICBldmVudFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8qKlxyXG4gICAgICAgKiBDbG9zZSBwYW5lbFxyXG4gICAgICAgKi9cclxuICAgICAgdGhpcy5jbG9zZVBhbmVsLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZvY3VzIHRvIGlucHV0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2ZvY3VzQWN0aXZlSW5wdXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LmZvY3VzKCk7XHJcbiAgICB0aGlzLl9hY3RpdmVJbnB1dEVsZW1lbnQ/LnNldFNlbGVjdGlvblJhbmdlKFxyXG4gICAgICB0aGlzLl9jYXJldFBvc2l0aW9uLFxyXG4gICAgICB0aGlzLl9jYXJldFBvc2l0aW9uRW5kXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGVsIGhpZ2hsaWdodCBvbiBrZXkgZG93blxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIEtleWJvYXJkRXZlbnRcclxuICAgKi9cclxuICBwcml2YXRlIF9oYW5kbGVIaWdobGlnaHRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBBZGQgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3NldEFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRlbCBoaWdobGlnaHQgb24ga2V5IHVwXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2hhbmRsZUhpZ2hsaWdodEtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zdCBidXR0b25QcmVzc2VkID0gdGhpcy5fZ2V0S2V5Ym9hcmRMYXlvdXRLZXkoZXZlbnQpO1xyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmUgYWN0aXZlIGNsYXNzXHJcbiAgICAgKi9cclxuICAgIHRoaXMuX3JlbW92ZUFjdGl2ZUJ1dHRvbihidXR0b25QcmVzc2VkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zZm9ybXMgYSBLZXlib2FyZEV2ZW50J3MgXCJrZXkuY29kZVwiIHN0cmluZyBpbnRvIGEgdmlydHVhbC1rZXlib2FyZCBsYXlvdXQgZm9ybWF0XHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEBwYXJhbSBldmVudCBUaGUgS2V5Ym9hcmRFdmVudFxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2dldEtleWJvYXJkTGF5b3V0S2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBsZXQgb3V0cHV0ID0gJyc7XHJcbiAgICBjb25zdCBrZXlJZCA9IGV2ZW50LmNvZGUgfHwgZXZlbnQua2V5O1xyXG5cclxuICAgIGlmIChcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdTcGFjZScpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnTnVtcGFkJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdCYWNrc3BhY2UnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0NhcHNMb2NrJykgfHxcclxuICAgICAga2V5SWQ/LmluY2x1ZGVzKCdNZXRhJylcclxuICAgICkge1xyXG4gICAgICBvdXRwdXQgPSBgeyR7ZXZlbnQuY29kZX19YCB8fCAnJztcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnQ29udHJvbCcpIHx8XHJcbiAgICAgIGtleUlkPy5pbmNsdWRlcygnU2hpZnQnKSB8fFxyXG4gICAgICBrZXlJZD8uaW5jbHVkZXMoJ0FsdCcpXHJcbiAgICApIHtcclxuICAgICAgb3V0cHV0ID0gYHske2V2ZW50LmtleX19YCB8fCAnJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG91dHB1dCA9IGV2ZW50LmtleSB8fCAnJztcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gb3V0cHV0Lmxlbmd0aCA+IDEgPyBvdXRwdXQ/LnRvTG93ZXJDYXNlKCkgOiBvdXRwdXQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgYWN0aXZlIGNsYXNzIGluIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbk5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIF9zZXRBY3RpdmVCdXR0b24oYnV0dG9uTmFtZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBub2RlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYnV0dG9uJylcclxuICAgICAgLm5hbWVkSXRlbShidXR0b25OYW1lKTtcclxuICAgIGlmIChub2RlICYmIG5vZGUuY2xhc3NMaXN0KSB7XHJcbiAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZCh0aGlzLl9hY3RpdmVCdXR0b25DbGFzcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgYWN0aXZlIGJ1dHRvblxyXG4gICAqXHJcbiAgICogQHBhcmFtIGJ1dHRvbk5hbWVcclxuICAgKi9cclxuICBwcml2YXRlIF9yZW1vdmVBY3RpdmVCdXR0b24oYnV0dG9uTmFtZT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgbm9kZXMgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2J1dHRvbicpO1xyXG4gICAgaWYgKGJ1dHRvbk5hbWUpIHtcclxuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLm5hbWVkSXRlbShidXR0b25OYW1lKTtcclxuICAgICAgaWYgKG5vZGUgJiYgbm9kZS5jbGFzc0xpc3QpIHtcclxuICAgICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fYWN0aXZlQnV0dG9uQ2xhc3MpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbm9kZXNbaV0uY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9hY3RpdmVCdXR0b25DbGFzcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdlxyXG4gIGRpcj1cImx0clwiXHJcbiAgY2xhc3M9XCJ0b3VjaC1rZXlib2FyZFwiXHJcbiAgW25nQ2xhc3NdPVwiJ2xheW91dC0nICsgbGF5b3V0TW9kZSArICctJyArIGxheW91dE5hbWVcIlxyXG4+XHJcbiAgPG5nLWNvbnRhaW5lclxyXG4gICAgKm5nRm9yPVwiXHJcbiAgICAgIGxldCByb3cgb2YgbG9jYWxlLmxheW91dHNbbGF5b3V0TW9kZSArICdfJyArIGxheW91dE5hbWVdO1xyXG4gICAgICBsZXQgcm93SW5kZXggPSBpbmRleFxyXG4gICAgXCJcclxuICA+XHJcbiAgICA8ZGl2IGNsYXNzPVwidG91Y2gta2V5Ym9hcmQtcm93XCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGtleSBvZiByb3c7IGxldCBrZXlJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgW25hbWVdPVwia2V5XCJcclxuICAgICAgICAgIFtkaXJdPVwibG9jYWxlLmRpclwiXHJcbiAgICAgICAgICBjbGFzcz1cInRvdWNoLWtleWJvYXJkLWtleVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJbZ2V0QnV0dG9uQ2xhc3Moa2V5KV1cIlxyXG4gICAgICAgICAgW2F0dHIuZGF0YS1sYXlvdXRdPVwibGF5b3V0TW9kZVwiXHJcbiAgICAgICAgICAocG9pbnRlcmRvd24pPVwiXHJcbiAgICAgICAgICAgIGhhbmRsZUJ1dHRvbkNsaWNrZWQoa2V5LCAkZXZlbnQpOyBoYW5kbGVCdXR0b25Nb3VzZURvd24oa2V5LCAkZXZlbnQpXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgKHBvaW50ZXJ1cCk9XCJoYW5kbGVCdXR0b25Nb3VzZVVwKGtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAocG9pbnRlcmNhbmNlbCk9XCJoYW5kbGVCdXR0b25Nb3VzZVVwKGtleSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICBbaW5uZXJIdG1sXT1cImdldEJ1dHRvbkRpc3BsYXlOYW1lKGtleSlcIlxyXG4gICAgICAgID48L2J1dHRvbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2Rpdj5cclxuICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbiJdfQ==