PageSourceSearch

https://cdn4.hola.org/www/hola/pub/join_n.js

js hola.org collected 2026-09-24 10:16:54 UTC 42,752 bytes, 639 lines download raw bytes

vendor: 5,483 bytes, lines 1-2
1;(function () {// LICENSE_CODE ZON
2  'use strict'; /*jslint node:true, es6:true, react:true*/function _regenerator() {/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */var e,t,r = "function" == typeof Symbol ? Symbol : {},n = r.iterator || "@@iterator",o = r.toStringTag || "@@toStringTag";function i(r, n, o, i) {var c = n && n.prototype instanceof Generator ? n : Generator,u = Object.create(c.prototype);return _regeneratorDefine2(u, "_invoke", function (r, n, o) {var i,c,u,f = 0,p = o || [],y = !1,G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) {return i = t, c = 0, u = e, G.n = r, a;} };function d(r, n) {for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {var o,i = p[t],d = G.p,l = i[2];r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));}if (o || r > 1) return a;throw y = !0, n;}return function (o, p, l) {if (f > 1) throw TypeError("Generator is already running");for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);try {if (f = 2, i) {if (c || (o = "next"), t = i[o]) {if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object");if (!t.done) return t;u = t.value, c < 2 && (c = 0);} else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1);i = e;} else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;} catch (t) {i = e, c = 1, u = t;} finally {f = 1;}}return { value: t, done: y };};}(r, o, i), !0), u;}var a = {};function Generator() {}function GeneratorFunction() {}function GeneratorFunctionPrototype() {}t = Object.getPrototypeOf;var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () {return this;}), t),u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);function f(e) {return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e;}return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () {return this;}), _regeneratorDefine2(u, "toString", function () {return "[object Generator]";}), (_regenerator = function _regenerator() {return { w: i, m: f };})();}function _regeneratorDefine2(e, r, n, t) {var i = Object.defineProperty;try {i({}, "", {});} catch (e) {i = 0;}_regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) {function o(r, n) {_regeneratorDefine2(e, r, function (e) {return this._invoke(r, n, e);});}r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2));}, _regeneratorDefine2(e, r, n, t);}function _extends() {return _extends = Object.assign ? Object.assign.bind() : function (n) {for (var e = 1; e < arguments.length; e++) {var t = arguments[e];for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);}return n;}, _extends.apply(null, arguments);}function _slicedToArray(r, e) {return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();}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.");}function _unsupportedIterableToArray(r, a) {if (r) {if ("string" == typeof r) return _arrayLikeToArray(r, a);var t = {}.toString.call(r).slice(8, -1);return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;}}function _arrayLikeToArray(r, a) {(null == a || a > r.length) && (a = r.length);for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];return n;}function _iterableToArrayLimit(r, l) {var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];if (null != t) {var e,n,i,u,a = [],f = !0,o = !1;try {if (i = (t = t.call(r)).next, 0 === l) {if (Object(t) !== t) return;f = !1;} else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);} catch (r) {o = !0, n = r;} finally {try {if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return;} finally {if (o) throw n;}}return a;}}function _arrayWithHoles(r) {if (Array.isArray(r)) return r;}function ownKeys(e, r) {var t = Object.keys(e);if (Object.getOwnPropertySymbols) {var o = Object.getOwnPropertySymbols(e);r && (o = o.filter(function (r) {return Object.getOwnPropertyDescriptor(e, r).enumerable;})), t.push.apply(t, o);}return t;}function _objectSpread(e) {for (var r = 1; r < arguments.length; r++) {var t = null != arguments[r] ? arguments[r] : {};
2r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {_defineProperty(e, r, t[r]);}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));});}return e;}function _defineProperty(e, r, t) {return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e;}function _toPropertyKey(t) {var i = _toPrimitive(t, "string");return "symbol" == _typeof(i) ? i : i + "";}function _toPrimitive(t, r) {if ("object" != _typeof(t) || !t) return t;var e = t[Symbol.toPrimitive];if (void 0 !== e) {var i = e.call(t, r || "default");if ("object" != _typeof(i)) return i;throw new TypeError("@@toPrimitive must return a primitive value.");}return ("string" === r ? String : Number)(t);}function _typeof(o) {"@babel/helpers - typeof";return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {return typeof o;} : function (o) {return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;}, _typeof(o);}
3  var define;
4  var is_node = (typeof module === "undefined" ? "undefined" : _typeof(module)) == 'object' && module.exports;
5  if (is_node)
6  define = require('../../../util/require_node.js').define(module, '..');else
7
8  define = self.define;
9  define(['react',
10  '/util/url.js', '/www/hola/pub/ui/trustpilot_link.tsx',
11  '/www/hola/pub/lib/screen_util.ts',
12  '/www/hola/pub/ui/install_util.js', '/www/hola/pub/ui/img_url.ts',
13  'hola_opt', '/util/etask.js', '/util/escape.js',
14  'classnames', 'zutil',
15  '/svc/account/pub/membership.js', '/www/hola/pub/plus_util.js',
16  '/www/hola/pub/eec.js', '/www/hola/pub/gtm.ts',
17  '/util/zerr.js', '/util/hash.js',
18  '/www/hola/pub/plus_ui.js', '/www/hola/pub/install_util.js',
19  '/www/hola/pub/util.js', '/util/country.js', 'react-router-dom',
20  '/www/hola/pub/pages_dict.js', '/www/hola/pub/plans_util.js',
21  'react-i18next',
22  '/www/hola/pub/experiment_init',
23  '/www/hola/pub/experiment_util',
24  '/www/hola/pub/ui/navbar/navbar_logo.js', '/www/hola/pub/plus/plans.js',
25  '/www/hola/pub/lib/slider.tsx',
26  '/www/hola/pub/settings_ctx.tsx',
27  '/www/hola/pub/plus/payment_progress.tsx',
28  '/www/hola/pub/lib/tooltip.js',
29  '/www/hola/pub/plus/currency_select.tsx',
30  '/www/hola/pub/lib/use_qs.ts', '/www/hola/pub/plus/plan_banner.tsx',
31  '/www/hola/pub/ui/browser/br_footer.tsx',
32  // imports only
33  '/www/hola/pub/css/join_n.less'],
34  function (React, zurl, _ref, _ref2, _ref3, _ref4, hopt, etask, zescape,
35  cn, _, membership, plus_util, eec, gtm, zerr, zhash, plus_ui,
36  iutil, www_util, zcountry, RRD, pages_dict,
37  plans_util, react_i18n,
38  experiment_init, experiment_util, _ref5, _ref6, _ref7, _ref8, _ref9, _ref0, _ref1, _ref10, _ref11, _ref12)
39
40
41
42  {var Trustpilot_link = _ref.Trustpilot_link;var get_width = _ref2.get_width;var _start_install = _ref3._start_install;var img_url = _ref4.img_url;var Navbar_logo = _ref5.Navbar_logo;var Plus_plans = _ref6.Plus_plans;var Slider = _ref7.Slider;var Settings_context = _ref8.Settings_context;var Payment_progress = _ref9.Payment_progress;var Tooltip = _ref0.Tooltip;var Currency_select = _ref1.Currency_select;var use_qs_with_set = _ref10.use_qs_with_set;var Plan_banner = _ref11.Plan_banner;var Br_footer = _ref12.Br_footer;
43    var useState = React.useState,useEffect = React.useEffect,Fragment = React.Fragment,useContext = React.useContext;
44    var useLocation = RRD.useLocation;
45    var T = react_i18n.Trans,useTranslation = react_i18n.useTranslation;
46    experiment_init = experiment_init["default"];
47    experiment_util = experiment_util["default"];
48    var E = {};
49
50    var qs_o = function qs_o() {return zurl.qs_parse(location.search.substr(1), { safe: true });};
51    var N = 2;
52    var ref = qs_o().ref || '';
53
54    var perr = function perr(opt) {return (
55        plus_util.perr(_objectSpread(_objectSpread({}, opt), {}, { id: opt.id.replace(/^www_join1/, "www_join".concat(N)) })));};
56    var perr_hashes = {};
57    var perr_once = function perr_once(opt) {
58      var hash = '' + zhash.hash_string(zerr.json(opt));
59      if (perr_hashes[hash])
60      return;
61      perr_hashes[hash] = true;
62      return perr(opt);
63    };
64    var plan_to_url = function plan_to_url(plan) {var opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};return plan && (
65      opt.ultra ? plan.id : plan.period.toLowerCase().replace(' ', ''));};
66    var get_url_plan = function get_url_plan(params) {
67      params = params || qs_o();
68      if (plans_util.get_coupon_flow() == 'coupon')
69      return { id: 'coupon', price: 0 };
70      var plan, period;
71      if (params.plan_id)
72      {
73        plan = plans_util.get_plans_info_obj({ id: params.plan_id });
74        if (plan)
75        return plans_util.get_discount_plan(plan) || plan;
76        perr_once({ id: 'www_join1_plan_not_found', info: params });
77      }
78      if (!plan && params.plan)
79      period = plus_util.parse_plan_period(params.plan);
80      if (!period && params.plan_id)
81      period = plus_util.parse_plan_period(params.plan_id);
82      if (period)
83      {
84        plan = plans_util.get_plans_info_obj({ period: period });
85        plan = plans_util.get_discount_plan(plan) || plan;
86        if (!plan)
87        perr_once({ id: 'www_join1_plan_not_found', info: params });
88        return plan;
89      }
90    };
91    E.get_url_plan = get_url_plan;
92    var get_url_plan_or_default = function get_url_plan_or_default(def, params) {
93      var plan = get_url_plan(params);
94      if (plan)
95      return plan;
96      return get_url_plan(def);
97    };
98    E.get_url_plan_or_default = get_url_plan_or_default;
99
100    var Free_period_label = function Free_period_label(_ref13) {var plan = _ref13.plan,is_payment_slide = _ref13.is_payment_slide;
101      var _ref14 = plan || {},free_period = _ref14.free_period,plan_id = _ref14.id;
102      var _ref15 = {
103          '1 M': { src: 'plus/free_for_month.png' }
104        }[free_period] || {},src = _ref15.src;
105      var _useState = useState(src),_useState2 = _slicedToArray(_useState, 2),img_src = _useState2[0],set_img_src = _useState2[1];
106      var _useState3 = useState(false),_useState4 = _slicedToArray(_useState3, 2),show_label = _useState4[0],set_show_label = _useState4[1];
107      useEffect(function () {
108        if (plan_id)
109        set_img_src(src);
110      }, [src, plan_id]);
111      useEffect(function () {
112        set_show_label(img_src && is_payment_slide);
113      }, [img_src, is_payment_slide]);
114      return img_src ? /*#__PURE__*/React.createElement("img", { src: img_url(img_src), alt: "free_period",
115        className: cn('free_period_label label_appear', 'lazyload',
116        !show_label && 'label_hidden') }) : null;
117    };
118
119    var Header = function Header() {
120      if (pages_dict.is_uninstall_page())
121      {
122        return /*#__PURE__*/React.createElement("div", { className: "header uninstall" }, /*#__PURE__*/
123        React.createElement("p", null, "Special offer:"), /*#__PURE__*/
124        React.createElement("h2", null, /*#__PURE__*/React.createElement("span", null, "Save 47% "), "on Hola Premium")
125        );
126      }
127      return /*#__PURE__*/React.createElement("div", { className: "header" }, /*#__PURE__*/
128      React.createElement("h2", null, /*#__PURE__*/React.createElement(T, null, "Choose Your Plan")), /*#__PURE__*/
129      React.createElement("p", null, /*#__PURE__*/React.createElement("b", null, /*#__PURE__*/React.createElement(T, null, "Unlimited super fast browsing"
130      )))
131      );
132    };
133
134    var Select_plan = function Select_plan(props) {
135      var downloads =
136        props.downloads,plans = props.plans,set_plan = props.set_plan,country = props.country,set_currency = props.set_currency,cls = props.cls,only_right_part = props.only_right_part;
137      var _useContext = useContext(Settings_context),theme = _useContext.theme;
138      var _useLocation = useLocation(),pathname = _useLocation.pathname;
139      plans = plans.slice();
140      if (plans.length == 0)
141      return /*#__PURE__*/React.createElement(Fragment, null);
142      var _plans_util$get_speci = plans_util.get_special_plans(plans),best = _plans_util$get_speci.best;
143      var _plus_util$get_curren = plus_util.get_currency_o(props.currency,
144        best),currency = _plus_util$get_curren.currency,currencies = _plus_util$get_curren.currencies;
145      var _membership$get_price = membership.get_price_plan(best, currency),renewal_price = _membership$get_price.renewal_price;
146      var annual_promo = pages_dict.is_uninstall_page() ||
147      pages_dict.is_annual_promo();
148      var bogof_promo = pages_dict.is_bogof_promo();
149      var is_afflp_ni = (qs_o().ref || '').indexOf('afflp_ni') > -1;
150      var is_afflp_annual = (qs_o().ref || '').indexOf('afflp_annual') > -1;
151      var is_new_tabs = pathname == '/premium' && (
152      is_afflp_ni || is_afflp_annual);
153      var _qs_o = qs_o(),layout = _qs_o.layout;
154      var condensed = layout == 'condensed';
155      return /*#__PURE__*/React.createElement("div", { className: cn('select-plan', cls) },
156      currencies.length > 1 && /*#__PURE__*/
157      React.createElement(Currency_select, { only_right_part: only_right_part,
158        currency: currency, on_change: set_currency, currencies: currencies,
159        cls: cn('currency_select_float_right',
160        condensed && 'condensed_currency_select_float_right') }),
161      !only_right_part && /*#__PURE__*/React.createElement(Header, { downloads: downloads, country: country }), /*#__PURE__*/
162      React.createElement("div", { className: "container" },
163      is_new_tabs ? /*#__PURE__*/React.createElement(plus_ui.Plus_plans_tabs, { plans: plans,
164        set_plan: set_plan, best: best, currency: currency }) : /*#__PURE__*/
165      React.createElement(Plus_plans, { plans: plans, best: best, N: N, bogof: bogof_promo,
166        set_plan: set_plan, "short": true, currency: currency }), /*#__PURE__*/
167      React.createElement("div", { className: "money-back" }, /*#__PURE__*/
168      React.createElement(T, { i18nKey: "30_day_moneyback_text.join_n",
169        components: { span: /*#__PURE__*/React.createElement("span", { className: cn(theme.P, theme.xs) }),
170          b: /*#__PURE__*/React.createElement("b", null), strong: /*#__PURE__*/React.createElement("strong", null),
171          a: /*#__PURE__*/React.createElement("a", { href: "/faq#refund-policy", target: "_blank",
172            rel: "noopener noreferrer" }) } })
173      ),
174      annual_promo && /*#__PURE__*/React.createElement("div", { className: "renewal" }, /*#__PURE__*/
175      React.createElement("p", { className: theme.p2 }, /*#__PURE__*/
176      React.createElement("sup", null, "*"), "After the initial period, you will be charged ",
177      zcountry.format_price(
178        currency, renewal_price), " annual service fee until you cancel the subscription"
179
180      )
181      ),
182      bogof_promo && /*#__PURE__*/React.createElement("div", { className: "renewal" }, /*#__PURE__*/
183      React.createElement("p", { className: theme.p2 }, "* After the initial 2 months period, you will be charged ",
184
185      zcountry.format_price(
186        currency, best.price), " monthly service fee until you cancel the subscription"
187
188      )
189      )
190      )
191      );
192    };
193
194    var Slide_select_plan = function Slide_select_plan(_ref16) {var cls = _ref16.cls,cmp_props = _ref16.cmp_props;
195      return /*#__PURE__*/React.createElement(Select_plan, _extends({ key: "select_plan", cls: cls }, cmp_props));
196    };
197
198    var Coupon_slide = function Coupon_slide(_ref17) {var cls = _ref17.cls,cmp_props = _ref17.cmp_props;
199      var email =
200        cmp_props.email,coupon_flow = cmp_props.coupon_flow,slide = cmp_props.slide,go_back = cmp_props.go_back,show_back = cmp_props.show_back,on_continue = cmp_props.on_continue;
201      return /*#__PURE__*/React.createElement("div", { key: "coupon", className: cls },
202      !!show_back && /*#__PURE__*/React.createElement("a", { className: "back-button", onClick: go_back }, "Back"
203      ), /*#__PURE__*/
204      React.createElement(plus_ui.Step_redeem, { email: email,
205        slide_active: slide == 'coupon',
206        hide_agree: coupon_flow != 'coupon',
207        on_continue: coupon_flow != 'coupon' && on_continue })
208      );
209    };
210    var Payment_slide = function Payment_slide(_ref18) {var cls = _ref18.cls,cmp_props = _ref18.cmp_props;
211      var slide = cmp_props.slide,plan = cmp_props.plan;
212      var _useState5 = useState(false),_useState6 = _slicedToArray(_useState5, 2),method_chosen = _useState6[0],set_method_chosen = _useState6[1];
213      var payment_step_cls = cn('container payment-container',
214      method_chosen && 'method-chosen');
215      return /*#__PURE__*/React.createElement("div", { key: "payment", className: cls }, /*#__PURE__*/
216      React.createElement("div", { className: payment_step_cls },
217      plan && /*#__PURE__*/React.createElement(plus_ui.Step_payment, _extends({ expand: "cc", selected_plan: plan,
218        slide_active: slide == 'payment', set_method_chosen: set_method_chosen,
219        method_chosen: method_chosen }, cmp_props)
220      )
221      )
222      );
223    };
224
225    var Slides = function Slides(props) {
226      var user =
227
228
229
230        props.user,user_email = props.user_email,load_user = props.load_user,plan = props.plan,api = props.api,set_api = props.set_api,api_loaded = props.api_loaded,go_back = props.go_back,on_continue = props.on_continue,slide = props.slide,set_plan = props.set_plan,downloads = props.downloads,currency = props.currency,country = props.country,coupon = props.coupon,set_currency = props.set_currency,script_err = props.script_err,set_coupon = props.set_coupon,on_script_load_err = props.on_script_load_err,only_right_part = props.only_right_part,on_method_tab_change = props.on_method_tab_change,on_vat_obj_change = props.on_vat_obj_change;
231      var _useLocation2 = useLocation(),pathname = _useLocation2.pathname;
232      var _useState7 = useState({ email: user_email,
233          email_error: null }),_useState8 = _slicedToArray(_useState7, 2),state = _useState8[0],set_state = _useState8[1];
234      var _useState9 = useState([]),_useState0 = _slicedToArray(_useState9, 2),plans = _useState0[0],set_plans = _useState0[1];
235      useEffect(function () {
236        perr({ id: "www_join1_".concat(slide, "_show") });
237      }, [slide]);
238      var plans_version = plans_util.use_plans();
239      useEffect(function () {
240        var plans_info = _.values(plans_util.get_plans_info(plans_util.
241        get_plan_ids()));
242        set_plans(plans_info);
243        var _plans_util$get_speci2 = plans_util.get_special_plans(plans_info || []),best = _plans_util$get_speci2.best;
244        var currency_o = plus_util.get_currency_o(currency, best);
245        set_currency(currency_o.currency);
246      }, [pathname, plans_version]);
247      var set_email = function set_email(email) {return set_state(function (_st) {
248          email = "".concat(email || '').trim();
249          return _objectSpread(_objectSpread({}, _st), {}, { email: email, email_error: null });
250        });};
251      var set_email_err = function set_email_err(email_error) {return set_state(function (_st) {
252          return _objectSpread(_objectSpread({}, _st), {}, { email_error: email_error });
253        });};
254      var email = state.email,email_error = state.email_error;
255      var check_email = function check_email(_email) {
256        if ((_email || email) && !user)
257        {
258          var err = plus_util.validate_email_syntax(_email || email);
259          if (!err)
260          return true;
261          set_email_err(err);
262          return false;
263        }
264        return true;
265      };
266      var coupon_flow = plans_util.get_coupon_flow();
267      var show_back = slide == 'account' && !coupon_flow || slide == 'payment' && (
268      !coupon_flow || !user);
269      var steps_cls = cn('steps');
270      var cmp_props = { downloads: downloads, plan: plan, plans: plans, set_plan: set_plan, country: country, set_coupon: set_coupon,
271        coupon: coupon, currency: currency, set_currency: set_currency, user: user, slide: slide, load_user: load_user, email_error: email_error,
272        set_email_err: set_email_err, set_email: set_email, email: email, on_continue: on_continue, check_email: check_email, coupon_flow: coupon_flow,
273        show_back: show_back, go_back: go_back, script_err: script_err, api: api, user_email: user_email, api_loaded: api_loaded, set_api: set_api,
274        set_plans: set_plans, on_script_load_err: on_script_load_err, only_right_part: only_right_part,
275        on_method_tab_change: on_method_tab_change, on_vat_obj_change: on_vat_obj_change };
276      return /*#__PURE__*/React.createElement("div", { className: steps_cls }, /*#__PURE__*/
277      React.createElement(Slider, { active: slide, items: [
278        { id: 'select_plan', content: Slide_select_plan },
279        { id: 'coupon', content: !!coupon_flow && Coupon_slide },
280        { id: 'payment',
281          content: coupon_flow != 'coupon' && Payment_slide }],
282        timeout: 200, cmp_props: cmp_props, distance: 150,
283        on_end_animation: function on_end_animation() {return window.scrollTo(0, 0);} })
284      );
285    };
286
287    var Advantages = function Advantages(_ref19) {var type = _ref19.type,plan = _ref19.plan;
288      var _useTranslation = useTranslation(),t = _useTranslation.t;
289      var _useContext2 = useContext(Settings_context),theme = _useContext2.theme;
290      var platforms = img_url('platforms/platforms_list.svg');
291      if (get_width() < 768)
292      platforms = img_url('platforms/platforms_list_mobile.svg');
293      return /*#__PURE__*/React.createElement("ul", { className: "advantages ".concat(type) }, /*#__PURE__*/
294      React.createElement("li", { className: "unblock" }, /*#__PURE__*/
295      React.createElement("p", { className: theme.p2 }, /*#__PURE__*/React.createElement(T, null,
296      type == 'free' && 'Unblock 99.9% of websites',
297      type == 'plus' && 'Access more global content',
298      type == 'ultra' && (plan ? /*#__PURE__*/React.createElement("b", null, "Everything in Premium") :
299      'Access more global content')
300      ))
301      ), /*#__PURE__*/
302      React.createElement("li", { className: "devices" }, /*#__PURE__*/
303      React.createElement("p", { className: theme.p2 },
304      t('connect_devices', { count: type == 'ultra' ? 20 :
305        type == 'plus' ? 10 : 3 })
306      )
307      ), /*#__PURE__*/
308      React.createElement("li", { className: "streaming" }, /*#__PURE__*/React.createElement("p", { className: theme.p2 }, /*#__PURE__*/React.createElement(T, null, type == 'ultra' ?
309      '4K' : type == 'plus' ? 'HD' : 'SD', " Video streaming"))), /*#__PURE__*/
310      React.createElement("li", { className: "servers" }, /*#__PURE__*/React.createElement("p", { className: theme.p2 }, t("".concat(type == 'ultra' ?
311      'Ultra fast' : 'Super fast', " servers")))),
312      type == 'free' && /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/
313      React.createElement("li", null, /*#__PURE__*/React.createElement("p", { className: theme.p2 }, "Free limited browsing time"))
314      ),
315      (type == 'plus' || type == 'ultra' && !plan) && /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/
316      React.createElement("li", { className: "vpn_time" }, /*#__PURE__*/React.createElement("p", { className: theme.p2 }, /*#__PURE__*/
317      React.createElement(T, null, "Unlimited usage")))
318      ),
319      (type == 'ultra' || type == 'plus') && /*#__PURE__*/React.createElement("li", { className: "platforms" }, /*#__PURE__*/
320      React.createElement("p", { className: theme.p2 }, "Apps across all of your ", /*#__PURE__*/React.createElement(Tooltip, {
321        content: /*#__PURE__*/React.createElement("img", { alt: "platforms", src: platforms, className: "lazyload" }),
322        cls_cn: "platforms-tooltip" }, /*#__PURE__*/
323      React.createElement("span", { className: cn(theme.primary, 'platforms-tooltip-text') }, "favorite platforms"
324      )
325      ))
326      ),
327      (type == 'ultra' || type == 'plus') && /*#__PURE__*/React.createElement("li", { className: "smart_dns" }, /*#__PURE__*/
328      React.createElement("p", { className: theme.p2 }, "Smart DNS for TVs, Gaming Consoles")),
329      type == 'ultra' && /*#__PURE__*/React.createElement("li", { className: "support" }, /*#__PURE__*/React.createElement("p", { className: theme.p2 }, "24/7 Real person support"
330      ))
331      );
332    };
333    E.Advantages = Advantages;
334
335    var start_install = function start_install(ctx, agree) {
336      _start_install({ ctx: ctx, agree: agree,
337        install_src: "join".concat(N),
338        skip: { choose_plan: true }
339      }, function () {return perr({ id: 'www_join1_start_install' });});
340    };
341
342    var install_ctx_et, install_ctx;
343    var init_install_ctx = function init_install_ctx() {
344      if (install_ctx)
345      return;
346      return install_ctx_et || etask(/*#__PURE__*/_regenerator().m(function _callee() {return _regenerator().w(function (_context) {while (1) switch (_context.n) {case 0:
347              install_ctx_et = this;
348              this["finally"](function () {return install_ctx_et = null;});_context.n = 1;
349              return iutil.init_ctx({ install_src: "join".concat(N) });case 1:install_ctx = _context.v;case 2:return _context.a(2);}}, _callee, this);})
350      );
351    };
352
353    var Summary_info = function Summary_info(_ref20) {var plan = _ref20.plan,currency = _ref20.currency;
354      var _useContext3 = useContext(Settings_context),theme = _useContext3.theme;
355      var _useLocation3 = useLocation(),pathname = _useLocation3.pathname;
356      var type = pathname == '/ultra' ? 'Ultra' : 'Premium';
357      var price_o = membership.get_price_plan(plan, currency);
358      var regular_price = price_o.regular_price,price = price_o.price,discount_percent = price_o.discount_percent;
359      var save_money = regular_price - price;
360      return /*#__PURE__*/React.createElement("div", { className: cn('payment_summary_info') }, /*#__PURE__*/
361      React.createElement("div", { className: "payment_summary_row" }, /*#__PURE__*/
362      React.createElement("p", { className: cn(theme.xs, theme.grey_2) }, "Hola ", type), /*#__PURE__*/
363      React.createElement("p", { className: cn(theme.xs, theme.grey_2) },
364      zcountry.format_price(currency, regular_price))
365      ), /*#__PURE__*/
366      React.createElement("div", { className: "payment_summary_row" }, /*#__PURE__*/
367      React.createElement("p", { className: cn(theme.xs, theme.grey_2, 'payment_flex_discount') }, "Discount ",
368      discount_percent > 0 ? /*#__PURE__*/React.createElement("span", {
369        className: "payment_discount_label" }, discount_percent, "% saving"
370      ) : ''), /*#__PURE__*/
371      React.createElement("p", { className: cn(theme.xs, theme.grey_2) },
372      zcountry.format_price(currency,
373      save_money > 0 ? -save_money : 0))
374      ), /*#__PURE__*/
375      React.createElement("div", { className: "payment_summary_line" }), /*#__PURE__*/
376      React.createElement("div", { className: "payment_summary_row" }, /*#__PURE__*/
377      React.createElement("p", { className: cn(theme.xs, theme.grey_2) }, /*#__PURE__*/React.createElement("b", null, "Order total")), /*#__PURE__*/
378      React.createElement("p", { className: cn(theme.xs, theme.grey_2) },
379      zcountry.format_price(currency, price))
380      )
381      );
382    };
383
384    var Payment = function Payment(_ref21) {var opt = _ref21.opt,only_right_part = _ref21.only_right_part;
385      var _useContext4 = useContext(Settings_context),theme = _useContext4.theme;
386      var _useLocation4 = useLocation(),pathname = _useLocation4.pathname;
387      var type = pathname == '/ultra' ? 'ultra' : 'plus';
388      plans_util.use_plans();
389      var plans = _.values(plans_util.get_plans_info(plans_util.
390      get_plan_ids()));
391      var best = _.min_by(plans, function (p) {return p.month_price;});
392      var on_click_select = function on_click_select() {
393        if (opt.slide != 'select_plan')
394        opt.go_back();
395      };
396      var on_click_payment = function on_click_payment() {
397        if (opt.slide != 'payment')
398        opt.set_plan(best);
399      };
400      var plan = opt.plan;
401      var new_uninstall = pages_dict.is_uninstall_page();
402      var refund_page = ref == 'refund' || ref == 'refund_special_big_offer' ||
403      ref == 'refund_special_cta';
404      var is_condensed = qs_o().layout == 'condensed' && 'condensed';
405      return /*#__PURE__*/React.createElement("div", { className: cn(is_condensed ? 'condensed' : theme.container,
406        'payment') },
407      !is_condensed && /*#__PURE__*/React.createElement(Payment_progress, { slide: opt.slide,
408        on_click_select: on_click_select,
409        on_click_payment: on_click_payment }), /*#__PURE__*/
410      React.createElement("section", { className: cn('payment-section',
411        only_right_part && 'only_right_part') },
412      !only_right_part && !is_condensed && /*#__PURE__*/React.createElement("div", { className: "payment-info" },
413      new_uninstall ? /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/
414      React.createElement("h3", null, "Seems you are not happy with our free version\u2026", /*#__PURE__*/
415      React.createElement("br", null), "Try Hola Premium!"
416
417      )
418      ) : refund_page ? /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/
419      React.createElement("p", { className: "refund-text" }, /*#__PURE__*/
420      React.createElement("span", null, "Don't worry! "), "After confirming the payment, we will process the ", /*#__PURE__*/
421      React.createElement("b", null, "refund for your previous purchase"
422      ), " and you will receive it in the next 5-7 business days."
423
424      )
425      ) : /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/
426      React.createElement("h3", null, /*#__PURE__*/React.createElement(T, null, "Experience the full power of Hola")), /*#__PURE__*/
427      React.createElement("b", { className: theme.P }, /*#__PURE__*/React.createElement(T, { i18nKey: "get_in_join" }), " ", type == 'ultra' ?
428      'Ultra' : 'Premium')
429      ),
430      plan && opt.currency && opt.slide == 'payment' && /*#__PURE__*/
431      React.createElement(Summary_info, opt), /*#__PURE__*/
432      React.createElement(Advantages, { type: type }), /*#__PURE__*/
433      React.createElement(Trustpilot_link, null),
434      plan && opt.slide == 'payment' && /*#__PURE__*/React.createElement(Plan_banner, { plan_id: plan.id })
435      ), /*#__PURE__*/
436      React.createElement("div", { className: "payment-steps" }, /*#__PURE__*/React.createElement(Slides, _extends({}, opt, {
437        only_right_part: only_right_part })))
438      ), /*#__PURE__*/
439      React.createElement(Free_period_label, { plan: plan, is_payment_slide: opt.slide === 'payment' })
440      );
441    };
442
443    E.Root = function (_ref22) {var users_number = _ref22.users_number,user_country = _ref22.user_country,only_right_part = _ref22.only_right_part,_goto = _ref22["goto"];
444      if (_goto)
445      console.log(_goto);
446      var _useContext5 = useContext(Settings_context),theme = _useContext5.theme;
447      var _useState1 = useState({}),_useState10 = _slicedToArray(_useState1, 2),script_err = _useState10[0],set_script_err = _useState10[1];
448      var _useLocation5 = useLocation(),pathname = _useLocation5.pathname;
449      var plan = get_url_plan();
450      var version = plans_util.use_plans();
451      var coupon_flow = plans_util.get_coupon_flow();
452      var _useState11 = useState({
453          user: null,
454          api: plus_util.api,
455          slide: plan ? coupon_flow ? 'coupon' : 'payment' : 'select_plan',
456          plan_id: plan && plan.id,
457          currency: hopt.user_currency,
458          provider: undefined,
459          vat_obj: undefined
460        }),_useState12 = _slicedToArray(_useState11, 2),state = _useState12[0],set_state = _useState12[1];
461      useEffect(function () {
462        var plan2 = get_url_plan();
463        if (plan2 && state.plan_id != plan2.id)
464        set_state(function (v) {return _objectSpread(_objectSpread({}, v), {}, { plan_id: plan2.id });});
465      }, [version, state.plan_id]);
466      var api = state.api,user = state.user,api_loaded = state.api_loaded;
467      var _use_qs_with_set = use_qs_with_set(),set_url_params = _use_qs_with_set.set_qs;
468      var load_user = function load_user(force) {return etask(/*#__PURE__*/_regenerator().m(function _callee2() {var _user, coupon, new_state;return _regenerator().w(function (_context2) {while (1) switch (_context2.n) {case 0:_context2.n = 1;
469                return plus_util.login_get_user(force);case 1:_user = _context2.v;
470                coupon = state.coupon;
471                new_state = { user: _user, api: plus_util.api,
472                  api_loaded: true };
473                if (_user && _user.coupon && _user.coupon.type && (!coupon_flow ||
474                coupon_flow == _user.coupon.type))
475                {
476                  new_state.coupon = coupon = _user.coupon._id;
477                  if (_user.coupon.currency)
478                  new_state.currency = _user.coupon.currency;
479                  if (coupon_flow == 'promo_plan')
480                  {
481                    plans_util.set_fixed_plan_ids(['promo_y1', 'promo_y3']);
482                    if (ref && !ref.includes(_user.coupon.affiliate))
483                    set_url_params({ ref: _user.coupon.affiliate + ref });
484                  }
485                }
486                new_state.slide = !get_url_plan() ? 'select_plan' :
487                coupon_flow && !coupon ? 'coupon' : 'payment';
488                set_state(function (_state) {return _objectSpread(_objectSpread({}, _state), new_state);});return _context2.a(2,
489                _user);}}, _callee2);})
490        );};
491      var on_qs_change = function on_qs_change() {
492        var _plan = get_url_plan();
493        var plan_id = _plan && _plan.id;
494        set_state(function (_state) {return _objectSpread(_objectSpread({}, _state), {}, { slide: !plan_id ? 'select_plan' :
495            coupon_flow && !_state.coupon ? 'coupon' : 'payment',
496            plan_id: plan_id || _state.plan_id });});
497      };
498      var on_method_tab_change = function on_method_tab_change(method, provider) {
499        set_state(function (s) {return _objectSpread(_objectSpread({}, s), {}, { provider: provider });});
500      };
501      var on_vat_obj_change = function on_vat_obj_change(vat_obj) {
502        set_state(function (s) {return _objectSpread(_objectSpread({}, s), {}, { vat_obj: vat_obj });});
503      };
504      var checkout_redirect = function checkout_redirect() {
505
506
507        // XXX dmitriiz: do nothing, there was code for "old layout"
508      };var on_script_load_err = function on_script_load_err(ev) {var src = _.get(ev, 'target.src') || '';
509        var match = src.match(/(2pay\.js|bluesnap\.js|js\.stripe\.com|paypal\.com\/sdk\/js|pay\.google\.com)/);
510        perr({ id: 'www_premium_payment_script_load_err', info: { src: src } });
511        if (match)
512        set_script_err(function (errs) {return _objectSpread(_objectSpread({}, errs), {}, _defineProperty({}, match[1], true));});
513      };
514      useEffect(function () {
515        checkout_redirect();
516        window.addEventListener('popstate', on_qs_change);
517        return function () {return window.removeEventListener('popstate', on_qs_change);};
518      }, [state]);
519      useEffect(function () {
520        document.addEventListener('click', function (event) {
521          var _www_util$get_click_d = www_util.get_click_data(event.target),click_id = _www_util$get_click_d.id,info = _www_util$get_click_d.info;
522          if (click_id)
523          www_util.perr({ id: "www_join".concat(N, "_click_").concat(click_id), info: info });
524        });
525        plus_util.set_ppc_cookie();
526        var plans_info = plans_util.get_plans_info(plans_util.get_plan_ids());
527        var plans = Object.keys(plans_info).map(function (key) {
528          var _plans_info$key = plans_info[key],id = _plans_info$key.id,name = _plans_info$key.name,price = _plans_info$key.price;
529          return { id: id, name: name, price: price, category: 'vpn-b2c',
530            list: 'Plus page plans' };
531        });
532        eec.view_item_list(plans);
533        etask(/*#__PURE__*/_regenerator().m(function _callee3() {var _user, page, info;return _regenerator().w(function (_context3) {while (1) switch (_context3.n) {case 0:_context3.n = 1;
534                return load_user();case 1:_user = _context3.v;
535                page = pathname.slice(1).replace('/', '_');
536                info = { login: _user && _user.hola_uid, template: "join".concat(
537                    N) };
538                perr({ id: 'www_premium_visit', info: info });
539                perr({ id: "www_premium_".concat(page, "_visit"), info: info });if (!
540                plans_util.get_plan_ids().includes('free')) {_context3.n = 2;break;}_context3.n = 2;
541                return init_install_ctx();case 2:_context3.n = 3;
542                return plus_ui.init(api, on_script_load_err);case 3:return _context3.a(2);}}, _callee3);})
543        );
544      }, []);
545      plan = plans_util.get_plans_info_obj({ id: state.plan_id });
546      if (state.plan_id && !plan)
547      {
548        set_url_params({ plan_id: null, plan: null });
549        state.plan_id = null;
550        on_qs_change();
551      }
552      var opt = {
553        plan: plan,
554        slide: state.slide,
555        coupon: state.coupon,
556        user: user,
557        provider: state.provider,
558        vat_obj: state.vat_obj,
559        currency: state.currency,
560        set_currency: function set_currency(value) {return set_state(function (_state) {return _objectSpread(_objectSpread({}, _state), {}, {
561              currency: value ? value.toUpperCase() : 'USD' });});},
562        user_email: _.get(user, 'emails[0].value'),
563        country: (user_country || '').toLowerCase(),
564        load_user: load_user,
565        api: api,
566        api_loaded: api_loaded,
567        script_err: script_err,
568        on_script_load_err: on_script_load_err,
569        downloads: users_number,
570        set_coupon: function set_coupon(code) {
571          set_state(function (v) {return _objectSpread(_objectSpread({}, v), {}, { coupon: code });});
572        },
573        set_plan: function set_plan(_plan) {var _opt = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
574          _plan = plans_util.get_discount_plan(_plan) || _plan;
575          plans_util.set_plan_opt(_opt);
576          perr({ id: "www_join1_plan_click_".concat(_plan.id) });
577          if (_plan.id == 'free')
578          {
579            etask(/*#__PURE__*/_regenerator().m(function _callee4() {return _regenerator().w(function (_context4) {while (1) switch (_context4.n) {case 0:_context4.n = 1;
580                    return init_install_ctx();case 1:
581                    if (iutil.need_choose_plan(install_ctx))
582                    perr({ id: 'www_join1_agree_show' });else
583
584                    start_install(install_ctx);case 2:return _context4.a(2);}}, _callee4);})
585            );
586            return;
587          }
588          plus_ui.start_checkout();
589          gtm.push({ event: 'choose_plan', id: _plan.id });
590          set_url_params({ plan: plan_to_url(_plan, _opt) });
591          on_qs_change();
592        },
593        go_back: function go_back() {
594          perr({ id: 'www_join1_back_click' });
595          set_url_params({ plan_id: null, plan: null });
596          on_qs_change();
597        },
598        set_api: function set_api(change) {return set_state(function (_state) {
599            plus_util.api = _objectSpread(_objectSpread({}, plus_util.api), change);
600            return _objectSpread(_objectSpread({}, _state), {}, { api: plus_util.api });
601          });},
602        on_continue: function on_continue(_opt) {
603          perr({ id: 'www_join1_continue_click' });
604          var next_slide = 'payment';
605          if (state.slide == 'account' && coupon_flow)
606          next_slide = 'coupon';
607          set_state(function (_state) {return _objectSpread(_objectSpread(_objectSpread({}, _state), _opt), {}, { slide: next_slide });});
608        },
609        on_method_tab_change: on_method_tab_change,
610        on_vat_obj_change: on_vat_obj_change
611      };
612      var _ref23 = plan &&
613        membership.get_price_plan(plan, state.currency) || {},discount_percent = _ref23.discount_percent;
614      var bf_conf = hopt.www_hola.black_friday_badge_on_checkout || {};
615      var cls = cn("join_page join".concat(N, " plus_layout2"), theme.root, {
616        uninstall_page: pages_dict.is_uninstall_page(),
617        refund_page: ref == 'refund' || ref == 'refund_special_big_offer' ||
618        ref == 'refund_special_cta',
619        black_friday_badge: bf_conf && bf_conf.enabled && (
620        !bf_conf.only_for_ext || +!qs_o().bext),
621        plan_selected: plan,
622        only_right_part_root: only_right_part
623      }, plan && "plan_period_" + plan.period.toLowerCase().replace(' ', ''),
624      discount_percent && 'plan_discount_percent_' + discount_percent);
625      return /*#__PURE__*/React.createElement("div", { className: cls },
626      !only_right_part && /*#__PURE__*/React.createElement("div", {
627        className: cn('container plus_header', qs_o().hide_header &&
628        'invisible') }, /*#__PURE__*/
629      React.createElement(Navbar_logo, null)
630      ), /*#__PURE__*/
631      React.createElement(Payment, { opt: opt,
632        only_right_part: only_right_part }), /*#__PURE__*/
633      React.createElement(Br_footer, null)
634      );
635    };
636
637    return E;
638  });})();
639//# sourceMappingURL=join_n.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.