ably-ui 8.7.0.dev.6053fb4 → 8.7.0.dev.7072b07

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +6 -6
  3. data/README.md +7 -3
  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 +8 -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 +3 -1
  23. data/lib/ably_ui/core/footer/component.js +82 -1
  24. data/lib/ably_ui/core/footer/footer.html.erb +18 -23
  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-2023.svg +1 -0
  29. data/lib/ably_ui/core/images/highest-user-adoption-2023.svg +1 -0
  30. data/lib/ably_ui/core/loader/component.js +22 -1
  31. data/lib/ably_ui/core/logo/component.js +22 -1
  32. data/lib/ably_ui/core/meganav/component.css +3 -3
  33. data/lib/ably_ui/core/meganav/component.js +992 -1
  34. data/lib/ably_ui/core/meganav/component.json +1 -1
  35. data/lib/ably_ui/core/meganav/meganav.rb +4 -4
  36. data/lib/ably_ui/core/meganav_blog_posts_list/component.js +1159 -1
  37. data/lib/ably_ui/core/meganav_content_company/component.js +22 -1
  38. data/lib/ably_ui/core/meganav_content_company/meganav_content_company.html.erb +9 -0
  39. data/lib/ably_ui/core/meganav_content_developers/component.js +22 -1
  40. data/lib/ably_ui/core/meganav_content_developers/meganav_content_developers.html.erb +18 -2
  41. data/lib/ably_ui/core/meganav_content_products/component.js +22 -0
  42. data/lib/ably_ui/core/{meganav_content_platform/meganav_content_platform.html.erb → meganav_content_products/meganav_content_products.html.erb} +15 -33
  43. data/lib/ably_ui/core/{meganav_content_platform/meganav_content_platform.rb → meganav_content_products/meganav_content_products.rb} +1 -1
  44. data/lib/ably_ui/core/meganav_content_use_cases/component.js +22 -1
  45. data/lib/ably_ui/core/meganav_content_use_cases/meganav_content_use_cases.html.erb +42 -38
  46. data/lib/ably_ui/core/meganav_control/component.js +241 -1
  47. data/lib/ably_ui/core/meganav_control_mobile_dropdown/component.js +180 -1
  48. data/lib/ably_ui/core/meganav_control_mobile_panel_close/component.js +142 -1
  49. data/lib/ably_ui/core/meganav_control_mobile_panel_open/component.js +170 -1
  50. data/lib/ably_ui/core/meganav_items_desktop/component.js +22 -1
  51. data/lib/ably_ui/core/meganav_items_desktop/meganav_items_desktop.rb +1 -1
  52. data/lib/ably_ui/core/meganav_items_mobile/component.js +22 -1
  53. data/lib/ably_ui/core/meganav_items_signed_in/component.js +22 -1
  54. data/lib/ably_ui/core/meganav_search/component.js +22 -1
  55. data/lib/ably_ui/core/meganav_search_autocomplete/component.js +295 -1
  56. data/lib/ably_ui/core/meganav_search_panel/component.js +22 -1
  57. data/lib/ably_ui/core/meganav_search_suggestions/component.js +258 -1
  58. data/lib/ably_ui/core/notice/component.css +2 -0
  59. data/lib/ably_ui/core/notice/component.js +872 -1
  60. data/lib/ably_ui/core/scripts.js +1465 -1
  61. data/lib/ably_ui/core/showcase/component.css +2 -0
  62. data/lib/ably_ui/core/showcase/component.js +343 -1
  63. data/lib/ably_ui/core/sign_out_link/component.js +22 -1
  64. data/lib/ably_ui/core/slider/component.css +2 -0
  65. data/lib/ably_ui/core/slider/component.js +255 -1
  66. data/lib/ably_ui/core/sprites.svg +93 -0
  67. data/lib/ably_ui/core/styles.css +3 -7
  68. data/lib/ably_ui/core/uptime/component.css +2 -0
  69. data/lib/ably_ui/core/uptime/component.js +82 -1
  70. data/lib/ably_ui/reset/scripts.js +1 -1
  71. data/lib/ably_ui/reset/styles.css +1 -11
  72. data/lib/ably_ui/version.rb +1 -1
  73. metadata +9 -5
  74. data/lib/ably_ui/core/meganav_content_platform/component.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 p=(e=21)=>{let t="",r=e;for(;r--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[64*Math.random()|0];return t};u(5044);var d=["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,d);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],p=O((0,o.useState)(0),2),d=p[0],y=p[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=d&&!s?{height:"".concat(d,"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 L=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:p(),removed:!1})}))))}))}),[t]),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))})))};L.propTypes={flashes:f().shape({items:f().arrayOf(f().shape(A))})};function z(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 D(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 I=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",I(!1)},_=function(e){e.style.maxHeight=null,e.style.overflow=null,I(!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?z(Object(r),!0).forEach((function(t){D(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):z(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=