ably-ui 8.7.0.dev.7021bee → 8.7.0.dev.7072b07

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.
Files changed (79) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -6
  3. data/README.md +15 -4
  4. data/lib/ably_ui/core/code/component.css +2 -0
  5. data/lib/ably_ui/core/code/component.js +739 -1
  6. data/lib/ably_ui/core/company_autocomplete/component.css +2 -0
  7. data/lib/ably_ui/core/company_autocomplete/component.js +1161 -1
  8. data/lib/ably_ui/core/connect_state_wrapper/component.js +22 -1
  9. data/lib/ably_ui/core/contact_footer/component.css +2 -0
  10. data/lib/ably_ui/core/contact_footer/component.js +211 -1
  11. data/lib/ably_ui/core/cookie_message/component.css +2 -0
  12. data/lib/ably_ui/core/cookie_message/component.js +82 -1
  13. data/lib/ably_ui/core/core.rb +12 -4
  14. data/lib/ably_ui/core/customer_logos/component.js +22 -1
  15. data/lib/ably_ui/core/dropdown_menu/component.js +22 -1
  16. data/lib/ably_ui/core/feature_footer/component.css +2 -0
  17. data/lib/ably_ui/core/feature_footer/component.js +211 -1
  18. data/lib/ably_ui/core/featured_link/component.css +2 -0
  19. data/lib/ably_ui/core/featured_link/component.js +82 -1
  20. data/lib/ably_ui/core/flash/component.css +2 -0
  21. data/lib/ably_ui/core/flash/component.js +82 -1
  22. data/lib/ably_ui/core/footer/component.css +23 -1
  23. data/lib/ably_ui/core/footer/component.js +82 -1
  24. data/lib/ably_ui/core/footer/footer.html.erb +120 -63
  25. data/lib/ably_ui/core/icon/component.js +22 -1
  26. data/lib/ably_ui/core/images/best-support-2023.svg +1 -0
  27. data/lib/ably_ui/core/images/fastest-implementation-2023.svg +1 -0
  28. data/lib/ably_ui/core/images/high-performer-2022.png +0 -0
  29. data/lib/ably_ui/core/images/high-performer-2023.svg +1 -0
  30. data/lib/ably_ui/core/images/highest-user-adoption-2022.png +0 -0
  31. data/lib/ably_ui/core/images/highest-user-adoption-2023.svg +1 -0
  32. data/lib/ably_ui/core/images/users-love-us-2022.png +0 -0
  33. data/lib/ably_ui/core/loader/component.js +22 -1
  34. data/lib/ably_ui/core/logo/component.js +22 -1
  35. data/lib/ably_ui/core/meganav/component.css +3 -3
  36. data/lib/ably_ui/core/meganav/component.js +992 -1
  37. data/lib/ably_ui/core/meganav/component.json +2 -2
  38. data/lib/ably_ui/core/meganav/meganav.rb +6 -6
  39. data/lib/ably_ui/core/meganav_blog_posts_list/component.js +1159 -1
  40. data/lib/ably_ui/core/meganav_content_company/component.js +22 -1
  41. data/lib/ably_ui/core/meganav_content_company/meganav_content_company.html.erb +9 -0
  42. data/lib/ably_ui/core/meganav_content_developers/component.js +22 -1
  43. data/lib/ably_ui/core/meganav_content_developers/meganav_content_developers.html.erb +30 -14
  44. data/lib/ably_ui/core/meganav_content_products/component.js +22 -0
  45. data/lib/ably_ui/core/{meganav_content_platform/meganav_content_platform.html.erb → meganav_content_products/meganav_content_products.html.erb} +15 -33
  46. data/lib/ably_ui/core/{meganav_content_platform/meganav_content_platform.rb → meganav_content_products/meganav_content_products.rb} +1 -1
  47. data/lib/ably_ui/core/meganav_content_use_cases/component.js +22 -1
  48. data/lib/ably_ui/core/meganav_content_use_cases/meganav_content_use_cases.html.erb +42 -38
  49. data/lib/ably_ui/core/meganav_control/component.js +241 -1
  50. data/lib/ably_ui/core/meganav_control_mobile_dropdown/component.js +180 -1
  51. data/lib/ably_ui/core/meganav_control_mobile_panel_close/component.js +142 -1
  52. data/lib/ably_ui/core/meganav_control_mobile_panel_open/component.js +170 -1
  53. data/lib/ably_ui/core/meganav_items_desktop/component.js +22 -1
  54. data/lib/ably_ui/core/meganav_items_desktop/meganav_items_desktop.rb +1 -1
  55. data/lib/ably_ui/core/meganav_items_mobile/component.js +22 -1
  56. data/lib/ably_ui/core/meganav_items_signed_in/component.js +22 -1
  57. data/lib/ably_ui/core/meganav_search/component.js +22 -1
  58. data/lib/ably_ui/core/meganav_search_autocomplete/component.js +295 -1
  59. data/lib/ably_ui/core/meganav_search_panel/component.js +22 -1
  60. data/lib/ably_ui/core/meganav_search_suggestions/component.js +258 -1
  61. data/lib/ably_ui/core/notice/component.css +2 -0
  62. data/lib/ably_ui/core/notice/component.js +872 -1
  63. data/lib/ably_ui/core/scripts.js +1465 -1
  64. data/lib/ably_ui/core/showcase/component.css +2 -0
  65. data/lib/ably_ui/core/showcase/component.js +343 -1
  66. data/lib/ably_ui/core/sign_out_link/component.js +22 -1
  67. data/lib/ably_ui/core/slider/component.css +2 -0
  68. data/lib/ably_ui/core/slider/component.js +255 -1
  69. data/lib/ably_ui/core/sprites.svg +99 -0
  70. data/lib/ably_ui/core/styles.css +3 -7
  71. data/lib/ably_ui/core/uptime/component.css +2 -0
  72. data/lib/ably_ui/core/uptime/component.js +82 -1
  73. data/lib/ably_ui/reset/scripts.js +1 -1
  74. data/lib/ably_ui/reset/styles.css +1 -11
  75. data/lib/ably_ui/version.rb +1 -1
  76. metadata +12 -7
  77. data/lib/ably_ui/core/meganav_content_platform/component.js +0 -1
  78. data/lib/ably_ui/react/connect_state_wrapper/component.js +0 -1
  79. data/lib/ably_ui/react/scripts.js +0 -1
@@ -1 +1,872 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("dompurify"),require("js-cookie"),require("lodash.throttle"),require("prop-types"),require("react"),require("redux")):"function"==typeof define&&define.amd?define([,,,,,],t):"object"==typeof exports?exports.AblyUi=t(require("dompurify"),require("js-cookie"),require("lodash.throttle"),require("prop-types"),require("react"),require("redux")):(e.AblyUi=e.AblyUi||{},e.AblyUi.Core=e.AblyUi.Core||{},e.AblyUi.Core.Notice=t(e[void 0],e[void 0],e[void 0],e[void 0],e[void 0],e[void 0]))}(this,(function(e,t,r,n,o,i){return(()=>{"use strict";var c={6357:t=>{t.exports=e},9349:e=>{e.exports=t},2040:e=>{e.exports=r},3474:e=>{e.exports=n},9281:e=>{e.exports=o},5044:e=>{e.exports=i}},a={};function u(e){var t=a[e];if(void 0!==t)return t.exports;var r=a[e]={exports:{}};return c[e](r,r.exports,u),r.exports}u.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return u.d(t,{a:t}),t},u.d=(e,t)=>{for(var r in t)u.o(t,r)&&!u.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},u.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var l={};return(()=>{u.d(l,{default:()=>M});var e=u(9349),t=u.n(e),r=u(2040),n=u.n(r),o=u(9281),i=u.n(o),c=u(6357),a=u.n(c),s=u(3474),f=u.n(s);let d=(e=21)=>{let t="",r=e;for(;r--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[64*Math.random()|0];return t};u(5044);var p=["name","size","color","additionalCSS"];function y(){return y=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},y.apply(this,arguments)}var m=function(e){var t=e.name,r=e.size,n=void 0===r?"0.75rem":r,o=e.color,c=void 0===o?"":o,a=e.additionalCSS,u=void 0===a?"":a,l=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,p);return i().createElement("svg",y({className:"".concat(c," ").concat(u),style:{width:n,height:n}},l),i().createElement("use",{xlinkHref:"#sprite-".concat(t)}))};m.propTypes={name:f().string.isRequired,size:f().string,color:f().string,additionalCSS:f().string};const b=m;function v(){return v=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var n in r)Object.prototype.hasOwnProperty.call(r,n)&&(e[n]=r[n])}return e},v.apply(this,arguments)}function h(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function g(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?h(Object(r),!0).forEach((function(t){w(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):h(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function O(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=e&&("undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"]);if(null!=r){var n,o,i=[],c=!0,a=!1;try{for(r=r.call(e);!(c=(n=r.next()).done)&&(i.push(n.value),!t||i.length!==t);c=!0);}catch(e){a=!0,o=e}finally{try{c||null==r.return||r.return()}finally{if(a)throw o}}return i}}(e,t)||x(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function w(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function j(e){return function(e){if(Array.isArray(e))return S(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||x(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function x(e,t){if(e){if("string"==typeof e)return S(e,t);var r=Object.prototype.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?S(e,t):void 0}}function S(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r<t;r++)n[r]=e[r];return n}var E="ui-flashes",P={items:[]},A=(w({},"flashes",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:P,t=arguments.length>1?arguments[1]:void 0;if("flash/push"===t.type){var r=Array.isArray(t.payload)?t.payload:[t.payload];return{items:[].concat(j(e.items),j(r))}}return e})),{type:f().oneOf(["error","success","notice","info","alert"]),content:f().string}),k={error:"bg-gui-error",success:"bg-zingy-green",notice:"bg-electric-cyan",info:"bg-electric-cyan",alert:"bg-active-orange"},q={error:"text-white",success:"text-cool-black",notice:"text-cool-black",info:"text-cool-black",alert:"text-white"},T=["success","info","notice"],C=function(e){var t=e.id,r=e.type,n=e.content,c=e.removeFlash,u=(0,o.useRef)(null),l=O((0,o.useState)(!1),2),s=l[0],f=l[1],d=O((0,o.useState)(0),2),p=d[0],y=d[1],m=O((0,o.useState)(!1),2),v=m[0],h=m[1],g=function(){u.current&&y(u.current.getBoundingClientRect().height),f(!0),setTimeout((function(){c(t)}),100)};(0,o.useEffect)((function(){return h(!0)}),[]),function(e,t){var r=(0,o.useRef)(null);(0,o.useEffect)((function(){return T.includes(e)&&(r.current=setTimeout((function(){t()}),8e3)),function(){r.current&&clearTimeout(r.current)}}),[])}(r,g);var w,j=v&&!s;w=p&&!s?{height:"".concat(p,"px")}:s?{height:0,marginTop:0,zIndex:-1}:{};var x=a().sanitize(n,{ALLOWED_TAGS:["a"],ALLOWED_ATTR:["href","data-method","rel"]}),S={notice:"icon-gui-ably-badge",success:"icon-gui-tick",error:"icon-gui-warning",alert:"icon-gui-warning"},E={notice:"text-cool-black",success:"text-cool-black",error:"text-white",alert:"text-white"};return i().createElement("div",{className:"ui-flash-message ui-grid-px ".concat(j?"ui-flash-message-enter":""),style:w,ref:u,"data-id":"ui-flash"},i().createElement("div",{className:"".concat(k[r]," p-32 flex align-center rounded shadow-container-subtle")},S[r]&&i().createElement(b,{name:S[r],color:E[r],size:"1.5rem",additionalCSS:"mr-16 self-baseline"}),i().createElement("p",{className:"ui-flash-text ".concat(q[r]),dangerouslySetInnerHTML:{__html:x}}),i().createElement("button",{type:"button",className:"p-0 ml-auto self-start focus:outline-none",onClick:g},i().createElement(b,{name:"icon-gui-close",color:E[r],size:"1.5rem",additionalCSS:"transition-colors"}))))};C.propTypes=g({},A);var I=function(e){var t=e.flashes,r=O((0,o.useState)([]),2),n=r[0],c=r[1],a=function(e){return c((function(t){return t.filter((function(t){return t.id!==e}))}))};return(0,o.useEffect)((function(){c((function(e){return[].concat(j(e),j(((null==t?void 0:t.items)||[]).map((function(e){return g(g({},e),{},{id:d(),removed:!1})}))))}))}),[t]),console.log({flashesWithIds:n}),i().createElement("div",{className:"ui-flash","data-id":E},n.filter((function(e){return!e.removed})).map((function(e){return i().createElement(C,v({removeFlash:a,key:e.id},e))})))};I.propTypes={flashes:f().shape({items:f().arrayOf(f().shape(A))})};function L(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function z(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}f().arrayOf(f().arrayOf(f().string));var D=function(e){var t=function(e){return(arguments.length>1&&void 0!==arguments[1]?arguments[1]:document).querySelector("[data-id=".concat(e,"]"))}(E);t&&(t.style.marginTop=e?"4rem":null)},N=function(e){window.matchMedia("(min-width: 65rem)").matches?e.style.display=null:e.style.display="none"},U=function(e){e.style.maxHeight=0,e.style.overflow="hidden",D(!1)},_=function(e){e.style.maxHeight=null,e.style.overflow=null,D(!0)};const M=function(e){var r=e.bannerContainer,o=e.cookieId,i=e.noticeId,c=e.options;if("undefined"==typeof window)return function(){};if(!r)return console.warn("A Notice component was initited but no notice container was found."),function(){};if(function(e,r){return(t().get(e)||"").includes(r)}(o,i))return function(){};N(r),_(r);var a=function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?L(Object(r),!0).forEach((function(t){z(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):L(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}({collapse:!0},c),u=a.collapse?function(e){window.scrollY>5&&U(e);var t=n()((function(){window.scrollY>5?U(e):e.style.overflow&&_(e)}),100);return document.addEventListener("scroll",t),function(){return document.removeEventListener("scroll",t)}}(r):function(){},l=function(e,r,n,o){var i=e.querySelector("button");if(!i)return function(){};var c=function(){r&&n&&function(e,r){var n=t().get(e)||"";t().set(e,"".concat(n.replace("".concat(r,","),"")+r,","),{expires:90})}(r,n),U(e),o()};return i.addEventListener("click",c),function(){return document.removeEventListener("click",c)}}(r,o,i,u),s=function(e){var t=n()((function(){N(e)}),100);return window.addEventListener("resize",t),function(){return window.removeEventListener("resize",t)}}(r);return function(){[l,u,s].forEach((function(e){return e()}))}}})(),l.default})()}));
1
+ (function webpackUniversalModuleDefinition(root, factory) {
2
+ if(typeof exports === 'object' && typeof module === 'object')
3
+ module.exports = factory(require("dompurify"), require("js-cookie"), require("lodash.throttle"), require("prop-types"), require("react"), require("redux"));
4
+ else if(typeof define === 'function' && define.amd)
5
+ define([, , , , , ], factory);
6
+ else if(typeof exports === 'object')
7
+ exports["AblyUi"] = factory(require("dompurify"), require("js-cookie"), require("lodash.throttle"), require("prop-types"), require("react"), require("redux"));
8
+ else
9
+ root["AblyUi"] = root["AblyUi"] || {}, root["AblyUi"]["Core"] = root["AblyUi"]["Core"] || {}, root["AblyUi"]["Core"]["Notice"] = factory(root[undefined], root[undefined], root[undefined], root[undefined], root[undefined], root[undefined]);
10
+ })(this, (__WEBPACK_EXTERNAL_MODULE_dompurify__, __WEBPACK_EXTERNAL_MODULE_js_cookie__, __WEBPACK_EXTERNAL_MODULE_lodash_throttle__, __WEBPACK_EXTERNAL_MODULE_prop_types__, __WEBPACK_EXTERNAL_MODULE_react__, __WEBPACK_EXTERNAL_MODULE_redux__) => {
11
+ return /******/ (() => { // webpackBootstrap
12
+ /******/ "use strict";
13
+ /******/ var __webpack_modules__ = ({
14
+
15
+ /***/ "./src/core/ConnectStateWrapper/component.jsx":
16
+ /*!****************************************************!*\
17
+ !*** ./src/core/ConnectStateWrapper/component.jsx ***!
18
+ \****************************************************/
19
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
20
+
21
+ __webpack_require__.r(__webpack_exports__);
22
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
23
+ /* harmony export */ "ConnectStateWrapper": () => (/* binding */ ConnectStateWrapper),
24
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
25
+ /* harmony export */ });
26
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
27
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
28
+ /* harmony import */ var _remote_data_store__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../remote-data-store */ "./src/core/remote-data-store.js");
29
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
30
+
31
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
32
+
33
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
34
+
35
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
36
+
37
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
38
+
39
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
40
+
41
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
42
+
43
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
44
+
45
+ function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
46
+
47
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
48
+
49
+
50
+
51
+ /*
52
+ Connect a react component to a global store.
53
+ This is similar to what react-redux does but uses our global store so
54
+ can share state with other React mount points or anything that uses the
55
+ store.
56
+ - selectors is an object where keys are your prop names and values are your select
57
+ functions that work on the store to retrieve the state you are interested in
58
+ - initial state is set in useEffect so the wrapped component needs to handle it's props set to undefined initially
59
+ */
60
+
61
+ var ConnectStateWrapper = function ConnectStateWrapper(Component, selectors) {
62
+ var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}),
63
+ _useState2 = _slicedToArray(_useState, 2),
64
+ state = _useState2[0],
65
+ setState = _useState2[1];
66
+
67
+ var setStateForKey = function setStateForKey(key) {
68
+ return function (storeState) {
69
+ return setState(function () {
70
+ return _defineProperty({}, key, storeState);
71
+ });
72
+ };
73
+ };
74
+
75
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
76
+ var store = (0,_remote_data_store__WEBPACK_IMPORTED_MODULE_1__.getRemoteDataStore)();
77
+ var resolvedState = Object.keys(selectors).reduce(function (acc, key) {
78
+ return _objectSpread(_objectSpread({}, acc), {}, _defineProperty({}, key, selectors[key](store)));
79
+ }, {}); // Set initial state
80
+
81
+ setState(resolvedState); // Create a store subscription for each selector. Depending on your use case, this can be inefficient.
82
+ // When optimising for renders, look for wins with selectors better for your use and using connectState directly.
83
+
84
+ Object.keys(selectors).forEach(function (key) {
85
+ (0,_remote_data_store__WEBPACK_IMPORTED_MODULE_1__.connectState)(selectors[key], setStateForKey(key));
86
+ });
87
+ }, []);
88
+
89
+ var WrappedComponent = function WrappedComponent(props) {
90
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Component, _extends({}, props, state));
91
+ };
92
+
93
+ return WrappedComponent;
94
+ };
95
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (ConnectStateWrapper);
96
+
97
+ /***/ }),
98
+
99
+ /***/ "./src/core/Flash/component.jsx":
100
+ /*!**************************************!*\
101
+ !*** ./src/core/Flash/component.jsx ***!
102
+ \**************************************/
103
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
104
+
105
+ __webpack_require__.r(__webpack_exports__);
106
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
107
+ /* harmony export */ "FLASH_DATA_ID": () => (/* binding */ FLASH_DATA_ID),
108
+ /* harmony export */ "Flashes": () => (/* binding */ Flashes),
109
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__),
110
+ /* harmony export */ "reducerFlashes": () => (/* binding */ reducerFlashes)
111
+ /* harmony export */ });
112
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
113
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
114
+ /* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! dompurify */ "dompurify");
115
+ /* harmony import */ var dompurify__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dompurify__WEBPACK_IMPORTED_MODULE_1__);
116
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ "prop-types");
117
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__);
118
+ /* harmony import */ var nanoid_non_secure__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! nanoid/non-secure */ "./node_modules/nanoid/non-secure/index.js");
119
+ /* harmony import */ var _remote_data_store__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../remote-data-store */ "./src/core/remote-data-store.js");
120
+ /* harmony import */ var _ConnectStateWrapper_component_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ConnectStateWrapper/component.jsx */ "./src/core/ConnectStateWrapper/component.jsx");
121
+ /* harmony import */ var _Icon_component_jsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../Icon/component.jsx */ "./src/core/Icon/component.jsx");
122
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
123
+
124
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
125
+
126
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
127
+
128
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
129
+
130
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
131
+
132
+ function _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
133
+
134
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
135
+
136
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
137
+
138
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
139
+
140
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
141
+
142
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
143
+
144
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
145
+
146
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
147
+
148
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+ var REDUCER_KEY = "flashes";
158
+ var FLASH_DATA_ID = "ui-flashes";
159
+ var initialState = {
160
+ items: []
161
+ };
162
+
163
+ var reducerFlashes = _defineProperty({}, REDUCER_KEY, function () {
164
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
165
+ var action = arguments.length > 1 ? arguments[1] : undefined;
166
+
167
+ switch (action.type) {
168
+ case "flash/push":
169
+ {
170
+ var flashes = Array.isArray(action.payload) ? action.payload : [action.payload];
171
+ return {
172
+ items: [].concat(_toConsumableArray(state.items), _toConsumableArray(flashes))
173
+ };
174
+ }
175
+
176
+ default:
177
+ return state;
178
+ }
179
+ });
180
+
181
+ var selectFlashes = function selectFlashes(store) {
182
+ return store.getState()[REDUCER_KEY];
183
+ };
184
+
185
+ var FlashT = {
186
+ type: prop_types__WEBPACK_IMPORTED_MODULE_2___default().oneOf(["error", "success", "notice", "info", "alert"]),
187
+ content: (prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)
188
+ };
189
+ var FLASH_BG_COLOR = {
190
+ error: "bg-gui-error",
191
+ success: "bg-zingy-green",
192
+ notice: "bg-electric-cyan",
193
+ info: "bg-electric-cyan",
194
+ alert: "bg-active-orange"
195
+ };
196
+ var FLASH_TEXT_COLOR = {
197
+ error: "text-white",
198
+ success: "text-cool-black",
199
+ notice: "text-cool-black",
200
+ info: "text-cool-black",
201
+ alert: "text-white"
202
+ };
203
+ var AUTO_HIDE = ["success", "info", "notice"];
204
+ var AUTO_HIDE_TIME = 8000;
205
+
206
+ var useAutoHide = function useAutoHide(type, closeFlash) {
207
+ var timeoutId = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
208
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
209
+ if (AUTO_HIDE.includes(type)) {
210
+ timeoutId.current = setTimeout(function () {
211
+ closeFlash();
212
+ }, AUTO_HIDE_TIME);
213
+ }
214
+
215
+ return function () {
216
+ if (timeoutId.current) {
217
+ clearTimeout(timeoutId.current);
218
+ }
219
+ };
220
+ }, []);
221
+ };
222
+
223
+ var Flash = function Flash(_ref) {
224
+ var id = _ref.id,
225
+ type = _ref.type,
226
+ content = _ref.content,
227
+ removeFlash = _ref.removeFlash;
228
+ var ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
229
+
230
+ var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),
231
+ _useState2 = _slicedToArray(_useState, 2),
232
+ closed = _useState2[0],
233
+ setClosed = _useState2[1];
234
+
235
+ var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0),
236
+ _useState4 = _slicedToArray(_useState3, 2),
237
+ flashHeight = _useState4[0],
238
+ setFlashHeight = _useState4[1];
239
+
240
+ var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false),
241
+ _useState6 = _slicedToArray(_useState5, 2),
242
+ triggerEntryAnimation = _useState6[0],
243
+ setTriggerEntryAnimation = _useState6[1];
244
+
245
+ var closeFlash = function closeFlash() {
246
+ if (ref.current) {
247
+ setFlashHeight(ref.current.getBoundingClientRect().height);
248
+ }
249
+
250
+ setClosed(true);
251
+ setTimeout(function () {
252
+ removeFlash(id);
253
+ }, 100);
254
+ };
255
+
256
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
257
+ return setTriggerEntryAnimation(true);
258
+ }, []);
259
+ useAutoHide(type, closeFlash);
260
+ var animateEntry = triggerEntryAnimation && !closed;
261
+ var style;
262
+
263
+ if (flashHeight && !closed) {
264
+ style = {
265
+ height: "".concat(flashHeight, "px")
266
+ };
267
+ } else if (closed) {
268
+ style = {
269
+ height: 0,
270
+ marginTop: 0,
271
+ zIndex: -1
272
+ };
273
+ } else {
274
+ style = {};
275
+ }
276
+
277
+ var safeContent = dompurify__WEBPACK_IMPORTED_MODULE_1___default().sanitize(content, {
278
+ ALLOWED_TAGS: ["a"],
279
+ ALLOWED_ATTR: ["href", "data-method", "rel"]
280
+ });
281
+ var withIcons = {
282
+ notice: "icon-gui-ably-badge",
283
+ success: "icon-gui-tick",
284
+ error: "icon-gui-warning",
285
+ alert: "icon-gui-warning"
286
+ };
287
+ var iconColor = {
288
+ notice: "text-cool-black",
289
+ success: "text-cool-black",
290
+ error: "text-white",
291
+ alert: "text-white"
292
+ };
293
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
294
+ className: "ui-flash-message ui-grid-px ".concat(animateEntry ? "ui-flash-message-enter" : ""),
295
+ style: style,
296
+ ref: ref,
297
+ "data-id": "ui-flash"
298
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
299
+ className: "".concat(FLASH_BG_COLOR[type], " p-32 flex align-center rounded shadow-container-subtle")
300
+ }, withIcons[type] && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Icon_component_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
301
+ name: withIcons[type],
302
+ color: iconColor[type],
303
+ size: "1.5rem",
304
+ additionalCSS: "mr-16 self-baseline"
305
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
306
+ className: "ui-flash-text ".concat(FLASH_TEXT_COLOR[type]),
307
+ dangerouslySetInnerHTML: {
308
+ __html: safeContent
309
+ }
310
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
311
+ type: "button",
312
+ className: "p-0 ml-auto self-start focus:outline-none",
313
+ onClick: closeFlash
314
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Icon_component_jsx__WEBPACK_IMPORTED_MODULE_5__["default"], {
315
+ name: "icon-gui-close",
316
+ color: iconColor[type],
317
+ size: "1.5rem",
318
+ additionalCSS: "transition-colors"
319
+ }))));
320
+ };
321
+
322
+ Flash.propTypes = _objectSpread({}, FlashT);
323
+
324
+ var Flashes = function Flashes(_ref2) {
325
+ var flashes = _ref2.flashes;
326
+
327
+ var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]),
328
+ _useState8 = _slicedToArray(_useState7, 2),
329
+ flashesWithIds = _useState8[0],
330
+ setFlashesWithIds = _useState8[1];
331
+
332
+ var removeFlash = function removeFlash(flashId) {
333
+ return setFlashesWithIds(function (items) {
334
+ return items.filter(function (item) {
335
+ return item.id !== flashId;
336
+ });
337
+ });
338
+ };
339
+
340
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
341
+ setFlashesWithIds(function (state) {
342
+ return [].concat(_toConsumableArray(state), _toConsumableArray(((flashes === null || flashes === void 0 ? void 0 : flashes.items) || []).map(function (flash) {
343
+ return _objectSpread(_objectSpread({}, flash), {}, {
344
+ id: (0,nanoid_non_secure__WEBPACK_IMPORTED_MODULE_6__.nanoid)(),
345
+ removed: false
346
+ });
347
+ })));
348
+ });
349
+ }, [flashes]);
350
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
351
+ className: "ui-flash",
352
+ "data-id": FLASH_DATA_ID
353
+ }, flashesWithIds.filter(function (item) {
354
+ return !item.removed;
355
+ }).map(function (flash) {
356
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Flash, _extends({
357
+ removeFlash: removeFlash,
358
+ key: flash.id
359
+ }, flash));
360
+ }));
361
+ };
362
+
363
+ Flashes.propTypes = {
364
+ flashes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape({
365
+ items: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().shape(FlashT))
366
+ })
367
+ };
368
+
369
+ var BackendFlashes = function BackendFlashes(_ref3) {
370
+ var flashes = _ref3.flashes;
371
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
372
+ var transformedFlashes = flashes.map(function (flash) {
373
+ var _flash = _slicedToArray(flash, 2),
374
+ type = _flash[0],
375
+ content = _flash[1];
376
+
377
+ return {
378
+ type: type,
379
+ content: content
380
+ };
381
+ }) || [];
382
+
383
+ if (transformedFlashes.length > 0) {
384
+ var store = (0,_remote_data_store__WEBPACK_IMPORTED_MODULE_3__.getRemoteDataStore)();
385
+ store.dispatch({
386
+ type: "flash/push",
387
+ payload: transformedFlashes
388
+ });
389
+ }
390
+ }, []);
391
+ var WrappedFlashes = (0,_ConnectStateWrapper_component_jsx__WEBPACK_IMPORTED_MODULE_4__["default"])(Flashes, {
392
+ flashes: selectFlashes
393
+ });
394
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(WrappedFlashes, null);
395
+ };
396
+
397
+ BackendFlashes.propTypes = {
398
+ flashes: prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf(prop_types__WEBPACK_IMPORTED_MODULE_2___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_2___default().string)))
399
+ };
400
+
401
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (BackendFlashes);
402
+
403
+ /***/ }),
404
+
405
+ /***/ "./src/core/Icon/component.jsx":
406
+ /*!*************************************!*\
407
+ !*** ./src/core/Icon/component.jsx ***!
408
+ \*************************************/
409
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
410
+
411
+ __webpack_require__.r(__webpack_exports__);
412
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
413
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
414
+ /* harmony export */ });
415
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react");
416
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
417
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! prop-types */ "prop-types");
418
+ /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_1__);
419
+ var _excluded = ["name", "size", "color", "additionalCSS"];
420
+
421
+ function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
422
+
423
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
424
+
425
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
426
+
427
+
428
+
429
+
430
+ var Icon = function Icon(_ref) {
431
+ var name = _ref.name,
432
+ _ref$size = _ref.size,
433
+ size = _ref$size === void 0 ? "0.75rem" : _ref$size,
434
+ _ref$color = _ref.color,
435
+ color = _ref$color === void 0 ? "" : _ref$color,
436
+ _ref$additionalCSS = _ref.additionalCSS,
437
+ additionalCSS = _ref$additionalCSS === void 0 ? "" : _ref$additionalCSS,
438
+ additionalAttributes = _objectWithoutProperties(_ref, _excluded);
439
+
440
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("svg", _extends({
441
+ className: "".concat(color, " ").concat(additionalCSS),
442
+ style: {
443
+ width: size,
444
+ height: size
445
+ }
446
+ }, additionalAttributes), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("use", {
447
+ xlinkHref: "#sprite-".concat(name)
448
+ }));
449
+ };
450
+
451
+ Icon.propTypes = {
452
+ name: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string.isRequired),
453
+ size: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
454
+ color: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string),
455
+ additionalCSS: (prop_types__WEBPACK_IMPORTED_MODULE_1___default().string)
456
+ };
457
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Icon);
458
+
459
+ /***/ }),
460
+
461
+ /***/ "./src/core/dom-query.js":
462
+ /*!*******************************!*\
463
+ !*** ./src/core/dom-query.js ***!
464
+ \*******************************/
465
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
466
+
467
+ __webpack_require__.r(__webpack_exports__);
468
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
469
+ /* harmony export */ "queryId": () => (/* binding */ queryId),
470
+ /* harmony export */ "queryIdAll": () => (/* binding */ queryIdAll)
471
+ /* harmony export */ });
472
+ var queryId = function queryId(val) {
473
+ var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
474
+ return root.querySelector("[data-id=".concat(val, "]"));
475
+ };
476
+ var queryIdAll = function queryIdAll(val) {
477
+ var root = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document;
478
+ return root.querySelectorAll("[data-id=".concat(val, "]"));
479
+ };
480
+
481
+ /***/ }),
482
+
483
+ /***/ "./src/core/remote-data-store.js":
484
+ /*!***************************************!*\
485
+ !*** ./src/core/remote-data-store.js ***!
486
+ \***************************************/
487
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
488
+
489
+ __webpack_require__.r(__webpack_exports__);
490
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
491
+ /* harmony export */ "attachStoreToWindow": () => (/* binding */ attachStoreToWindow),
492
+ /* harmony export */ "connectState": () => (/* binding */ connectState),
493
+ /* harmony export */ "createRemoteDataStore": () => (/* binding */ createRemoteDataStore),
494
+ /* harmony export */ "getRemoteDataStore": () => (/* binding */ getRemoteDataStore)
495
+ /* harmony export */ });
496
+ /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! redux */ "redux");
497
+ /* harmony import */ var redux__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(redux__WEBPACK_IMPORTED_MODULE_0__);
498
+
499
+ var attachStoreToWindow = function attachStoreToWindow(store) {
500
+ window.AblyUi = window.AblyUi || {};
501
+ window.AblyUi.RemoteDataStore = store;
502
+ };
503
+ var getRemoteDataStore = function getRemoteDataStore() {
504
+ if (!window.AblyUi.RemoteDataStore) {
505
+ throw new Error("Remote store was called before one was created");
506
+ }
507
+
508
+ return window.AblyUi.RemoteDataStore;
509
+ };
510
+ var connectState = function connectState(selector, setState) {
511
+ var store = getRemoteDataStore();
512
+ var cachedOldState = selector(store);
513
+ store.subscribe(function () {
514
+ var newState = selector(store); // Do nothing, state is the same
515
+
516
+ if (newState === cachedOldState) {
517
+ return;
518
+ }
519
+
520
+ cachedOldState = newState;
521
+ setState(newState);
522
+ });
523
+ };
524
+ var createRemoteDataStore = function createRemoteDataStore(reducers) {
525
+ return (0,redux__WEBPACK_IMPORTED_MODULE_0__.createStore)((0,redux__WEBPACK_IMPORTED_MODULE_0__.combineReducers)(reducers));
526
+ };
527
+
528
+ /***/ }),
529
+
530
+ /***/ "./src/core/Notice/component.css":
531
+ /*!***************************************!*\
532
+ !*** ./src/core/Notice/component.css ***!
533
+ \***************************************/
534
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
535
+
536
+ __webpack_require__.r(__webpack_exports__);
537
+ // extracted by mini-css-extract-plugin
538
+
539
+
540
+ /***/ }),
541
+
542
+ /***/ "dompurify":
543
+ /*!*****************************************************************!*\
544
+ !*** external {"commonjs":"dompurify","commonjs2":"dompurify"} ***!
545
+ \*****************************************************************/
546
+ /***/ ((module) => {
547
+
548
+ module.exports = __WEBPACK_EXTERNAL_MODULE_dompurify__;
549
+
550
+ /***/ }),
551
+
552
+ /***/ "js-cookie":
553
+ /*!*****************************************************************!*\
554
+ !*** external {"commonjs":"js-cookie","commonjs2":"js-cookie"} ***!
555
+ \*****************************************************************/
556
+ /***/ ((module) => {
557
+
558
+ module.exports = __WEBPACK_EXTERNAL_MODULE_js_cookie__;
559
+
560
+ /***/ }),
561
+
562
+ /***/ "lodash.throttle":
563
+ /*!*****************************************************************************!*\
564
+ !*** external {"commonjs":"lodash.throttle","commonjs2":"lodash.throttle"} ***!
565
+ \*****************************************************************************/
566
+ /***/ ((module) => {
567
+
568
+ module.exports = __WEBPACK_EXTERNAL_MODULE_lodash_throttle__;
569
+
570
+ /***/ }),
571
+
572
+ /***/ "prop-types":
573
+ /*!*******************************************************************!*\
574
+ !*** external {"commonjs":"prop-types","commonjs2":"prop-types"} ***!
575
+ \*******************************************************************/
576
+ /***/ ((module) => {
577
+
578
+ module.exports = __WEBPACK_EXTERNAL_MODULE_prop_types__;
579
+
580
+ /***/ }),
581
+
582
+ /***/ "react":
583
+ /*!*********************************************************!*\
584
+ !*** external {"commonjs":"react","commonjs2":"react"} ***!
585
+ \*********************************************************/
586
+ /***/ ((module) => {
587
+
588
+ module.exports = __WEBPACK_EXTERNAL_MODULE_react__;
589
+
590
+ /***/ }),
591
+
592
+ /***/ "redux":
593
+ /*!*********************************************************!*\
594
+ !*** external {"commonjs":"redux","commonjs2":"redux"} ***!
595
+ \*********************************************************/
596
+ /***/ ((module) => {
597
+
598
+ module.exports = __WEBPACK_EXTERNAL_MODULE_redux__;
599
+
600
+ /***/ }),
601
+
602
+ /***/ "./node_modules/nanoid/non-secure/index.js":
603
+ /*!*************************************************!*\
604
+ !*** ./node_modules/nanoid/non-secure/index.js ***!
605
+ \*************************************************/
606
+ /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
607
+
608
+ __webpack_require__.r(__webpack_exports__);
609
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
610
+ /* harmony export */ "customAlphabet": () => (/* binding */ customAlphabet),
611
+ /* harmony export */ "nanoid": () => (/* binding */ nanoid)
612
+ /* harmony export */ });
613
+ let urlAlphabet =
614
+ 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'
615
+ let customAlphabet = (alphabet, defaultSize = 21) => {
616
+ return (size = defaultSize) => {
617
+ let id = ''
618
+ let i = size
619
+ while (i--) {
620
+ id += alphabet[(Math.random() * alphabet.length) | 0]
621
+ }
622
+ return id
623
+ }
624
+ }
625
+ let nanoid = (size = 21) => {
626
+ let id = ''
627
+ let i = size
628
+ while (i--) {
629
+ id += urlAlphabet[(Math.random() * 64) | 0]
630
+ }
631
+ return id
632
+ }
633
+
634
+
635
+ /***/ })
636
+
637
+ /******/ });
638
+ /************************************************************************/
639
+ /******/ // The module cache
640
+ /******/ var __webpack_module_cache__ = {};
641
+ /******/
642
+ /******/ // The require function
643
+ /******/ function __webpack_require__(moduleId) {
644
+ /******/ // Check if module is in cache
645
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
646
+ /******/ if (cachedModule !== undefined) {
647
+ /******/ return cachedModule.exports;
648
+ /******/ }
649
+ /******/ // Create a new module (and put it into the cache)
650
+ /******/ var module = __webpack_module_cache__[moduleId] = {
651
+ /******/ // no module.id needed
652
+ /******/ // no module.loaded needed
653
+ /******/ exports: {}
654
+ /******/ };
655
+ /******/
656
+ /******/ // Execute the module function
657
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
658
+ /******/
659
+ /******/ // Return the exports of the module
660
+ /******/ return module.exports;
661
+ /******/ }
662
+ /******/
663
+ /************************************************************************/
664
+ /******/ /* webpack/runtime/compat get default export */
665
+ /******/ (() => {
666
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
667
+ /******/ __webpack_require__.n = (module) => {
668
+ /******/ var getter = module && module.__esModule ?
669
+ /******/ () => (module['default']) :
670
+ /******/ () => (module);
671
+ /******/ __webpack_require__.d(getter, { a: getter });
672
+ /******/ return getter;
673
+ /******/ };
674
+ /******/ })();
675
+ /******/
676
+ /******/ /* webpack/runtime/define property getters */
677
+ /******/ (() => {
678
+ /******/ // define getter functions for harmony exports
679
+ /******/ __webpack_require__.d = (exports, definition) => {
680
+ /******/ for(var key in definition) {
681
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
682
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
683
+ /******/ }
684
+ /******/ }
685
+ /******/ };
686
+ /******/ })();
687
+ /******/
688
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
689
+ /******/ (() => {
690
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
691
+ /******/ })();
692
+ /******/
693
+ /******/ /* webpack/runtime/make namespace object */
694
+ /******/ (() => {
695
+ /******/ // define __esModule on exports
696
+ /******/ __webpack_require__.r = (exports) => {
697
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
698
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
699
+ /******/ }
700
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
701
+ /******/ };
702
+ /******/ })();
703
+ /******/
704
+ /************************************************************************/
705
+ var __webpack_exports__ = {};
706
+ // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
707
+ (() => {
708
+ /*!**************************************!*\
709
+ !*** ./src/core/Notice/component.js ***!
710
+ \**************************************/
711
+ __webpack_require__.r(__webpack_exports__);
712
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
713
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
714
+ /* harmony export */ });
715
+ /* harmony import */ var _component_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./component.css */ "./src/core/Notice/component.css");
716
+ /* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! js-cookie */ "js-cookie");
717
+ /* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(js_cookie__WEBPACK_IMPORTED_MODULE_1__);
718
+ /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! lodash.throttle */ "lodash.throttle");
719
+ /* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_2__);
720
+ /* harmony import */ var _dom_query__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../dom-query */ "./src/core/dom-query.js");
721
+ /* harmony import */ var _Flash_component_jsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../Flash/component.jsx */ "./src/core/Flash/component.jsx");
722
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
723
+
724
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
725
+
726
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
727
+
728
+
729
+
730
+
731
+
732
+
733
+ var COOKIE_EXPIRY = 90;
734
+ var COLLAPSE_TRIGGER_DISTANCE = 5;
735
+ var SCROLL_LISTENER_THROTTLE = 100;
736
+ var RESIZE_LISTENER_THROTTLE = 100;
737
+
738
+ var isMdViewport = function isMdViewport() {
739
+ return !window.matchMedia("(min-width: 65rem)").matches;
740
+ };
741
+
742
+ var adjustFlashMargin = function adjustFlashMargin(open) {
743
+ // HACK ALERT
744
+ // Add margin to flashes when opening the notice.
745
+ // Flashes are react components and this notice needs to work as a view-component and react component.
746
+ // We could do this with redux but then we potentially update state on every scroll event, which
747
+ // even with debounce will deplate our frame budget.
748
+ var flash = (0,_dom_query__WEBPACK_IMPORTED_MODULE_3__.queryId)(_Flash_component_jsx__WEBPACK_IMPORTED_MODULE_4__.FLASH_DATA_ID);
749
+
750
+ if (flash) {
751
+ flash.style.marginTop = open ? "4rem" : null;
752
+ }
753
+ };
754
+
755
+ var hideOnMobile = function hideOnMobile(bannerContainer) {
756
+ if (isMdViewport()) {
757
+ bannerContainer.style.display = "none";
758
+ } else {
759
+ bannerContainer.style.display = null;
760
+ }
761
+ };
762
+
763
+ var hideNotice = function hideNotice(bannerContainer) {
764
+ bannerContainer.style.maxHeight = 0;
765
+ bannerContainer.style.overflow = "hidden";
766
+ adjustFlashMargin(false);
767
+ };
768
+
769
+ var showNotice = function showNotice(bannerContainer) {
770
+ bannerContainer.style.maxHeight = null;
771
+ bannerContainer.style.overflow = null;
772
+ adjustFlashMargin(true);
773
+ };
774
+
775
+ var setupRememberClosed = function setupRememberClosed(cookieId, noticeId) {
776
+ var cookie = js_cookie__WEBPACK_IMPORTED_MODULE_1___default().get(cookieId) || "";
777
+ js_cookie__WEBPACK_IMPORTED_MODULE_1___default().set(cookieId, "".concat(cookie.replace("".concat(noticeId, ","), "") + noticeId, ","), {
778
+ expires: COOKIE_EXPIRY
779
+ });
780
+ };
781
+
782
+ var hasBeenClosedBefore = function hasBeenClosedBefore(cookieId, noticeId) {
783
+ return (js_cookie__WEBPACK_IMPORTED_MODULE_1___default().get(cookieId) || "").includes(noticeId);
784
+ };
785
+
786
+ var setupNoticeCollapse = function setupNoticeCollapse(bannerContainer) {
787
+ var scrollTop = window.scrollY;
788
+
789
+ if (scrollTop > COLLAPSE_TRIGGER_DISTANCE) {
790
+ hideNotice(bannerContainer);
791
+ }
792
+
793
+ var listener = lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default()(function () {
794
+ var scrollTop = window.scrollY;
795
+
796
+ if (scrollTop > COLLAPSE_TRIGGER_DISTANCE) {
797
+ hideNotice(bannerContainer);
798
+ } else if (bannerContainer.style.overflow) {
799
+ showNotice(bannerContainer);
800
+ }
801
+ }, SCROLL_LISTENER_THROTTLE);
802
+ document.addEventListener("scroll", listener);
803
+ return function () {
804
+ return document.removeEventListener("scroll", listener);
805
+ };
806
+ };
807
+
808
+ var setupCloseBtn = function setupCloseBtn(bannerContainer, cookieId, noticeId, collapseUnmountListeners) {
809
+ var closeBtn = bannerContainer.querySelector("button");
810
+ if (!closeBtn) return function () {};
811
+
812
+ var listener = function listener() {
813
+ if (cookieId && noticeId) setupRememberClosed(cookieId, noticeId);
814
+ hideNotice(bannerContainer);
815
+ collapseUnmountListeners();
816
+ };
817
+
818
+ closeBtn.addEventListener("click", listener);
819
+ return function () {
820
+ return document.removeEventListener("click", listener);
821
+ };
822
+ };
823
+
824
+ var resizeHandler = function resizeHandler(bannerContainer) {
825
+ var handler = lodash_throttle__WEBPACK_IMPORTED_MODULE_2___default()(function () {
826
+ hideOnMobile(bannerContainer);
827
+ }, RESIZE_LISTENER_THROTTLE);
828
+ window.addEventListener("resize", handler);
829
+ return function () {
830
+ return window.removeEventListener("resize", handler);
831
+ };
832
+ };
833
+
834
+ var Notice = function Notice(_ref) {
835
+ var bannerContainer = _ref.bannerContainer,
836
+ cookieId = _ref.cookieId,
837
+ noticeId = _ref.noticeId,
838
+ options = _ref.options;
839
+ if (typeof window === "undefined") return function () {};
840
+
841
+ if (!bannerContainer) {
842
+ console.warn("A Notice component was initited but no notice container was found.");
843
+ return function () {};
844
+ }
845
+
846
+ if (hasBeenClosedBefore(cookieId, noticeId)) return function () {};
847
+ hideOnMobile(bannerContainer);
848
+ showNotice(bannerContainer);
849
+
850
+ var opts = _objectSpread({
851
+ collapse: true
852
+ }, options);
853
+
854
+ var collapseUnmountListeners = opts.collapse ? setupNoticeCollapse(bannerContainer) : function () {};
855
+ var closeBtnUnmountListeners = setupCloseBtn(bannerContainer, cookieId, noticeId, collapseUnmountListeners);
856
+ var resizeUnmountListener = resizeHandler(bannerContainer);
857
+ return function () {
858
+ [closeBtnUnmountListeners, collapseUnmountListeners, resizeUnmountListener].forEach(function (unmount) {
859
+ return unmount();
860
+ });
861
+ };
862
+ };
863
+
864
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Notice);
865
+ })();
866
+
867
+ __webpack_exports__ = __webpack_exports__["default"];
868
+ /******/ return __webpack_exports__;
869
+ /******/ })()
870
+ ;
871
+ });
872
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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L3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS8uL3NyYy9jb3JlL0Nvbm5lY3RTdGF0ZVdyYXBwZXIvY29tcG9uZW50LmpzeCIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS8uL3NyYy9jb3JlL0ZsYXNoL2NvbXBvbmVudC5qc3giLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvLi9zcmMvY29yZS9JY29uL2NvbXBvbmVudC5qc3giLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvLi9zcmMvY29yZS9kb20tcXVlcnkuanMiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvLi9zcmMvY29yZS9yZW1vdGUtZGF0YS1zdG9yZS5qcyIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS8uL3NyYy9jb3JlL05vdGljZS9jb21wb25lbnQuY3NzP2IxZDgiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJkb21wdXJpZnlcIixcImNvbW1vbmpzMlwiOlwiZG9tcHVyaWZ5XCJ9Iiwid2VicGFjazovL0FibHlVaS5Db3JlL2V4dGVybmFsIHVtZCB7XCJjb21tb25qc1wiOlwianMtY29va2llXCIsXCJjb21tb25qczJcIjpcImpzLWNvb2tpZVwifSIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcImxvZGFzaC50aHJvdHRsZVwiLFwiY29tbW9uanMyXCI6XCJsb2Rhc2gudGhyb3R0bGVcIn0iLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJwcm9wLXR5cGVzXCIsXCJjb21tb25qczJcIjpcInByb3AtdHlwZXNcIn0iLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvZXh0ZXJuYWwgdW1kIHtcImNvbW1vbmpzXCI6XCJyZWFjdFwiLFwiY29tbW9uanMyXCI6XCJyZWFjdFwifSIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS9leHRlcm5hbCB1bWQge1wiY29tbW9uanNcIjpcInJlZHV4XCIsXCJjb21tb25qczJcIjpcInJlZHV4XCJ9Iiwid2VicGFjazovL0FibHlVaS5Db3JlLy4vbm9kZV9tb2R1bGVzL25hbm9pZC9ub24tc2VjdXJlL2luZGV4LmpzIiwid2VicGFjazovL0FibHlVaS5Db3JlL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0FibHlVaS5Db3JlL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0FibHlVaS5Db3JlL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9BYmx5VWkuQ29yZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0FibHlVaS5Db3JlL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQWJseVVpLkNvcmUvLi9zcmMvY29yZS9Ob3RpY2UvY29tcG9uZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImRvbXB1cmlmeVwiKSwgcmVxdWlyZShcImpzLWNvb2tpZVwiKSwgcmVxdWlyZShcImxvZGFzaC50aHJvdHRsZVwiKSwgcmVxdWlyZShcInByb3AtdHlwZXNcIiksIHJlcXVpcmUoXCJyZWFjdFwiKSwgcmVxdWlyZShcInJlZHV4XCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFssICwgLCAsICwgXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJBYmx5VWlcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJkb21wdXJpZnlcIiksIHJlcXVpcmUoXCJqcy1jb29raWVcIiksIHJlcXVpcmUoXCJsb2Rhc2gudGhyb3R0bGVcIiksIHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpLCByZXF1aXJlKFwicmVhY3RcIiksIHJlcXVpcmUoXCJyZWR1eFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiQWJseVVpXCJdID0gcm9vdFtcIkFibHlVaVwiXSB8fCB7fSwgcm9vdFtcIkFibHlVaVwiXVtcIkNvcmVcIl0gPSByb290W1wiQWJseVVpXCJdW1wiQ29yZVwiXSB8fCB7fSwgcm9vdFtcIkFibHlVaVwiXVtcIkNvcmVcIl1bXCJOb3RpY2VcIl0gPSBmYWN0b3J5KHJvb3RbdW5kZWZpbmVkXSwgcm9vdFt1bmRlZmluZWRdLCByb290W3VuZGVmaW5lZF0sIHJvb3RbdW5kZWZpbmVkXSwgcm9vdFt1bmRlZmluZWRdLCByb290W3VuZGVmaW5lZF0pO1xufSkodGhpcywgKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfZG9tcHVyaWZ5X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfanNfY29va2llX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfbG9kYXNoX3Rocm90dGxlX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcHJvcF90eXBlc19fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX3JlYWN0X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcmVkdXhfXykgPT4ge1xucmV0dXJuICIsImltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IGNvbm5lY3RTdGF0ZSwgZ2V0UmVtb3RlRGF0YVN0b3JlIH0gZnJvbSBcIi4uL3JlbW90ZS1kYXRhLXN0b3JlXCI7XG5cbi8qXG4gIENvbm5lY3QgYSByZWFjdCBjb21wb25lbnQgdG8gYSBnbG9iYWwgc3RvcmUuXG4gIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IHJlYWN0LXJlZHV4IGRvZXMgYnV0IHVzZXMgb3VyIGdsb2JhbCBzdG9yZSBzb1xuICBjYW4gc2hhcmUgc3RhdGUgd2l0aCBvdGhlciBSZWFjdCBtb3VudCBwb2ludHMgb3IgYW55dGhpbmcgdGhhdCB1c2VzIHRoZVxuICBzdG9yZS5cbiAgLSBzZWxlY3RvcnMgaXMgYW4gb2JqZWN0IHdoZXJlIGtleXMgYXJlIHlvdXIgcHJvcCBuYW1lcyBhbmQgdmFsdWVzIGFyZSB5b3VyIHNlbGVjdFxuICBmdW5jdGlvbnMgdGhhdCB3b3JrIG9uIHRoZSBzdG9yZSB0byByZXRyaWV2ZSB0aGUgc3RhdGUgeW91IGFyZSBpbnRlcmVzdGVkIGluXG4gIC0gaW5pdGlhbCBzdGF0ZSBpcyBzZXQgaW4gdXNlRWZmZWN0IHNvIHRoZSB3cmFwcGVkIGNvbXBvbmVudCBuZWVkcyB0byBoYW5kbGUgaXQncyBwcm9wcyBzZXQgdG8gdW5kZWZpbmVkIGluaXRpYWxseVxuKi9cblxuZXhwb3J0IGNvbnN0IENvbm5lY3RTdGF0ZVdyYXBwZXIgPSAoQ29tcG9uZW50LCBzZWxlY3RvcnMpID0+IHtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZSh7fSk7XG5cbiAgY29uc3Qgc2V0U3RhdGVGb3JLZXkgPSAoa2V5KSA9PiAoc3RvcmVTdGF0ZSkgPT4gc2V0U3RhdGUoKCkgPT4gKHsgW2tleV06IHN0b3JlU3RhdGUgfSkpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc3RvcmUgPSBnZXRSZW1vdGVEYXRhU3RvcmUoKTtcbiAgICBjb25zdCByZXNvbHZlZFN0YXRlID0gT2JqZWN0LmtleXMoc2VsZWN0b3JzKS5yZWR1Y2UoKGFjYywga2V5KSA9PiAoeyAuLi5hY2MsIFtrZXldOiBzZWxlY3RvcnNba2V5XShzdG9yZSkgfSksIHt9KTtcblxuICAgIC8vIFNldCBpbml0aWFsIHN0YXRlXG4gICAgc2V0U3RhdGUocmVzb2x2ZWRTdGF0ZSk7XG5cbiAgICAvLyBDcmVhdGUgYSBzdG9yZSBzdWJzY3JpcHRpb24gZm9yIGVhY2ggc2VsZWN0b3IuIERlcGVuZGluZyBvbiB5b3VyIHVzZSBjYXNlLCB0aGlzIGNhbiBiZSBpbmVmZmljaWVudC5cbiAgICAvLyBXaGVuIG9wdGltaXNpbmcgZm9yIHJlbmRlcnMsIGxvb2sgZm9yIHdpbnMgd2l0aCBzZWxlY3RvcnMgYmV0dGVyIGZvciB5b3VyIHVzZSBhbmQgdXNpbmcgY29ubmVjdFN0YXRlIGRpcmVjdGx5LlxuICAgIE9iamVjdC5rZXlzKHNlbGVjdG9ycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25uZWN0U3RhdGUoc2VsZWN0b3JzW2tleV0sIHNldFN0YXRlRm9yS2V5KGtleSkpO1xuICAgIH0pO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgV3JhcHBlZENvbXBvbmVudCA9IChwcm9wcykgPT4gPENvbXBvbmVudCB7Li4ucHJvcHN9IHsuLi5zdGF0ZX0gLz47XG5cbiAgcmV0dXJuIFdyYXBwZWRDb21wb25lbnQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb25uZWN0U3RhdGVXcmFwcGVyO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tIFwiZG9tcHVyaWZ5XCI7XG5pbXBvcnQgVCBmcm9tIFwicHJvcC10eXBlc1wiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZC9ub24tc2VjdXJlXCI7XG5cbmltcG9ydCB7IGdldFJlbW90ZURhdGFTdG9yZSB9IGZyb20gXCIuLi9yZW1vdGUtZGF0YS1zdG9yZVwiO1xuaW1wb3J0IENvbm5lY3RTdGF0ZVdyYXBwZXIgZnJvbSBcIi4uL0Nvbm5lY3RTdGF0ZVdyYXBwZXIvY29tcG9uZW50LmpzeFwiO1xuaW1wb3J0IEljb24gZnJvbSBcIi4uL0ljb24vY29tcG9uZW50LmpzeFwiO1xuXG5jb25zdCBSRURVQ0VSX0tFWSA9IFwiZmxhc2hlc1wiO1xuY29uc3QgRkxBU0hfREFUQV9JRCA9IFwidWktZmxhc2hlc1wiO1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7IGl0ZW1zOiBbXSB9O1xuXG5jb25zdCByZWR1Y2VyRmxhc2hlcyA9IHtcbiAgW1JFRFVDRVJfS0VZXTogKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIFwiZmxhc2gvcHVzaFwiOiB7XG4gICAgICAgIGNvbnN0IGZsYXNoZXMgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5wYXlsb2FkKSA/IGFjdGlvbi5wYXlsb2FkIDogW2FjdGlvbi5wYXlsb2FkXTtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IFsuLi5zdGF0ZS5pdGVtcywgLi4uZmxhc2hlc10gfTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG4gIH0sXG59O1xuXG5jb25zdCBzZWxlY3RGbGFzaGVzID0gKHN0b3JlKSA9PiBzdG9yZS5nZXRTdGF0ZSgpW1JFRFVDRVJfS0VZXTtcblxuY29uc3QgRmxhc2hUID0ge1xuICB0eXBlOiBULm9uZU9mKFtcImVycm9yXCIsIFwic3VjY2Vzc1wiLCBcIm5vdGljZVwiLCBcImluZm9cIiwgXCJhbGVydFwiXSksXG4gIGNvbnRlbnQ6IFQuc3RyaW5nLFxufTtcblxuY29uc3QgRkxBU0hfQkdfQ09MT1IgPSB7XG4gIGVycm9yOiBcImJnLWd1aS1lcnJvclwiLFxuICBzdWNjZXNzOiBcImJnLXppbmd5LWdyZWVuXCIsXG4gIG5vdGljZTogXCJiZy1lbGVjdHJpYy1jeWFuXCIsXG4gIGluZm86IFwiYmctZWxlY3RyaWMtY3lhblwiLFxuICBhbGVydDogXCJiZy1hY3RpdmUtb3JhbmdlXCIsXG59O1xuXG5jb25zdCBGTEFTSF9URVhUX0NPTE9SID0ge1xuICBlcnJvcjogXCJ0ZXh0LXdoaXRlXCIsXG4gIHN1Y2Nlc3M6IFwidGV4dC1jb29sLWJsYWNrXCIsXG4gIG5vdGljZTogXCJ0ZXh0LWNvb2wtYmxhY2tcIixcbiAgaW5mbzogXCJ0ZXh0LWNvb2wtYmxhY2tcIixcbiAgYWxlcnQ6IFwidGV4dC13aGl0ZVwiLFxufTtcblxuY29uc3QgQVVUT19ISURFID0gW1wic3VjY2Vzc1wiLCBcImluZm9cIiwgXCJub3RpY2VcIl07XG5jb25zdCBBVVRPX0hJREVfVElNRSA9IDgwMDA7XG5cbmNvbnN0IHVzZUF1dG9IaWRlID0gKHR5cGUsIGNsb3NlRmxhc2gpID0+IHtcbiAgY29uc3QgdGltZW91dElkID0gdXNlUmVmKG51bGwpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKEFVVE9fSElERS5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgdGltZW91dElkLmN1cnJlbnQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgY2xvc2VGbGFzaCgpO1xuICAgICAgfSwgQVVUT19ISURFX1RJTUUpO1xuICAgIH1cblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGltZW91dElkLmN1cnJlbnQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZC5jdXJyZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBbXSk7XG59O1xuXG5jb25zdCBGbGFzaCA9ICh7IGlkLCB0eXBlLCBjb250ZW50LCByZW1vdmVGbGFzaCB9KSA9PiB7XG4gIGNvbnN0IHJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgW2Nsb3NlZCwgc2V0Q2xvc2VkXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2ZsYXNoSGVpZ2h0LCBzZXRGbGFzaEhlaWdodF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgW3RyaWdnZXJFbnRyeUFuaW1hdGlvbiwgc2V0VHJpZ2dlckVudHJ5QW5pbWF0aW9uXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBjbG9zZUZsYXNoID0gKCkgPT4ge1xuICAgIGlmIChyZWYuY3VycmVudCkge1xuICAgICAgc2V0Rmxhc2hIZWlnaHQocmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KTtcbiAgICB9XG5cbiAgICBzZXRDbG9zZWQodHJ1ZSk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlbW92ZUZsYXNoKGlkKTtcbiAgICB9LCAxMDApO1xuICB9O1xuXG4gIHVzZUVmZmVjdCgoKSA9PiBzZXRUcmlnZ2VyRW50cnlBbmltYXRpb24odHJ1ZSksIFtdKTtcbiAgdXNlQXV0b0hpZGUodHlwZSwgY2xvc2VGbGFzaCk7XG5cbiAgY29uc3QgYW5pbWF0ZUVudHJ5ID0gdHJpZ2dlckVudHJ5QW5pbWF0aW9uICYmICFjbG9zZWQ7XG5cbiAgbGV0IHN0eWxlO1xuXG4gIGlmIChmbGFzaEhlaWdodCAmJiAhY2xvc2VkKSB7XG4gICAgc3R5bGUgPSB7IGhlaWdodDogYCR7Zmxhc2hIZWlnaHR9cHhgIH07XG4gIH0gZWxzZSBpZiAoY2xvc2VkKSB7XG4gICAgc3R5bGUgPSB7IGhlaWdodDogMCwgbWFyZ2luVG9wOiAwLCB6SW5kZXg6IC0xIH07XG4gIH0gZWxzZSB7XG4gICAgc3R5bGUgPSB7fTtcbiAgfVxuXG4gIGNvbnN0IHNhZmVDb250ZW50ID0gRE9NUHVyaWZ5LnNhbml0aXplKGNvbnRlbnQsIHtcbiAgICBBTExPV0VEX1RBR1M6IFtcImFcIl0sXG4gICAgQUxMT1dFRF9BVFRSOiBbXCJocmVmXCIsIFwiZGF0YS1tZXRob2RcIiwgXCJyZWxcIl0sXG4gIH0pO1xuXG4gIGNvbnN0IHdpdGhJY29ucyA9IHtcbiAgICBub3RpY2U6IFwiaWNvbi1ndWktYWJseS1iYWRnZVwiLFxuICAgIHN1Y2Nlc3M6IFwiaWNvbi1ndWktdGlja1wiLFxuICAgIGVycm9yOiBcImljb24tZ3VpLXdhcm5pbmdcIixcbiAgICBhbGVydDogXCJpY29uLWd1aS13YXJuaW5nXCIsXG4gIH07XG5cbiAgY29uc3QgaWNvbkNvbG9yID0ge1xuICAgIG5vdGljZTogXCJ0ZXh0LWNvb2wtYmxhY2tcIixcbiAgICBzdWNjZXNzOiBcInRleHQtY29vbC1ibGFja1wiLFxuICAgIGVycm9yOiBcInRleHQtd2hpdGVcIixcbiAgICBhbGVydDogXCJ0ZXh0LXdoaXRlXCIsXG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17YHVpLWZsYXNoLW1lc3NhZ2UgdWktZ3JpZC1weCAke2FuaW1hdGVFbnRyeSA/IFwidWktZmxhc2gtbWVzc2FnZS1lbnRlclwiIDogXCJcIn1gfSBzdHlsZT17c3R5bGV9IHJlZj17cmVmfSBkYXRhLWlkPVwidWktZmxhc2hcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtGTEFTSF9CR19DT0xPUlt0eXBlXX0gcC0zMiBmbGV4IGFsaWduLWNlbnRlciByb3VuZGVkIHNoYWRvdy1jb250YWluZXItc3VidGxlYH0+XG4gICAgICAgIHt3aXRoSWNvbnNbdHlwZV0gJiYgPEljb24gbmFtZT17d2l0aEljb25zW3R5cGVdfSBjb2xvcj17aWNvbkNvbG9yW3R5cGVdfSBzaXplPVwiMS41cmVtXCIgYWRkaXRpb25hbENTUz1cIm1yLTE2IHNlbGYtYmFzZWxpbmVcIiAvPn1cbiAgICAgICAgPHAgY2xhc3NOYW1lPXtgdWktZmxhc2gtdGV4dCAke0ZMQVNIX1RFWFRfQ09MT1JbdHlwZV19YH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBzYWZlQ29udGVudCB9fSAvPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzc05hbWU9XCJwLTAgbWwtYXV0byBzZWxmLXN0YXJ0IGZvY3VzOm91dGxpbmUtbm9uZVwiIG9uQ2xpY2s9e2Nsb3NlRmxhc2h9PlxuICAgICAgICAgIDxJY29uIG5hbWU9XCJpY29uLWd1aS1jbG9zZVwiIGNvbG9yPXtpY29uQ29sb3JbdHlwZV19IHNpemU9XCIxLjVyZW1cIiBhZGRpdGlvbmFsQ1NTPVwidHJhbnNpdGlvbi1jb2xvcnNcIiAvPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApO1xufTtcblxuRmxhc2gucHJvcFR5cGVzID0ge1xuICAuLi5GbGFzaFQsXG59O1xuXG5jb25zdCBGbGFzaGVzID0gKHsgZmxhc2hlcyB9KSA9PiB7XG4gIGNvbnN0IFtmbGFzaGVzV2l0aElkcywgc2V0Rmxhc2hlc1dpdGhJZHNdID0gdXNlU3RhdGUoW10pO1xuXG4gIGNvbnN0IHJlbW92ZUZsYXNoID0gKGZsYXNoSWQpID0+IHNldEZsYXNoZXNXaXRoSWRzKChpdGVtcykgPT4gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlkICE9PSBmbGFzaElkKSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRGbGFzaGVzV2l0aElkcygoc3RhdGUpID0+IHtcbiAgICAgIHJldHVybiBbLi4uc3RhdGUsIC4uLihmbGFzaGVzPy5pdGVtcyB8fCBbXSkubWFwKChmbGFzaCkgPT4gKHsgLi4uZmxhc2gsIGlkOiBuYW5vaWQoKSwgcmVtb3ZlZDogZmFsc2UgfSkpXTtcbiAgICB9KTtcbiAgfSwgW2ZsYXNoZXNdKTtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwidWktZmxhc2hcIiBkYXRhLWlkPXtGTEFTSF9EQVRBX0lEfT5cbiAgICAgIHtmbGFzaGVzV2l0aElkc1xuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5yZW1vdmVkKVxuICAgICAgICAubWFwKChmbGFzaCkgPT4gKFxuICAgICAgICAgIDxGbGFzaCByZW1vdmVGbGFzaD17cmVtb3ZlRmxhc2h9IGtleT17Zmxhc2guaWR9IHsuLi5mbGFzaH0gLz5cbiAgICAgICAgKSl9XG4gICAgPC9kaXY+XG4gICk7XG59O1xuXG5GbGFzaGVzLnByb3BUeXBlcyA9IHtcbiAgZmxhc2hlczogVC5zaGFwZSh7IGl0ZW1zOiBULmFycmF5T2YoVC5zaGFwZShGbGFzaFQpKSB9KSxcbn07XG5cbmNvbnN0IEJhY2tlbmRGbGFzaGVzID0gKHsgZmxhc2hlcyB9KSA9PiB7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtZWRGbGFzaGVzID1cbiAgICAgIGZsYXNoZXMubWFwKChmbGFzaCkgPT4ge1xuICAgICAgICBjb25zdCBbdHlwZSwgY29udGVudF0gPSBmbGFzaDtcbiAgICAgICAgcmV0dXJuIHsgdHlwZSwgY29udGVudCB9O1xuICAgICAgfSkgfHwgW107XG5cbiAgICBpZiAodHJhbnNmb3JtZWRGbGFzaGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlID0gZ2V0UmVtb3RlRGF0YVN0b3JlKCk7XG5cbiAgICAgIHN0b3JlLmRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogXCJmbGFzaC9wdXNoXCIsXG4gICAgICAgIHBheWxvYWQ6IHRyYW5zZm9ybWVkRmxhc2hlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IFdyYXBwZWRGbGFzaGVzID0gQ29ubmVjdFN0YXRlV3JhcHBlcihGbGFzaGVzLCB7IGZsYXNoZXM6IHNlbGVjdEZsYXNoZXMgfSk7XG5cbiAgcmV0dXJuIDxXcmFwcGVkRmxhc2hlcyAvPjtcbn07XG5cbkJhY2tlbmRGbGFzaGVzLnByb3BUeXBlcyA9IHtcbiAgZmxhc2hlczogVC5hcnJheU9mKFQuYXJyYXlPZihULnN0cmluZykpLFxufTtcblxuZXhwb3J0IHsgcmVkdWNlckZsYXNoZXMsIEZMQVNIX0RBVEFfSUQsIEZsYXNoZXMgfTtcbmV4cG9ydCBkZWZhdWx0IEJhY2tlbmRGbGFzaGVzO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFQgZnJvbSBcInByb3AtdHlwZXNcIjtcblxuY29uc3QgSWNvbiA9ICh7IG5hbWUsIHNpemUgPSBcIjAuNzVyZW1cIiwgY29sb3IgPSBcIlwiLCBhZGRpdGlvbmFsQ1NTID0gXCJcIiwgLi4uYWRkaXRpb25hbEF0dHJpYnV0ZXMgfSkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxzdmcgY2xhc3NOYW1lPXtgJHtjb2xvcn0gJHthZGRpdGlvbmFsQ1NTfWB9IHN0eWxlPXt7IHdpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemUgfX0gey4uLmFkZGl0aW9uYWxBdHRyaWJ1dGVzfT5cbiAgICAgIDx1c2UgeGxpbmtIcmVmPXtgI3Nwcml0ZS0ke25hbWV9YH0gLz5cbiAgICA8L3N2Zz5cbiAgKTtcbn07XG5cbkljb24ucHJvcFR5cGVzID0ge1xuICBuYW1lOiBULnN0cmluZy5pc1JlcXVpcmVkLFxuICBzaXplOiBULnN0cmluZyxcbiAgY29sb3I6IFQuc3RyaW5nLFxuICBhZGRpdGlvbmFsQ1NTOiBULnN0cmluZyxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEljb247XG4iLCJleHBvcnQgY29uc3QgcXVlcnlJZCA9ICh2YWwsIHJvb3QgPSBkb2N1bWVudCkgPT5cbiAgcm9vdC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD0ke3ZhbH1dYCk7XG5cbmV4cG9ydCBjb25zdCBxdWVyeUlkQWxsID0gKHZhbCwgcm9vdCA9IGRvY3VtZW50KSA9PlxuICByb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFtkYXRhLWlkPSR7dmFsfV1gKTtcbiIsImltcG9ydCB7IGNyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMgfSBmcm9tIFwicmVkdXhcIjtcblxuZXhwb3J0IGNvbnN0IGF0dGFjaFN0b3JlVG9XaW5kb3cgPSAoc3RvcmUpID0+IHtcbiAgd2luZG93LkFibHlVaSA9IHdpbmRvdy5BYmx5VWkgfHwge307XG4gIHdpbmRvdy5BYmx5VWkuUmVtb3RlRGF0YVN0b3JlID0gc3RvcmU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVtb3RlRGF0YVN0b3JlID0gKCkgPT4ge1xuICBpZiAoIXdpbmRvdy5BYmx5VWkuUmVtb3RlRGF0YVN0b3JlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUmVtb3RlIHN0b3JlIHdhcyBjYWxsZWQgYmVmb3JlIG9uZSB3YXMgY3JlYXRlZFwiKTtcbiAgfVxuXG4gIHJldHVybiB3aW5kb3cuQWJseVVpLlJlbW90ZURhdGFTdG9yZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0U3RhdGUgPSAoc2VsZWN0b3IsIHNldFN0YXRlKSA9PiB7XG4gIGNvbnN0IHN0b3JlID0gZ2V0UmVtb3RlRGF0YVN0b3JlKCk7XG4gIGxldCBjYWNoZWRPbGRTdGF0ZSA9IHNlbGVjdG9yKHN0b3JlKTtcblxuICBzdG9yZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgIGNvbnN0IG5ld1N0YXRlID0gc2VsZWN0b3Ioc3RvcmUpO1xuXG4gICAgLy8gRG8gbm90aGluZywgc3RhdGUgaXMgdGhlIHNhbWVcbiAgICBpZiAobmV3U3RhdGUgPT09IGNhY2hlZE9sZFN0YXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2FjaGVkT2xkU3RhdGUgPSBuZXdTdGF0ZTtcbiAgICBzZXRTdGF0ZShuZXdTdGF0ZSk7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlbW90ZURhdGFTdG9yZSA9IChyZWR1Y2VycykgPT5cbiAgY3JlYXRlU3RvcmUoY29tYmluZVJlZHVjZXJzKHJlZHVjZXJzKSk7XG4iLCIvLyBleHRyYWN0ZWQgYnkgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5cbmV4cG9ydCB7fTsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfZG9tcHVyaWZ5X187IiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX2pzX2Nvb2tpZV9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9sb2Rhc2hfdGhyb3R0bGVfXzsiLCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfcHJvcF90eXBlc19fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9yZWFjdF9fOyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9yZWR1eF9fOyIsImxldCB1cmxBbHBoYWJldCA9XG4gICd1c2VhbmRvbS0yNlQxOTgzNDBQWDc1cHhKQUNLVkVSWU1JTkRCVVNIV09MRl9HUVpiZmdoamtscXZ3eXpyaWN0J1xuZXhwb3J0IGxldCBjdXN0b21BbHBoYWJldCA9IChhbHBoYWJldCwgZGVmYXVsdFNpemUgPSAyMSkgPT4ge1xuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgbGV0IGkgPSBzaXplXG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWQgKz0gYWxwaGFiZXRbKE1hdGgucmFuZG9tKCkgKiBhbHBoYWJldC5sZW5ndGgpIHwgMF1cbiAgICB9XG4gICAgcmV0dXJuIGlkXG4gIH1cbn1cbmV4cG9ydCBsZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT4ge1xuICBsZXQgaWQgPSAnJ1xuICBsZXQgaSA9IHNpemVcbiAgd2hpbGUgKGktLSkge1xuICAgIGlkICs9IHVybEFscGhhYmV0WyhNYXRoLnJhbmRvbSgpICogNjQpIHwgMF1cbiAgfVxuICByZXR1cm4gaWRcbn1cbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiAobW9kdWxlWydkZWZhdWx0J10pIDpcblx0XHQoKSA9PiAobW9kdWxlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgeyBhOiBnZXR0ZXIgfSk7XG5cdHJldHVybiBnZXR0ZXI7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJpbXBvcnQgXCIuL2NvbXBvbmVudC5jc3NcIjtcbmltcG9ydCBDb29raWUgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gudGhyb3R0bGVcIjtcblxuaW1wb3J0IHsgcXVlcnlJZCB9IGZyb20gXCIuLi9kb20tcXVlcnlcIjtcbmltcG9ydCB7IEZMQVNIX0RBVEFfSUQgfSBmcm9tIFwiLi4vRmxhc2gvY29tcG9uZW50LmpzeFwiO1xuXG5jb25zdCBDT09LSUVfRVhQSVJZID0gOTA7XG5jb25zdCBDT0xMQVBTRV9UUklHR0VSX0RJU1RBTkNFID0gNTtcbmNvbnN0IFNDUk9MTF9MSVNURU5FUl9USFJPVFRMRSA9IDEwMDtcbmNvbnN0IFJFU0laRV9MSVNURU5FUl9USFJPVFRMRSA9IDEwMDtcblxuY29uc3QgaXNNZFZpZXdwb3J0ID0gKCkgPT4gIXdpbmRvdy5tYXRjaE1lZGlhKGAobWluLXdpZHRoOiA2NXJlbSlgKS5tYXRjaGVzO1xuXG5jb25zdCBhZGp1c3RGbGFzaE1hcmdpbiA9IChvcGVuKSA9PiB7XG4gIC8vIEhBQ0sgQUxFUlRcbiAgLy8gQWRkIG1hcmdpbiB0byBmbGFzaGVzIHdoZW4gb3BlbmluZyB0aGUgbm90aWNlLlxuICAvLyBGbGFzaGVzIGFyZSByZWFjdCBjb21wb25lbnRzIGFuZCB0aGlzIG5vdGljZSBuZWVkcyB0byB3b3JrIGFzIGEgdmlldy1jb21wb25lbnQgYW5kIHJlYWN0IGNvbXBvbmVudC5cbiAgLy8gV2UgY291bGQgZG8gdGhpcyB3aXRoIHJlZHV4IGJ1dCB0aGVuIHdlIHBvdGVudGlhbGx5IHVwZGF0ZSBzdGF0ZSBvbiBldmVyeSBzY3JvbGwgZXZlbnQsIHdoaWNoXG4gIC8vIGV2ZW4gd2l0aCBkZWJvdW5jZSB3aWxsIGRlcGxhdGUgb3VyIGZyYW1lIGJ1ZGdldC5cblxuICBjb25zdCBmbGFzaCA9IHF1ZXJ5SWQoRkxBU0hfREFUQV9JRCk7XG5cbiAgaWYgKGZsYXNoKSB7XG4gICAgZmxhc2guc3R5bGUubWFyZ2luVG9wID0gb3BlbiA/IGA0cmVtYCA6IG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGhpZGVPbk1vYmlsZSA9IChiYW5uZXJDb250YWluZXIpID0+IHtcbiAgaWYgKGlzTWRWaWV3cG9ydCgpKSB7XG4gICAgYmFubmVyQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgfSBlbHNlIHtcbiAgICBiYW5uZXJDb250YWluZXIuc3R5bGUuZGlzcGxheSA9IG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGhpZGVOb3RpY2UgPSAoYmFubmVyQ29udGFpbmVyKSA9PiB7XG4gIGJhbm5lckNvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSAwO1xuICBiYW5uZXJDb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXG4gIGFkanVzdEZsYXNoTWFyZ2luKGZhbHNlKTtcbn07XG5cbmNvbnN0IHNob3dOb3RpY2UgPSAoYmFubmVyQ29udGFpbmVyKSA9PiB7XG4gIGJhbm5lckNvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBudWxsO1xuICBiYW5uZXJDb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSBudWxsO1xuXG4gIGFkanVzdEZsYXNoTWFyZ2luKHRydWUpO1xufTtcblxuY29uc3Qgc2V0dXBSZW1lbWJlckNsb3NlZCA9IChjb29raWVJZCwgbm90aWNlSWQpID0+IHtcbiAgY29uc3QgY29va2llID0gQ29va2llLmdldChjb29raWVJZCkgfHwgXCJcIjtcblxuICBDb29raWUuc2V0KGNvb2tpZUlkLCBgJHtjb29raWUucmVwbGFjZShgJHtub3RpY2VJZH0sYCwgXCJcIikgKyBub3RpY2VJZH0sYCwge1xuICAgIGV4cGlyZXM6IENPT0tJRV9FWFBJUlksXG4gIH0pO1xufTtcblxuY29uc3QgaGFzQmVlbkNsb3NlZEJlZm9yZSA9IChjb29raWVJZCwgbm90aWNlSWQpID0+XG4gIChDb29raWUuZ2V0KGNvb2tpZUlkKSB8fCBcIlwiKS5pbmNsdWRlcyhub3RpY2VJZCk7XG5cbmNvbnN0IHNldHVwTm90aWNlQ29sbGFwc2UgPSAoYmFubmVyQ29udGFpbmVyKSA9PiB7XG4gIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5zY3JvbGxZO1xuXG4gIGlmIChzY3JvbGxUb3AgPiBDT0xMQVBTRV9UUklHR0VSX0RJU1RBTkNFKSB7XG4gICAgaGlkZU5vdGljZShiYW5uZXJDb250YWluZXIpO1xuICB9XG5cbiAgY29uc3QgbGlzdGVuZXIgPSB0aHJvdHRsZSgoKSA9PiB7XG4gICAgY29uc3Qgc2Nyb2xsVG9wID0gd2luZG93LnNjcm9sbFk7XG5cbiAgICBpZiAoc2Nyb2xsVG9wID4gQ09MTEFQU0VfVFJJR0dFUl9ESVNUQU5DRSkge1xuICAgICAgaGlkZU5vdGljZShiYW5uZXJDb250YWluZXIpO1xuICAgIH0gZWxzZSBpZiAoYmFubmVyQ29udGFpbmVyLnN0eWxlLm92ZXJmbG93KSB7XG4gICAgICBzaG93Tm90aWNlKGJhbm5lckNvbnRhaW5lcik7XG4gICAgfVxuICB9LCBTQ1JPTExfTElTVEVORVJfVEhST1RUTEUpO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgbGlzdGVuZXIpO1xuXG4gIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGxpc3RlbmVyKTtcbn07XG5cbmNvbnN0IHNldHVwQ2xvc2VCdG4gPSAoXG4gIGJhbm5lckNvbnRhaW5lcixcbiAgY29va2llSWQsXG4gIG5vdGljZUlkLFxuICBjb2xsYXBzZVVubW91bnRMaXN0ZW5lcnNcbikgPT4ge1xuICBjb25zdCBjbG9zZUJ0biA9IGJhbm5lckNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiYnV0dG9uXCIpO1xuXG4gIGlmICghY2xvc2VCdG4pIHJldHVybiAoKSA9PiB7fTtcblxuICBjb25zdCBsaXN0ZW5lciA9ICgpID0+IHtcbiAgICBpZiAoY29va2llSWQgJiYgbm90aWNlSWQpIHNldHVwUmVtZW1iZXJDbG9zZWQoY29va2llSWQsIG5vdGljZUlkKTtcblxuICAgIGhpZGVOb3RpY2UoYmFubmVyQ29udGFpbmVyKTtcbiAgICBjb2xsYXBzZVVubW91bnRMaXN0ZW5lcnMoKTtcbiAgfTtcblxuICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbGlzdGVuZXIpO1xuXG4gIHJldHVybiAoKSA9PiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgbGlzdGVuZXIpO1xufTtcblxuY29uc3QgcmVzaXplSGFuZGxlciA9IChiYW5uZXJDb250YWluZXIpID0+IHtcbiAgY29uc3QgaGFuZGxlciA9IHRocm90dGxlKCgpID0+IHtcbiAgICBoaWRlT25Nb2JpbGUoYmFubmVyQ29udGFpbmVyKTtcbiAgfSwgUkVTSVpFX0xJU1RFTkVSX1RIUk9UVExFKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBoYW5kbGVyKTtcblxuICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgaGFuZGxlcik7XG59O1xuXG5jb25zdCBOb3RpY2UgPSAoeyBiYW5uZXJDb250YWluZXIsIGNvb2tpZUlkLCBub3RpY2VJZCwgb3B0aW9ucyB9KSA9PiB7XG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gKCkgPT4ge307XG5cbiAgaWYgKCFiYW5uZXJDb250YWluZXIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkEgTm90aWNlIGNvbXBvbmVudCB3YXMgaW5pdGl0ZWQgYnV0IG5vIG5vdGljZSBjb250YWluZXIgd2FzIGZvdW5kLlwiXG4gICAgKTtcbiAgICByZXR1cm4gKCkgPT4ge307XG4gIH1cblxuICBpZiAoaGFzQmVlbkNsb3NlZEJlZm9yZShjb29raWVJZCwgbm90aWNlSWQpKSByZXR1cm4gKCkgPT4ge307XG5cbiAgaGlkZU9uTW9iaWxlKGJhbm5lckNvbnRhaW5lcik7XG4gIHNob3dOb3RpY2UoYmFubmVyQ29udGFpbmVyKTtcblxuICBjb25zdCBvcHRzID0geyBjb2xsYXBzZTogdHJ1ZSwgLi4ub3B0aW9ucyB9O1xuXG4gIGNvbnN0IGNvbGxhcHNlVW5tb3VudExpc3RlbmVycyA9IG9wdHMuY29sbGFwc2VcbiAgICA/IHNldHVwTm90aWNlQ29sbGFwc2UoYmFubmVyQ29udGFpbmVyKVxuICAgIDogKCkgPT4ge307XG5cbiAgY29uc3QgY2xvc2VCdG5Vbm1vdW50TGlzdGVuZXJzID0gc2V0dXBDbG9zZUJ0bihcbiAgICBiYW5uZXJDb250YWluZXIsXG4gICAgY29va2llSWQsXG4gICAgbm90aWNlSWQsXG4gICAgY29sbGFwc2VVbm1vdW50TGlzdGVuZXJzXG4gICk7XG5cbiAgY29uc3QgcmVzaXplVW5tb3VudExpc3RlbmVyID0gcmVzaXplSGFuZGxlcihiYW5uZXJDb250YWluZXIpO1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgW1xuICAgICAgY2xvc2VCdG5Vbm1vdW50TGlzdGVuZXJzLFxuICAgICAgY29sbGFwc2VVbm1vdW50TGlzdGVuZXJzLFxuICAgICAgcmVzaXplVW5tb3VudExpc3RlbmVyLFxuICAgIF0uZm9yRWFjaCgodW5tb3VudCkgPT4gdW5tb3VudCgpKTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IE5vdGljZTtcbiJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiY29ubmVjdFN0YXRlIiwiZ2V0UmVtb3RlRGF0YVN0b3JlIiwiQ29ubmVjdFN0YXRlV3JhcHBlciIsIkNvbXBvbmVudCIsInNlbGVjdG9ycyIsInN0YXRlIiwic2V0U3RhdGUiLCJzZXRTdGF0ZUZvcktleSIsImtleSIsInN0b3JlU3RhdGUiLCJzdG9yZSIsInJlc29sdmVkU3RhdGUiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwiYWNjIiwiZm9yRWFjaCIsIldyYXBwZWRDb21wb25lbnQiLCJwcm9wcyIsInVzZVJlZiIsIkRPTVB1cmlmeSIsIlQiLCJuYW5vaWQiLCJJY29uIiwiUkVEVUNFUl9LRVkiLCJGTEFTSF9EQVRBX0lEIiwiaW5pdGlhbFN0YXRlIiwiaXRlbXMiLCJyZWR1Y2VyRmxhc2hlcyIsImFjdGlvbiIsInR5cGUiLCJmbGFzaGVzIiwiQXJyYXkiLCJpc0FycmF5IiwicGF5bG9hZCIsInNlbGVjdEZsYXNoZXMiLCJnZXRTdGF0ZSIsIkZsYXNoVCIsIm9uZU9mIiwiY29udGVudCIsInN0cmluZyIsIkZMQVNIX0JHX0NPTE9SIiwiZXJyb3IiLCJzdWNjZXNzIiwibm90aWNlIiwiaW5mbyIsImFsZXJ0IiwiRkxBU0hfVEVYVF9DT0xPUiIsIkFVVE9fSElERSIsIkFVVE9fSElERV9USU1FIiwidXNlQXV0b0hpZGUiLCJjbG9zZUZsYXNoIiwidGltZW91dElkIiwiaW5jbHVkZXMiLCJjdXJyZW50Iiwic2V0VGltZW91dCIsImNsZWFyVGltZW91dCIsIkZsYXNoIiwiaWQiLCJyZW1vdmVGbGFzaCIsInJlZiIsImNsb3NlZCIsInNldENsb3NlZCIsImZsYXNoSGVpZ2h0Iiwic2V0Rmxhc2hIZWlnaHQiLCJ0cmlnZ2VyRW50cnlBbmltYXRpb24iLCJzZXRUcmlnZ2VyRW50cnlBbmltYXRpb24iLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJoZWlnaHQiLCJhbmltYXRlRW50cnkiLCJzdHlsZSIsIm1hcmdpblRvcCIsInpJbmRleCIsInNhZmVDb250ZW50Iiwic2FuaXRpemUiLCJBTExPV0VEX1RBR1MiLCJBTExPV0VEX0FUVFIiLCJ3aXRoSWNvbnMiLCJpY29uQ29sb3IiLCJfX2h0bWwiLCJwcm9wVHlwZXMiLCJGbGFzaGVzIiwiZmxhc2hlc1dpdGhJZHMiLCJzZXRGbGFzaGVzV2l0aElkcyIsImZsYXNoSWQiLCJmaWx0ZXIiLCJpdGVtIiwibWFwIiwiZmxhc2giLCJyZW1vdmVkIiwic2hhcGUiLCJhcnJheU9mIiwiQmFja2VuZEZsYXNoZXMiLCJ0cmFuc2Zvcm1lZEZsYXNoZXMiLCJsZW5ndGgiLCJkaXNwYXRjaCIsIldyYXBwZWRGbGFzaGVzIiwibmFtZSIsInNpemUiLCJjb2xvciIsImFkZGl0aW9uYWxDU1MiLCJhZGRpdGlvbmFsQXR0cmlidXRlcyIsIndpZHRoIiwiaXNSZXF1aXJlZCIsInF1ZXJ5SWQiLCJ2YWwiLCJyb290IiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicXVlcnlJZEFsbCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJjcmVhdGVTdG9yZSIsImNvbWJpbmVSZWR1Y2VycyIsImF0dGFjaFN0b3JlVG9XaW5kb3ciLCJ3aW5kb3ciLCJBYmx5VWkiLCJSZW1vdGVEYXRhU3RvcmUiLCJFcnJvciIsInNlbGVjdG9yIiwiY2FjaGVkT2xkU3RhdGUiLCJzdWJzY3JpYmUiLCJuZXdTdGF0ZSIsImNyZWF0ZVJlbW90ZURhdGFTdG9yZSIsInJlZHVjZXJzIiwiQ29va2llIiwidGhyb3R0bGUiLCJDT09LSUVfRVhQSVJZIiwiQ09MTEFQU0VfVFJJR0dFUl9ESVNUQU5DRSIsIlNDUk9MTF9MSVNURU5FUl9USFJPVFRMRSIsIlJFU0laRV9MSVNURU5FUl9USFJPVFRMRSIsImlzTWRWaWV3cG9ydCIsIm1hdGNoTWVkaWEiLCJtYXRjaGVzIiwiYWRqdXN0Rmxhc2hNYXJnaW4iLCJvcGVuIiwiaGlkZU9uTW9iaWxlIiwiYmFubmVyQ29udGFpbmVyIiwiZGlzcGxheSIsImhpZGVOb3RpY2UiLCJtYXhIZWlnaHQiLCJvdmVyZmxvdyIsInNob3dOb3RpY2UiLCJzZXR1cFJlbWVtYmVyQ2xvc2VkIiwiY29va2llSWQiLCJub3RpY2VJZCIsImNvb2tpZSIsImdldCIsInNldCIsInJlcGxhY2UiLCJleHBpcmVzIiwiaGFzQmVlbkNsb3NlZEJlZm9yZSIsInNldHVwTm90aWNlQ29sbGFwc2UiLCJzY3JvbGxUb3AiLCJzY3JvbGxZIiwibGlzdGVuZXIiLCJhZGRFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInNldHVwQ2xvc2VCdG4iLCJjb2xsYXBzZVVubW91bnRMaXN0ZW5lcnMiLCJjbG9zZUJ0biIsInJlc2l6ZUhhbmRsZXIiLCJoYW5kbGVyIiwiTm90aWNlIiwib3B0aW9ucyIsImNvbnNvbGUiLCJ3YXJuIiwib3B0cyIsImNvbGxhcHNlIiwiY2xvc2VCdG5Vbm1vdW50TGlzdGVuZXJzIiwicmVzaXplVW5tb3VudExpc3RlbmVyIiwidW5tb3VudCJdLCJzb3VyY2VSb290IjoiIn0=