Greasy Fork is available in English.

💰 轻松省钱!超简洁好用的购物优惠券小助手,自动显示淘宝(taobao.com)、天猫(tmall.com)、聚划算、京东(jd.com)等平台优惠券与历史价格,支持手机扫码下单!最新技术实现。🛍️

🚀 最新简洁好用的购物优惠券小助手!自动显示淘宝(taobao.com)、天猫(tmall.com)、天猫超市、天猫国际(tmall.hk)、聚划算、京东(jd.com)、京东国际(jd.hk)、京东图书、京东电子书、京东工业品、京东大药房(yiyaojd.com)等平台的隐藏优惠券与历史价格。支持手机扫码下单,方便快捷。告别虚假降价,以最优惠的价格,快乐购物,心情美满!🎉 持续维护中,让您省时省力,享受购物的乐趣!

// ==UserScript==
// @name         💰 轻松省钱!超简洁好用的购物优惠券小助手,自动显示淘宝(taobao.com)、天猫(tmall.com)、聚划算、京东(jd.com)等平台优惠券与历史价格,支持手机扫码下单!最新技术实现。🛍️
// @namespace    https://api.jasonzk.com
// @version      v1.3.0
// @description  🚀 最新简洁好用的购物优惠券小助手!自动显示淘宝(taobao.com)、天猫(tmall.com)、天猫超市、天猫国际(tmall.hk)、聚划算、京东(jd.com)、京东国际(jd.hk)、京东图书、京东电子书、京东工业品、京东大药房(yiyaojd.com)等平台的隐藏优惠券与历史价格。支持手机扫码下单,方便快捷。告别虚假降价,以最优惠的价格,快乐购物,心情美满!🎉 持续维护中,让您省时省力,享受购物的乐趣!
// @author       JasonZK
// @license      MIT
// @require      https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.min.js
// @match        *://*.taobao.com/*
// @match        *://*.tmall.com/*
// @match        *://*.tmall.hk/*
// @match        *://*.detail.tmall.com/*
// @match        *://*.liangxinyao.com/*
// @match        *://*.jd.com/*
// @match        *://*.jd.hk/*
// @match        *://*.yiyaojd.com/*
// @match        *://*.vip.com/*
// @match        *://*.vipglobal.hk/*
// @exclude      *://login.taobao.com/*
// @exclude      *://uland.taobao.com/*
// @exclude      *://login.tmall.com/*
// @exclude      *://pages.tmall.com/*
// @exclude      *://wq.jd.com/*
// @icon         data:image/png;base64,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
// @antifeature  referral-link
// @grant        unsafeWindow
// ==/UserScript==

(function() {
    'use strict';


var __defProp = Object.defineProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __publicField = (obj, key, value) => {
  __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
  return value;
};
(function(CryptoJS2) {
  "use strict";
  var __vite_style__ = document.createElement("style");
  __vite_style__.textContent = 'article.svelte-3f7cpw{color:white;padding:0.75rem 1.5rem;border-radius:0.2rem;display:flex;align-items:center;margin:0 auto 0.5rem auto;width:20rem}.error.svelte-3f7cpw{background:IndianRed}.success.svelte-3f7cpw{background-color:#ff583c}.info.svelte-3f7cpw{background:SkyBlue}.text.svelte-3f7cpw{margin-left:1rem}.close.svelte-3f7cpw{cursor:pointer}button.svelte-3f7cpw{color:white;background:transparent;border:0 none;padding:0;margin:0 0 0 auto;line-height:1;font-size:1rem}section.svelte-1wow8bn{position:fixed;top:0;left:0;right:0;width:100%;display:flex;margin-top:1rem;justify-content:center;flex-direction:column;z-index:1000}.container.svelte-afbzno.svelte-afbzno{margin:10px 0;font-family:"Microsoft YaHei";font-size:16px}.container.svelte-afbzno .coupon-box.svelte-afbzno{display:inline-flex;flex-direction:column;align-items:center;background-color:#dfd5ca;box-shadow:0 0 2px 1px #dfd5ca;border-radius:10px;color:#b27e52;padding:12px 16px}.container.svelte-afbzno .coupon-box .title.svelte-afbzno{font-size:30px;font-weight:bold;margin-bottom:20px;line-height:1.1}.container.svelte-afbzno .coupon-box .coupon.svelte-afbzno{display:flex;align-items:center;justify-content:center;padding:10px 20px;background-image:linear-gradient(to right, #e8ceb6, #d19568);box-shadow:0 0 2px 1px #e8ceb6;border-radius:8px;cursor:pointer}.container.svelte-afbzno .coupon-box .coupon .left.svelte-afbzno{display:flex;align-items:center;font-weight:bold;word-break:normal}.container.svelte-afbzno .coupon-box .coupon .left .symbol.svelte-afbzno{color:#5e391d;font-size:20px;align-self:flex-end}.container.svelte-afbzno .coupon-box .coupon .left .price.svelte-afbzno{color:#ab6f41;font-size:50px;margin-right:4px;line-height:0.9}.container.svelte-afbzno .coupon-box .coupon .left .unit.svelte-afbzno{color:#785539;font-size:14px;align-self:flex-start}.container.svelte-afbzno .coupon-box .coupon .middle.svelte-afbzno{width:2px;height:60px;background-color:#aa896f;margin:0 10px}.container.svelte-afbzno .coupon-box .coupon .right.svelte-afbzno{display:flex;flex-direction:column;align-items:baseline}.container.svelte-afbzno .coupon-box .coupon .right .desc.svelte-afbzno{color:#372312;line-height:1;margin-bottom:6px}.container.svelte-afbzno .coupon-box .coupon .right .time.svelte-afbzno{line-height:1;margin-bottom:6px}.container.svelte-afbzno .coupon-box .coupon .right .remain.svelte-afbzno{line-height:1}.container.svelte-afbzno .coupon-box .price-container.svelte-afbzno{display:flex;flex-direction:column;gap:6px;margin:12px 0;align-self:flex-start}.container.svelte-afbzno .coupon-box .price-container .high-price.svelte-afbzno{color:rgb(225, 12, 12)}.container.svelte-afbzno .coupon-box .price-container .low-price.svelte-afbzno{color:rgb(5, 133, 5)}.container.svelte-afbzno .coupon-box .qrcode.svelte-afbzno{margin-top:20px;display:flex;justify-content:space-between;align-items:center;font-size:16px}.container.svelte-afbzno .coupon-box .action.svelte-afbzno{margin-top:20px}.container.svelte-afbzno .coupon-box .action button.svelte-afbzno:first-child{margin-right:10px}.container.svelte-afbzno button.svelte-afbzno{border-radius:8px;border:0px solid transparent;padding:0.6em 1.2em;font-size:16px;font-weight:bold;font-family:inherit;background-image:linear-gradient(to right, #cf9a5d, #a26233);color:#fff;cursor:pointer;transition:border-color 0.25s}.container.svelte-afbzno button.svelte-afbzno:hover,.container.svelte-afbzno button.svelte-afbzno:focus{border-color:#a26233;box-shadow:0 0 8px rgba(0, 0, 0, 0.2)}.container.svelte-afbzno button.svelte-afbzno:active{box-shadow:0 0 4px rgba(0, 0, 0, 0.2);transform:scale(0.98);border-color:#8c4f26}';
  document.head.appendChild(__vite_style__);
  function noop() {
  }
  const identity = (x) => x;
  function assign(tar, src) {
    for (const k in src)
      tar[k] = src[k];
    return (
      /** @type {T & S} */
      tar
    );
  }
  function run(fn) {
    return fn();
  }
  function blank_object() {
    return /* @__PURE__ */ Object.create(null);
  }
  function run_all(fns) {
    fns.forEach(run);
  }
  function is_function(thing) {
    return typeof thing === "function";
  }
  function safe_not_equal(a, b) {
    return a != a ? b == b : a !== b || a && typeof a === "object" || typeof a === "function";
  }
  let src_url_equal_anchor;
  function src_url_equal(element_src, url) {
    if (element_src === url)
      return true;
    if (!src_url_equal_anchor) {
      src_url_equal_anchor = document.createElement("a");
    }
    src_url_equal_anchor.href = url;
    return element_src === src_url_equal_anchor.href;
  }
  function is_empty(obj) {
    return Object.keys(obj).length === 0;
  }
  function subscribe(store, ...callbacks) {
    if (store == null) {
      for (const callback of callbacks) {
        callback(void 0);
      }
      return noop;
    }
    const unsub = store.subscribe(...callbacks);
    return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;
  }
  function component_subscribe(component, store, callback) {
    component.$$.on_destroy.push(subscribe(store, callback));
  }
  function create_slot(definition, ctx, $$scope, fn) {
    if (definition) {
      const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);
      return definition[0](slot_ctx);
    }
  }
  function get_slot_context(definition, ctx, $$scope, fn) {
    return definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;
  }
  function get_slot_changes(definition, $$scope, dirty, fn) {
    if (definition[2] && fn) {
      const lets = definition[2](fn(dirty));
      if ($$scope.dirty === void 0) {
        return lets;
      }
      if (typeof lets === "object") {
        const merged = [];
        const len = Math.max($$scope.dirty.length, lets.length);
        for (let i = 0; i < len; i += 1) {
          merged[i] = $$scope.dirty[i] | lets[i];
        }
        return merged;
      }
      return $$scope.dirty | lets;
    }
    return $$scope.dirty;
  }
  function update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {
    if (slot_changes) {
      const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);
      slot.p(slot_context, slot_changes);
    }
  }
  function get_all_dirty_from_scope($$scope) {
    if ($$scope.ctx.length > 32) {
      const dirty = [];
      const length = $$scope.ctx.length / 32;
      for (let i = 0; i < length; i++) {
        dirty[i] = -1;
      }
      return dirty;
    }
    return -1;
  }
  function null_to_empty(value) {
    return value == null ? "" : value;
  }
  const is_client = typeof window !== "undefined";
  let now = is_client ? () => window.performance.now() : () => Date.now();
  let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop;
  const tasks = /* @__PURE__ */ new Set();
  function run_tasks(now2) {
    tasks.forEach((task) => {
      if (!task.c(now2)) {
        tasks.delete(task);
        task.f();
      }
    });
    if (tasks.size !== 0)
      raf(run_tasks);
  }
  function loop(callback) {
    let task;
    if (tasks.size === 0)
      raf(run_tasks);
    return {
      promise: new Promise((fulfill) => {
        tasks.add(task = { c: callback, f: fulfill });
      }),
      abort() {
        tasks.delete(task);
      }
    };
  }
  function append(target, node) {
    target.appendChild(node);
  }
  function get_root_for_style(node) {
    if (!node)
      return document;
    const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;
    if (root && /** @type {ShadowRoot} */
    root.host) {
      return (
        /** @type {ShadowRoot} */
        root
      );
    }
    return node.ownerDocument;
  }
  function append_empty_stylesheet(node) {
    const style_element = element("style");
    style_element.textContent = "/* empty */";
    append_stylesheet(get_root_for_style(node), style_element);
    return style_element.sheet;
  }
  function append_stylesheet(node, style) {
    append(
      /** @type {Document} */
      node.head || node,
      style
    );
    return style.sheet;
  }
  function insert(target, node, anchor) {
    target.insertBefore(node, anchor || null);
  }
  function detach(node) {
    if (node.parentNode) {
      node.parentNode.removeChild(node);
    }
  }
  function element(name) {
    return document.createElement(name);
  }
  function svg_element(name) {
    return document.createElementNS("http://www.w3.org/2000/svg", name);
  }
  function text(data) {
    return document.createTextNode(data);
  }
  function space() {
    return text(" ");
  }
  function empty() {
    return text("");
  }
  function listen(node, event, handler, options) {
    node.addEventListener(event, handler, options);
    return () => node.removeEventListener(event, handler, options);
  }
  function attr(node, attribute, value) {
    if (value == null)
      node.removeAttribute(attribute);
    else if (node.getAttribute(attribute) !== value)
      node.setAttribute(attribute, value);
  }
  function children(element2) {
    return Array.from(element2.childNodes);
  }
  function set_data(text2, data) {
    data = "" + data;
    if (text2.data === data)
      return;
    text2.data = /** @type {string} */
    data;
  }
  function set_style(node, key, value, important) {
    if (value == null) {
      node.style.removeProperty(key);
    } else {
      node.style.setProperty(key, value, "");
    }
  }
  function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {
    return new CustomEvent(type, { detail, bubbles, cancelable });
  }
  const managed_styles = /* @__PURE__ */ new Map();
  let active = 0;
  function hash(str) {
    let hash2 = 5381;
    let i = str.length;
    while (i--)
      hash2 = (hash2 << 5) - hash2 ^ str.charCodeAt(i);
    return hash2 >>> 0;
  }
  function create_style_information(doc, node) {
    const info = { stylesheet: append_empty_stylesheet(node), rules: {} };
    managed_styles.set(doc, info);
    return info;
  }
  function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {
    const step = 16.666 / duration;
    let keyframes = "{\n";
    for (let p = 0; p <= 1; p += step) {
      const t = a + (b - a) * ease(p);
      keyframes += p * 100 + `%{${fn(t, 1 - t)}}
`;
    }
    const rule = keyframes + `100% {${fn(b, 1 - b)}}
}`;
    const name = `__svelte_${hash(rule)}_${uid}`;
    const doc = get_root_for_style(node);
    const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);
    if (!rules[name]) {
      rules[name] = true;
      stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);
    }
    const animation = node.style.animation || "";
    node.style.animation = `${animation ? `${animation}, ` : ""}${name} ${duration}ms linear ${delay}ms 1 both`;
    active += 1;
    return name;
  }
  function delete_rule(node, name) {
    const previous = (node.style.animation || "").split(", ");
    const next = previous.filter(
      name ? (anim) => anim.indexOf(name) < 0 : (anim) => anim.indexOf("__svelte") === -1
      // remove all Svelte animations
    );
    const deleted = previous.length - next.length;
    if (deleted) {
      node.style.animation = next.join(", ");
      active -= deleted;
      if (!active)
        clear_rules();
    }
  }
  function clear_rules() {
    raf(() => {
      if (active)
        return;
      managed_styles.forEach((info) => {
        const { ownerNode } = info.stylesheet;
        if (ownerNode)
          detach(ownerNode);
      });
      managed_styles.clear();
    });
  }
  let current_component;
  function set_current_component(component) {
    current_component = component;
  }
  function get_current_component() {
    if (!current_component)
      throw new Error("Function called outside component initialization");
    return current_component;
  }
  function createEventDispatcher() {
    const component = get_current_component();
    return (type, detail, { cancelable = false } = {}) => {
      const callbacks = component.$$.callbacks[type];
      if (callbacks) {
        const event = custom_event(
          /** @type {string} */
          type,
          detail,
          { cancelable }
        );
        callbacks.slice().forEach((fn) => {
          fn.call(component, event);
        });
        return !event.defaultPrevented;
      }
      return true;
    };
  }
  const dirty_components = [];
  const binding_callbacks = [];
  let render_callbacks = [];
  const flush_callbacks = [];
  const resolved_promise = /* @__PURE__ */ Promise.resolve();
  let update_scheduled = false;
  function schedule_update() {
    if (!update_scheduled) {
      update_scheduled = true;
      resolved_promise.then(flush);
    }
  }
  function add_render_callback(fn) {
    render_callbacks.push(fn);
  }
  const seen_callbacks = /* @__PURE__ */ new Set();
  let flushidx = 0;
  function flush() {
    if (flushidx !== 0) {
      return;
    }
    const saved_component = current_component;
    do {
      try {
        while (flushidx < dirty_components.length) {
          const component = dirty_components[flushidx];
          flushidx++;
          set_current_component(component);
          update(component.$$);
        }
      } catch (e) {
        dirty_components.length = 0;
        flushidx = 0;
        throw e;
      }
      set_current_component(null);
      dirty_components.length = 0;
      flushidx = 0;
      while (binding_callbacks.length)
        binding_callbacks.pop()();
      for (let i = 0; i < render_callbacks.length; i += 1) {
        const callback = render_callbacks[i];
        if (!seen_callbacks.has(callback)) {
          seen_callbacks.add(callback);
          callback();
        }
      }
      render_callbacks.length = 0;
    } while (dirty_components.length);
    while (flush_callbacks.length) {
      flush_callbacks.pop()();
    }
    update_scheduled = false;
    seen_callbacks.clear();
    set_current_component(saved_component);
  }
  function update($$) {
    if ($$.fragment !== null) {
      $$.update();
      run_all($$.before_update);
      const dirty = $$.dirty;
      $$.dirty = [-1];
      $$.fragment && $$.fragment.p($$.ctx, dirty);
      $$.after_update.forEach(add_render_callback);
    }
  }
  function flush_render_callbacks(fns) {
    const filtered = [];
    const targets = [];
    render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));
    targets.forEach((c) => c());
    render_callbacks = filtered;
  }
  let promise;
  function wait() {
    if (!promise) {
      promise = Promise.resolve();
      promise.then(() => {
        promise = null;
      });
    }
    return promise;
  }
  function dispatch(node, direction, kind) {
    node.dispatchEvent(custom_event(`${direction ? "intro" : "outro"}${kind}`));
  }
  const outroing = /* @__PURE__ */ new Set();
  let outros;
  function group_outros() {
    outros = {
      r: 0,
      c: [],
      p: outros
      // parent group
    };
  }
  function check_outros() {
    if (!outros.r) {
      run_all(outros.c);
    }
    outros = outros.p;
  }
  function transition_in(block, local) {
    if (block && block.i) {
      outroing.delete(block);
      block.i(local);
    }
  }
  function transition_out(block, local, detach2, callback) {
    if (block && block.o) {
      if (outroing.has(block))
        return;
      outroing.add(block);
      outros.c.push(() => {
        outroing.delete(block);
        if (callback) {
          if (detach2)
            block.d(1);
          callback();
        }
      });
      block.o(local);
    } else if (callback) {
      callback();
    }
  }
  const null_transition = { duration: 0 };
  function create_bidirectional_transition(node, fn, params, intro) {
    const options = { direction: "both" };
    let config = fn(node, params, options);
    let t = intro ? 0 : 1;
    let running_program = null;
    let pending_program = null;
    let animation_name = null;
    let original_inert_value;
    function clear_animation() {
      if (animation_name)
        delete_rule(node, animation_name);
    }
    function init2(program, duration) {
      const d = (
        /** @type {Program['d']} */
        program.b - t
      );
      duration *= Math.abs(d);
      return {
        a: t,
        b: program.b,
        d,
        duration,
        start: program.start,
        end: program.start + duration,
        group: program.group
      };
    }
    function go(b) {
      const {
        delay = 0,
        duration = 300,
        easing = identity,
        tick = noop,
        css
      } = config || null_transition;
      const program = {
        start: now() + delay,
        b
      };
      if (!b) {
        program.group = outros;
        outros.r += 1;
      }
      if ("inert" in node) {
        if (b) {
          if (original_inert_value !== void 0) {
            node.inert = original_inert_value;
          }
        } else {
          original_inert_value = /** @type {HTMLElement} */
          node.inert;
          node.inert = true;
        }
      }
      if (running_program || pending_program) {
        pending_program = program;
      } else {
        if (css) {
          clear_animation();
          animation_name = create_rule(node, t, b, duration, delay, easing, css);
        }
        if (b)
          tick(0, 1);
        running_program = init2(program, duration);
        add_render_callback(() => dispatch(node, b, "start"));
        loop((now2) => {
          if (pending_program && now2 > pending_program.start) {
            running_program = init2(pending_program, duration);
            pending_program = null;
            dispatch(node, running_program.b, "start");
            if (css) {
              clear_animation();
              animation_name = create_rule(
                node,
                t,
                running_program.b,
                running_program.duration,
                0,
                easing,
                config.css
              );
            }
          }
          if (running_program) {
            if (now2 >= running_program.end) {
              tick(t = running_program.b, 1 - t);
              dispatch(node, running_program.b, "end");
              if (!pending_program) {
                if (running_program.b) {
                  clear_animation();
                } else {
                  if (!--running_program.group.r)
                    run_all(running_program.group.c);
                }
              }
              running_program = null;
            } else if (now2 >= running_program.start) {
              const p = now2 - running_program.start;
              t = running_program.a + running_program.d * easing(p / running_program.duration);
              tick(t, 1 - t);
            }
          }
          return !!(running_program || pending_program);
        });
      }
    }
    return {
      run(b) {
        if (is_function(config)) {
          wait().then(() => {
            const opts = { direction: b ? "in" : "out" };
            config = config(opts);
            go(b);
          });
        } else {
          go(b);
        }
      },
      end() {
        clear_animation();
        running_program = pending_program = null;
      }
    };
  }
  function ensure_array_like(array_like_or_iterator) {
    return (array_like_or_iterator == null ? void 0 : array_like_or_iterator.length) !== void 0 ? array_like_or_iterator : Array.from(array_like_or_iterator);
  }
  function outro_and_destroy_block(block, lookup) {
    transition_out(block, 1, 1, () => {
      lookup.delete(block.key);
    });
  }
  function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block2, next, get_context) {
    let o = old_blocks.length;
    let n = list.length;
    let i = o;
    const old_indexes = {};
    while (i--)
      old_indexes[old_blocks[i].key] = i;
    const new_blocks = [];
    const new_lookup = /* @__PURE__ */ new Map();
    const deltas = /* @__PURE__ */ new Map();
    const updates = [];
    i = n;
    while (i--) {
      const child_ctx = get_context(ctx, list, i);
      const key = get_key(child_ctx);
      let block = lookup.get(key);
      if (!block) {
        block = create_each_block2(key, child_ctx);
        block.c();
      } else {
        updates.push(() => block.p(child_ctx, dirty));
      }
      new_lookup.set(key, new_blocks[i] = block);
      if (key in old_indexes)
        deltas.set(key, Math.abs(i - old_indexes[key]));
    }
    const will_move = /* @__PURE__ */ new Set();
    const did_move = /* @__PURE__ */ new Set();
    function insert2(block) {
      transition_in(block, 1);
      block.m(node, next);
      lookup.set(block.key, block);
      next = block.first;
      n--;
    }
    while (o && n) {
      const new_block = new_blocks[n - 1];
      const old_block = old_blocks[o - 1];
      const new_key = new_block.key;
      const old_key = old_block.key;
      if (new_block === old_block) {
        next = new_block.first;
        o--;
        n--;
      } else if (!new_lookup.has(old_key)) {
        destroy(old_block, lookup);
        o--;
      } else if (!lookup.has(new_key) || will_move.has(new_key)) {
        insert2(new_block);
      } else if (did_move.has(old_key)) {
        o--;
      } else if (deltas.get(new_key) > deltas.get(old_key)) {
        did_move.add(new_key);
        insert2(new_block);
      } else {
        will_move.add(old_key);
        o--;
      }
    }
    while (o--) {
      const old_block = old_blocks[o];
      if (!new_lookup.has(old_block.key))
        destroy(old_block, lookup);
    }
    while (n)
      insert2(new_blocks[n - 1]);
    run_all(updates);
    return new_blocks;
  }
  function create_component(block) {
    block && block.c();
  }
  function mount_component(component, target, anchor) {
    const { fragment, after_update } = component.$$;
    fragment && fragment.m(target, anchor);
    add_render_callback(() => {
      const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);
      if (component.$$.on_destroy) {
        component.$$.on_destroy.push(...new_on_destroy);
      } else {
        run_all(new_on_destroy);
      }
      component.$$.on_mount = [];
    });
    after_update.forEach(add_render_callback);
  }
  function destroy_component(component, detaching) {
    const $$ = component.$$;
    if ($$.fragment !== null) {
      flush_render_callbacks($$.after_update);
      run_all($$.on_destroy);
      $$.fragment && $$.fragment.d(detaching);
      $$.on_destroy = $$.fragment = null;
      $$.ctx = [];
    }
  }
  function make_dirty(component, i) {
    if (component.$$.dirty[0] === -1) {
      dirty_components.push(component);
      schedule_update();
      component.$$.dirty.fill(0);
    }
    component.$$.dirty[i / 31 | 0] |= 1 << i % 31;
  }
  function init(component, options, instance2, create_fragment2, not_equal, props, append_styles = null, dirty = [-1]) {
    const parent_component = current_component;
    set_current_component(component);
    const $$ = component.$$ = {
      fragment: null,
      ctx: [],
      // state
      props,
      update: noop,
      not_equal,
      bound: blank_object(),
      // lifecycle
      on_mount: [],
      on_destroy: [],
      on_disconnect: [],
      before_update: [],
      after_update: [],
      context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),
      // everything else
      callbacks: blank_object(),
      dirty,
      skip_bound: false,
      root: options.target || parent_component.$$.root
    };
    append_styles && append_styles($$.root);
    let ready = false;
    $$.ctx = instance2 ? instance2(component, options.props || {}, (i, ret, ...rest) => {
      const value = rest.length ? rest[0] : ret;
      if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {
        if (!$$.skip_bound && $$.bound[i])
          $$.bound[i](value);
        if (ready)
          make_dirty(component, i);
      }
      return ret;
    }) : [];
    $$.update();
    ready = true;
    run_all($$.before_update);
    $$.fragment = create_fragment2 ? create_fragment2($$.ctx) : false;
    if (options.target) {
      if (options.hydrate) {
        const nodes = children(options.target);
        $$.fragment && $$.fragment.l(nodes);
        nodes.forEach(detach);
      } else {
        $$.fragment && $$.fragment.c();
      }
      if (options.intro)
        transition_in(component.$$.fragment);
      mount_component(component, options.target, options.anchor);
      flush();
    }
    set_current_component(parent_component);
  }
  class SvelteComponent {
    constructor() {
      /**
       * ### PRIVATE API
       *
       * Do not use, may change at any time
       *
       * @type {any}
       */
      __publicField(this, "$$");
      /**
       * ### PRIVATE API
       *
       * Do not use, may change at any time
       *
       * @type {any}
       */
      __publicField(this, "$$set");
    }
    /** @returns {void} */
    $destroy() {
      destroy_component(this, 1);
      this.$destroy = noop;
    }
    /**
     * @template {Extract<keyof Events, string>} K
     * @param {K} type
     * @param {((e: Events[K]) => void) | null | undefined} callback
     * @returns {() => void}
     */
    $on(type, callback) {
      if (!is_function(callback)) {
        return noop;
      }
      const callbacks = this.$$.callbacks[type] || (this.$$.callbacks[type] = []);
      callbacks.push(callback);
      return () => {
        const index = callbacks.indexOf(callback);
        if (index !== -1)
          callbacks.splice(index, 1);
      };
    }
    /**
     * @param {Partial<Props>} props
     * @returns {void}
     */
    $set(props) {
      if (this.$$set && !is_empty(props)) {
        this.$$.skip_bound = true;
        this.$$set(props);
        this.$$.skip_bound = false;
      }
    }
  }
  const PUBLIC_VERSION = "4";
  if (typeof window !== "undefined")
    (window.__svelte || (window.__svelte = { v: /* @__PURE__ */ new Set() })).v.add(PUBLIC_VERSION);
  const subscriber_queue = [];
  function writable(value, start = noop) {
    let stop;
    const subscribers = /* @__PURE__ */ new Set();
    function set(new_value) {
      if (safe_not_equal(value, new_value)) {
        value = new_value;
        if (stop) {
          const run_queue = !subscriber_queue.length;
          for (const subscriber of subscribers) {
            subscriber[1]();
            subscriber_queue.push(subscriber, value);
          }
          if (run_queue) {
            for (let i = 0; i < subscriber_queue.length; i += 2) {
              subscriber_queue[i][0](subscriber_queue[i + 1]);
            }
            subscriber_queue.length = 0;
          }
        }
      }
    }
    function update2(fn) {
      set(fn(value));
    }
    function subscribe2(run2, invalidate = noop) {
      const subscriber = [run2, invalidate];
      subscribers.add(subscriber);
      if (subscribers.size === 1) {
        stop = start(set, update2) || noop;
      }
      run2(value);
      return () => {
        subscribers.delete(subscriber);
        if (subscribers.size === 0 && stop) {
          stop();
          stop = null;
        }
      };
    }
    return { set, update: update2, subscribe: subscribe2 };
  }
  function createCoupon() {
    const { subscribe: subscribe2, set, update: update2 } = writable(null);
    return {
      subscribe: subscribe2,
      updateCoupon: (data) => update2(() => data)
    };
  }
  const coupon = createCoupon();
  var UrlType = /* @__PURE__ */ ((UrlType2) => {
    UrlType2["Tmall"] = "tmall";
    UrlType2["YYTmall"] = "liangxinyao";
    UrlType2["Taobao"] = "taobao";
    UrlType2["JD"] = "jd";
    UrlType2["Vip"] = "vip";
    return UrlType2;
  })(UrlType || {});
  var Platform = /* @__PURE__ */ ((Platform2) => {
    Platform2[Platform2["Taobao"] = 1] = "Taobao";
    Platform2[Platform2["JD"] = 2] = "JD";
    Platform2[Platform2["Vip"] = 3] = "Vip";
    return Platform2;
  })(Platform || {});
  function createPlatform() {
    const { subscribe: subscribe2, set, update: update2 } = writable(null);
    return {
      subscribe: subscribe2,
      updatePlatform: (data) => update2(() => data)
    };
  }
  const platform = createPlatform();
  const toasts = writable([]);
  const addToast = (toast) => {
    const id = Math.floor(Math.random() * 1e4);
    const defaults = {
      id,
      type: "info",
      dismissible: true,
      timeout: 3e3
    };
    toasts.update((all) => [{ ...defaults, ...toast }, ...all]);
    if (toast.timeout)
      setTimeout(() => dismissToast(id), toast.timeout);
  };
  const dismissToast = (id) => {
    toasts.update((all) => all.filter((t) => t.id !== id));
  };
  function getUrlParams(url) {
    let queryString = window.location.search;
    const params = new URLSearchParams(queryString);
    const queryParams = {};
    for (const [key, value] of params.entries()) {
      queryParams[key] = value;
    }
    return queryParams;
  }
  function getPrice(couponInfo) {
    let price = couponInfo.split("减")[1];
    price = price.split("元")[0];
    return price;
  }
  function getScanText(platform2) {
    switch (platform2) {
      case Platform.Taobao:
        return "使用手机淘宝/天猫APP扫码";
      case Platform.JD:
        return "使用手机京东APP扫码";
      case Platform.Vip:
        return "使用手机唯品会APP扫码";
      default:
        return "";
    }
  }
  function getToastMsg(platform2) {
    switch (platform2) {
      case Platform.Taobao:
        return "拷贝成功,可粘贴到微信后,手机复制到淘宝/天猫APP打开~";
      case Platform.JD:
        return "拷贝成功,可粘贴到微信后,手机复制到京东APP打开~";
      case Platform.Vip:
        return "拷贝成功,可粘贴到微信后,手机复制到唯品会APP打开~";
      default:
        return "";
    }
  }
  function getCopyText(coupon2) {
    if (coupon2.couponInfo != null && coupon2.couponInfo != "") {
      let s = `发现了一件好物,快来看看吧~~${coupon2 == null ? void 0 : coupon2.couponInfo}`;
      if (coupon2.longTpwd != null && coupon2.longTpwd != "") {
        s += `,${coupon2 == null ? void 0 : coupon2.longTpwd}`;
      } else if (coupon2.shortUrl != null && coupon2.shortUrl != "") {
        s += `,${coupon2 == null ? void 0 : coupon2.shortUrl}`;
      }
      return s;
    } else if (coupon2.shortUrl != null && coupon2.shortUrl != "") {
      return `发现了一件好物,快来看看吧~~${coupon2 == null ? void 0 : coupon2.shortUrl}`;
    }
    return "";
  }
  function checkCanRedirect(platform2, coupon2, url) {
    const search = window.location.search;
    const count = parseInt(
      coupon2.remainCount == null || coupon2.remainCount == "" ? "0" : coupon2.remainCount,
      10
    );
    if (coupon2.shortUrl != null && coupon2.shortUrl != "" && coupon2.shortUrl != url && (count > 20 || count <= 0)) {
      if (coupon2.couponInfo == null || coupon2.couponInfo == "") {
        switch (platform2) {
          case Platform.Taobao:
            return search.indexOf("mm_117425171_2324550020_111391250310") == -1;
          case Platform.JD:
            return search.indexOf("2015895618") == -1;
          case Platform.Vip:
            return search.indexOf("dtk_1873303") == -1 && window.location.pathname.indexOf("detail-") > -1;
          default:
            return false;
        }
      }
      return false;
    }
    return false;
  }
  async function getTaobaoTitle() {
    return new Promise((resolve) => {
      var _a;
      const title = (_a = document.querySelector("h1")) == null ? void 0 : _a.textContent;
      if (title) {
        resolve(title);
      } else {
        const observer = new MutationObserver(() => {
          var _a2;
          const title2 = (_a2 = document.querySelector("h1")) == null ? void 0 : _a2.textContent;
          if (title2) {
            observer.disconnect();
            resolve(title2);
          }
        });
        observer.observe(document.body, {
          childList: true,
          subtree: true
        });
      }
    });
  }
  function fade(node, { delay = 0, duration = 400, easing = identity } = {}) {
    const o = +getComputedStyle(node).opacity;
    return {
      delay,
      duration,
      easing,
      css: (t) => `opacity: ${t * o}`
    };
  }
  function create_fragment$7(ctx) {
    let svg;
    let path;
    return {
      c() {
        svg = svg_element("svg");
        path = svg_element("path");
        attr(path, "fill", "currentColor");
        attr(path, "d", "M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 464c-118.664 0-216-96.055-216-216 0-118.663 96.055-216 216-216 118.664 0 216 96.055 216 216 0 118.663-96.055 216-216 216zm141.63-274.961L217.15 376.071c-4.705 4.667-12.303 4.637-16.97-.068l-85.878-86.572c-4.667-4.705-4.637-12.303.068-16.97l8.52-8.451c4.705-4.667 12.303-4.637 16.97.068l68.976 69.533 163.441-162.13c4.705-4.667 12.303-4.637 16.97.068l8.451 8.52c4.668 4.705 4.637 12.303-.068 16.97z");
        attr(
          svg,
          "width",
          /*width*/
          ctx[0]
        );
        set_style(svg, "text-align", "center");
        set_style(svg, "display", "inline-block");
        attr(svg, "aria-hidden", "true");
        attr(svg, "focusable", "false");
        attr(svg, "role", "img");
        attr(svg, "xmlns", "http://www.w3.org/2000/svg");
        attr(svg, "viewBox", "0 0 512 512");
      },
      m(target, anchor) {
        insert(target, svg, anchor);
        append(svg, path);
      },
      p(ctx2, [dirty]) {
        if (dirty & /*width*/
        1) {
          attr(
            svg,
            "width",
            /*width*/
            ctx2[0]
          );
        }
      },
      i: noop,
      o: noop,
      d(detaching) {
        if (detaching) {
          detach(svg);
        }
      }
    };
  }
  function instance$6($$self, $$props, $$invalidate) {
    let { width = "1em" } = $$props;
    $$self.$$set = ($$props2) => {
      if ("width" in $$props2)
        $$invalidate(0, width = $$props2.width);
    };
    return [width];
  }
  class SuccessIcon extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance$6, create_fragment$7, safe_not_equal, { width: 0 });
    }
  }
  function create_fragment$6(ctx) {
    let svg;
    let path;
    return {
      c() {
        svg = svg_element("svg");
        path = svg_element("path");
        attr(path, "fill", "currentColor");
        attr(path, "d", "M256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm-11.49 120h22.979c6.823 0 12.274 5.682 11.99 12.5l-7 168c-.268 6.428-5.556 11.5-11.99 11.5h-8.979c-6.433 0-11.722-5.073-11.99-11.5l-7-168c-.283-6.818 5.167-12.5 11.99-12.5zM256 340c-15.464 0-28 12.536-28 28s12.536 28 28 28 28-12.536 28-28-12.536-28-28-28z");
        attr(path, "class", "");
        attr(
          svg,
          "width",
          /*width*/
          ctx[0]
        );
        set_style(svg, "text-align", "center");
        set_style(svg, "display", "inline-block");
        attr(svg, "aria-hidden", "true");
        attr(svg, "focusable", "false");
        attr(svg, "role", "img");
        attr(svg, "xmlns", "http://www.w3.org/2000/svg");
        attr(svg, "viewBox", "0 0 512 512");
      },
      m(target, anchor) {
        insert(target, svg, anchor);
        append(svg, path);
      },
      p(ctx2, [dirty]) {
        if (dirty & /*width*/
        1) {
          attr(
            svg,
            "width",
            /*width*/
            ctx2[0]
          );
        }
      },
      i: noop,
      o: noop,
      d(detaching) {
        if (detaching) {
          detach(svg);
        }
      }
    };
  }
  function instance$5($$self, $$props, $$invalidate) {
    let { width = "1em" } = $$props;
    $$self.$$set = ($$props2) => {
      if ("width" in $$props2)
        $$invalidate(0, width = $$props2.width);
    };
    return [width];
  }
  class ErrorIcon extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance$5, create_fragment$6, safe_not_equal, { width: 0 });
    }
  }
  function create_fragment$5(ctx) {
    let svg;
    let path;
    return {
      c() {
        svg = svg_element("svg");
        path = svg_element("path");
        attr(path, "fill", "currentColor");
        attr(path, "d", "M256 40c118.621 0 216 96.075 216 216 0 119.291-96.61 216-216 216-119.244 0-216-96.562-216-216 0-119.203 96.602-216 216-216m0-32C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm-36 344h12V232h-12c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12h48c6.627 0 12 5.373 12 12v140h12c6.627 0 12 5.373 12 12v8c0 6.627-5.373 12-12 12h-72c-6.627 0-12-5.373-12-12v-8c0-6.627 5.373-12 12-12zm36-240c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32z");
        attr(
          svg,
          "width",
          /*width*/
          ctx[0]
        );
        set_style(svg, "text-align", "center");
        set_style(svg, "display", "inline-block");
        attr(svg, "aria-hidden", "true");
        attr(svg, "focusable", "false");
        attr(svg, "role", "img");
        attr(svg, "xmlns", "http://www.w3.org/2000/svg");
        attr(svg, "viewBox", "0 0 512 512");
      },
      m(target, anchor) {
        insert(target, svg, anchor);
        append(svg, path);
      },
      p(ctx2, [dirty]) {
        if (dirty & /*width*/
        1) {
          attr(
            svg,
            "width",
            /*width*/
            ctx2[0]
          );
        }
      },
      i: noop,
      o: noop,
      d(detaching) {
        if (detaching) {
          detach(svg);
        }
      }
    };
  }
  function instance$4($$self, $$props, $$invalidate) {
    let { width = "1em" } = $$props;
    $$self.$$set = ($$props2) => {
      if ("width" in $$props2)
        $$invalidate(0, width = $$props2.width);
    };
    return [width];
  }
  class InfoIcon extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance$4, create_fragment$5, safe_not_equal, { width: 0 });
    }
  }
  function create_fragment$4(ctx) {
    let svg;
    let path;
    return {
      c() {
        svg = svg_element("svg");
        path = svg_element("path");
        attr(path, "fill", "currentColor");
        attr(path, "d", "M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z");
        attr(
          svg,
          "width",
          /*width*/
          ctx[0]
        );
        set_style(svg, "text-align", "center");
        set_style(svg, "display", "inline-block");
        attr(svg, "aria-hidden", "true");
        attr(svg, "focusable", "false");
        attr(svg, "role", "img");
        attr(svg, "xmlns", "http://www.w3.org/2000/svg");
        attr(svg, "viewBox", "0 0 352 512");
      },
      m(target, anchor) {
        insert(target, svg, anchor);
        append(svg, path);
      },
      p(ctx2, [dirty]) {
        if (dirty & /*width*/
        1) {
          attr(
            svg,
            "width",
            /*width*/
            ctx2[0]
          );
        }
      },
      i: noop,
      o: noop,
      d(detaching) {
        if (detaching) {
          detach(svg);
        }
      }
    };
  }
  function instance$3($$self, $$props, $$invalidate) {
    let { width = "1em" } = $$props;
    $$self.$$set = ($$props2) => {
      if ("width" in $$props2)
        $$invalidate(0, width = $$props2.width);
    };
    return [width];
  }
  class CloseIcon extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance$3, create_fragment$4, safe_not_equal, { width: 0 });
    }
  }
  function create_else_block(ctx) {
    let infoicon;
    let current;
    infoicon = new InfoIcon({ props: { width: "1.1em" } });
    return {
      c() {
        create_component(infoicon.$$.fragment);
      },
      m(target, anchor) {
        mount_component(infoicon, target, anchor);
        current = true;
      },
      i(local) {
        if (current)
          return;
        transition_in(infoicon.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(infoicon.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        destroy_component(infoicon, detaching);
      }
    };
  }
  function create_if_block_2$1(ctx) {
    let erroricon;
    let current;
    erroricon = new ErrorIcon({ props: { width: "1.1em" } });
    return {
      c() {
        create_component(erroricon.$$.fragment);
      },
      m(target, anchor) {
        mount_component(erroricon, target, anchor);
        current = true;
      },
      i(local) {
        if (current)
          return;
        transition_in(erroricon.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(erroricon.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        destroy_component(erroricon, detaching);
      }
    };
  }
  function create_if_block_1$1(ctx) {
    let successicon;
    let current;
    successicon = new SuccessIcon({ props: { width: "1.1em" } });
    return {
      c() {
        create_component(successicon.$$.fragment);
      },
      m(target, anchor) {
        mount_component(successicon, target, anchor);
        current = true;
      },
      i(local) {
        if (current)
          return;
        transition_in(successicon.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(successicon.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        destroy_component(successicon, detaching);
      }
    };
  }
  function create_if_block$2(ctx) {
    let button;
    let closeicon;
    let current;
    let mounted2;
    let dispose;
    closeicon = new CloseIcon({ props: { width: "0.8em" } });
    return {
      c() {
        button = element("button");
        create_component(closeicon.$$.fragment);
        attr(button, "class", "close svelte-3f7cpw");
      },
      m(target, anchor) {
        insert(target, button, anchor);
        mount_component(closeicon, button, null);
        current = true;
        if (!mounted2) {
          dispose = listen(
            button,
            "click",
            /*click_handler*/
            ctx[5]
          );
          mounted2 = true;
        }
      },
      p: noop,
      i(local) {
        if (current)
          return;
        transition_in(closeicon.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(closeicon.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(button);
        }
        destroy_component(closeicon);
        mounted2 = false;
        dispose();
      }
    };
  }
  function create_fragment$3(ctx) {
    let article;
    let current_block_type_index;
    let if_block0;
    let t0;
    let div;
    let t1;
    let article_class_value;
    let article_transition;
    let current;
    const if_block_creators = [create_if_block_1$1, create_if_block_2$1, create_else_block];
    const if_blocks = [];
    function select_block_type(ctx2, dirty) {
      if (
        /*type*/
        ctx2[0] === "success"
      )
        return 0;
      if (
        /*type*/
        ctx2[0] === "error"
      )
        return 1;
      return 2;
    }
    current_block_type_index = select_block_type(ctx);
    if_block0 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx);
    const default_slot_template = (
      /*#slots*/
      ctx[4].default
    );
    const default_slot = create_slot(
      default_slot_template,
      ctx,
      /*$$scope*/
      ctx[3],
      null
    );
    let if_block1 = (
      /*dismissible*/
      ctx[1] && create_if_block$2(ctx)
    );
    return {
      c() {
        article = element("article");
        if_block0.c();
        t0 = space();
        div = element("div");
        if (default_slot)
          default_slot.c();
        t1 = space();
        if (if_block1)
          if_block1.c();
        attr(div, "class", "text svelte-3f7cpw");
        attr(article, "class", article_class_value = null_to_empty(
          /*type*/
          ctx[0]
        ) + " svelte-3f7cpw");
        attr(article, "role", "alert");
      },
      m(target, anchor) {
        insert(target, article, anchor);
        if_blocks[current_block_type_index].m(article, null);
        append(article, t0);
        append(article, div);
        if (default_slot) {
          default_slot.m(div, null);
        }
        append(article, t1);
        if (if_block1)
          if_block1.m(article, null);
        current = true;
      },
      p(ctx2, [dirty]) {
        let previous_block_index = current_block_type_index;
        current_block_type_index = select_block_type(ctx2);
        if (current_block_type_index !== previous_block_index) {
          group_outros();
          transition_out(if_blocks[previous_block_index], 1, 1, () => {
            if_blocks[previous_block_index] = null;
          });
          check_outros();
          if_block0 = if_blocks[current_block_type_index];
          if (!if_block0) {
            if_block0 = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx2);
            if_block0.c();
          }
          transition_in(if_block0, 1);
          if_block0.m(article, t0);
        }
        if (default_slot) {
          if (default_slot.p && (!current || dirty & /*$$scope*/
          8)) {
            update_slot_base(
              default_slot,
              default_slot_template,
              ctx2,
              /*$$scope*/
              ctx2[3],
              !current ? get_all_dirty_from_scope(
                /*$$scope*/
                ctx2[3]
              ) : get_slot_changes(
                default_slot_template,
                /*$$scope*/
                ctx2[3],
                dirty,
                null
              ),
              null
            );
          }
        }
        if (
          /*dismissible*/
          ctx2[1]
        ) {
          if (if_block1) {
            if_block1.p(ctx2, dirty);
            if (dirty & /*dismissible*/
            2) {
              transition_in(if_block1, 1);
            }
          } else {
            if_block1 = create_if_block$2(ctx2);
            if_block1.c();
            transition_in(if_block1, 1);
            if_block1.m(article, null);
          }
        } else if (if_block1) {
          group_outros();
          transition_out(if_block1, 1, 1, () => {
            if_block1 = null;
          });
          check_outros();
        }
        if (!current || dirty & /*type*/
        1 && article_class_value !== (article_class_value = null_to_empty(
          /*type*/
          ctx2[0]
        ) + " svelte-3f7cpw")) {
          attr(article, "class", article_class_value);
        }
      },
      i(local) {
        if (current)
          return;
        transition_in(if_block0);
        transition_in(default_slot, local);
        transition_in(if_block1);
        if (local) {
          add_render_callback(() => {
            if (!current)
              return;
            if (!article_transition)
              article_transition = create_bidirectional_transition(article, fade, {}, true);
            article_transition.run(1);
          });
        }
        current = true;
      },
      o(local) {
        transition_out(if_block0);
        transition_out(default_slot, local);
        transition_out(if_block1);
        if (local) {
          if (!article_transition)
            article_transition = create_bidirectional_transition(article, fade, {}, false);
          article_transition.run(0);
        }
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(article);
        }
        if_blocks[current_block_type_index].d();
        if (default_slot)
          default_slot.d(detaching);
        if (if_block1)
          if_block1.d();
        if (detaching && article_transition)
          article_transition.end();
      }
    };
  }
  function instance$2($$self, $$props, $$invalidate) {
    let { $$slots: slots = {}, $$scope } = $$props;
    const dispatch2 = createEventDispatcher();
    let { type = "error" } = $$props;
    let { dismissible = true } = $$props;
    const click_handler = () => dispatch2("dismiss");
    $$self.$$set = ($$props2) => {
      if ("type" in $$props2)
        $$invalidate(0, type = $$props2.type);
      if ("dismissible" in $$props2)
        $$invalidate(1, dismissible = $$props2.dismissible);
      if ("$$scope" in $$props2)
        $$invalidate(3, $$scope = $$props2.$$scope);
    };
    return [type, dismissible, dispatch2, $$scope, slots, click_handler];
  }
  class Toast extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance$2, create_fragment$3, safe_not_equal, { type: 0, dismissible: 1 });
    }
  }
  function get_each_context(ctx, list, i) {
    const child_ctx = ctx.slice();
    child_ctx[2] = list[i];
    return child_ctx;
  }
  function create_if_block$1(ctx) {
    let section;
    let each_blocks = [];
    let each_1_lookup = /* @__PURE__ */ new Map();
    let current;
    let each_value = ensure_array_like(
      /*$toasts*/
      ctx[0]
    );
    const get_key = (ctx2) => (
      /*toast*/
      ctx2[2].id
    );
    for (let i = 0; i < each_value.length; i += 1) {
      let child_ctx = get_each_context(ctx, each_value, i);
      let key = get_key(child_ctx);
      each_1_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx));
    }
    return {
      c() {
        section = element("section");
        for (let i = 0; i < each_blocks.length; i += 1) {
          each_blocks[i].c();
        }
        attr(section, "class", "svelte-1wow8bn");
      },
      m(target, anchor) {
        insert(target, section, anchor);
        for (let i = 0; i < each_blocks.length; i += 1) {
          if (each_blocks[i]) {
            each_blocks[i].m(section, null);
          }
        }
        current = true;
      },
      p(ctx2, dirty) {
        if (dirty & /*$toasts*/
        1) {
          each_value = ensure_array_like(
            /*$toasts*/
            ctx2[0]
          );
          group_outros();
          each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx2, each_value, each_1_lookup, section, outro_and_destroy_block, create_each_block, null, get_each_context);
          check_outros();
        }
      },
      i(local) {
        if (current)
          return;
        for (let i = 0; i < each_value.length; i += 1) {
          transition_in(each_blocks[i]);
        }
        current = true;
      },
      o(local) {
        for (let i = 0; i < each_blocks.length; i += 1) {
          transition_out(each_blocks[i]);
        }
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(section);
        }
        for (let i = 0; i < each_blocks.length; i += 1) {
          each_blocks[i].d();
        }
      }
    };
  }
  function create_default_slot(ctx) {
    let t_value = (
      /*toast*/
      ctx[2].message + ""
    );
    let t;
    return {
      c() {
        t = text(t_value);
      },
      m(target, anchor) {
        insert(target, t, anchor);
      },
      p(ctx2, dirty) {
        if (dirty & /*$toasts*/
        1 && t_value !== (t_value = /*toast*/
        ctx2[2].message + ""))
          set_data(t, t_value);
      },
      d(detaching) {
        if (detaching) {
          detach(t);
        }
      }
    };
  }
  function create_each_block(key_1, ctx) {
    let first;
    let toast_1;
    let current;
    function dismiss_handler() {
      return (
        /*dismiss_handler*/
        ctx[1](
          /*toast*/
          ctx[2]
        )
      );
    }
    toast_1 = new Toast({
      props: {
        type: (
          /*toast*/
          ctx[2].type
        ),
        dismissible: (
          /*toast*/
          ctx[2].dismissible
        ),
        $$slots: { default: [create_default_slot] },
        $$scope: { ctx }
      }
    });
    toast_1.$on("dismiss", dismiss_handler);
    return {
      key: key_1,
      first: null,
      c() {
        first = empty();
        create_component(toast_1.$$.fragment);
        this.first = first;
      },
      m(target, anchor) {
        insert(target, first, anchor);
        mount_component(toast_1, target, anchor);
        current = true;
      },
      p(new_ctx, dirty) {
        ctx = new_ctx;
        const toast_1_changes = {};
        if (dirty & /*$toasts*/
        1)
          toast_1_changes.type = /*toast*/
          ctx[2].type;
        if (dirty & /*$toasts*/
        1)
          toast_1_changes.dismissible = /*toast*/
          ctx[2].dismissible;
        if (dirty & /*$$scope, $toasts*/
        33) {
          toast_1_changes.$$scope = { dirty, ctx };
        }
        toast_1.$set(toast_1_changes);
      },
      i(local) {
        if (current)
          return;
        transition_in(toast_1.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(toast_1.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(first);
        }
        destroy_component(toast_1, detaching);
      }
    };
  }
  function create_fragment$2(ctx) {
    let if_block_anchor;
    let current;
    let if_block = (
      /*$toasts*/
      ctx[0] && create_if_block$1(ctx)
    );
    return {
      c() {
        if (if_block)
          if_block.c();
        if_block_anchor = empty();
      },
      m(target, anchor) {
        if (if_block)
          if_block.m(target, anchor);
        insert(target, if_block_anchor, anchor);
        current = true;
      },
      p(ctx2, [dirty]) {
        if (
          /*$toasts*/
          ctx2[0]
        ) {
          if (if_block) {
            if_block.p(ctx2, dirty);
            if (dirty & /*$toasts*/
            1) {
              transition_in(if_block, 1);
            }
          } else {
            if_block = create_if_block$1(ctx2);
            if_block.c();
            transition_in(if_block, 1);
            if_block.m(if_block_anchor.parentNode, if_block_anchor);
          }
        } else if (if_block) {
          group_outros();
          transition_out(if_block, 1, 1, () => {
            if_block = null;
          });
          check_outros();
        }
      },
      i(local) {
        if (current)
          return;
        transition_in(if_block);
        current = true;
      },
      o(local) {
        transition_out(if_block);
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(if_block_anchor);
        }
        if (if_block)
          if_block.d(detaching);
      }
    };
  }
  function instance$1($$self, $$props, $$invalidate) {
    let $toasts;
    component_subscribe($$self, toasts, ($$value) => $$invalidate(0, $toasts = $$value));
    const dismiss_handler = (toast) => dismissToast(toast.id);
    return [$toasts, dismiss_handler];
  }
  class Toasts extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance$1, create_fragment$2, safe_not_equal, {});
    }
  }
  function create_if_block(ctx) {
    let div1;
    let div0;
    let t0_value = (
      /*$coupon*/
      ctx[0].couponInfo != null && /*$coupon*/
      ctx[0].couponInfo != "" ? "优惠满减券" : "暂无优惠券"
    );
    let t0;
    let t1;
    let t2;
    let t3;
    let t4;
    let if_block0 = (
      /*$coupon*/
      ctx[0].couponInfo != null && /*$coupon*/
      ctx[0].couponInfo != "" && create_if_block_4(ctx)
    );
    let if_block1 = (
      /*$coupon*/
      ctx[0].maxPrice != null && /*$coupon*/
      ctx[0].maxPrice != "" && create_if_block_3(ctx)
    );
    let if_block2 = (
      /*$coupon*/
      ctx[0].qrcode != null && /*$coupon*/
      ctx[0].qrcode.length > 0 && create_if_block_2(ctx)
    );
    let if_block3 = (
      /*$coupon*/
      ctx[0].couponInfo != null && /*$coupon*/
      ctx[0].couponInfo != "" && create_if_block_1(ctx)
    );
    return {
      c() {
        div1 = element("div");
        div0 = element("div");
        t0 = text(t0_value);
        t1 = space();
        if (if_block0)
          if_block0.c();
        t2 = space();
        if (if_block1)
          if_block1.c();
        t3 = space();
        if (if_block2)
          if_block2.c();
        t4 = space();
        if (if_block3)
          if_block3.c();
        attr(div0, "class", "title svelte-afbzno");
        attr(div1, "class", "coupon-box svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div1, anchor);
        append(div1, div0);
        append(div0, t0);
        append(div1, t1);
        if (if_block0)
          if_block0.m(div1, null);
        append(div1, t2);
        if (if_block1)
          if_block1.m(div1, null);
        append(div1, t3);
        if (if_block2)
          if_block2.m(div1, null);
        append(div1, t4);
        if (if_block3)
          if_block3.m(div1, null);
      },
      p(ctx2, dirty) {
        if (dirty & /*$coupon*/
        1 && t0_value !== (t0_value = /*$coupon*/
        ctx2[0].couponInfo != null && /*$coupon*/
        ctx2[0].couponInfo != "" ? "优惠满减券" : "暂无优惠券"))
          set_data(t0, t0_value);
        if (
          /*$coupon*/
          ctx2[0].couponInfo != null && /*$coupon*/
          ctx2[0].couponInfo != ""
        ) {
          if (if_block0) {
            if_block0.p(ctx2, dirty);
          } else {
            if_block0 = create_if_block_4(ctx2);
            if_block0.c();
            if_block0.m(div1, t2);
          }
        } else if (if_block0) {
          if_block0.d(1);
          if_block0 = null;
        }
        if (
          /*$coupon*/
          ctx2[0].maxPrice != null && /*$coupon*/
          ctx2[0].maxPrice != ""
        ) {
          if (if_block1) {
            if_block1.p(ctx2, dirty);
          } else {
            if_block1 = create_if_block_3(ctx2);
            if_block1.c();
            if_block1.m(div1, t3);
          }
        } else if (if_block1) {
          if_block1.d(1);
          if_block1 = null;
        }
        if (
          /*$coupon*/
          ctx2[0].qrcode != null && /*$coupon*/
          ctx2[0].qrcode.length > 0
        ) {
          if (if_block2) {
            if_block2.p(ctx2, dirty);
          } else {
            if_block2 = create_if_block_2(ctx2);
            if_block2.c();
            if_block2.m(div1, t4);
          }
        } else if (if_block2) {
          if_block2.d(1);
          if_block2 = null;
        }
        if (
          /*$coupon*/
          ctx2[0].couponInfo != null && /*$coupon*/
          ctx2[0].couponInfo != ""
        ) {
          if (if_block3) {
            if_block3.p(ctx2, dirty);
          } else {
            if_block3 = create_if_block_1(ctx2);
            if_block3.c();
            if_block3.m(div1, null);
          }
        } else if (if_block3) {
          if_block3.d(1);
          if_block3 = null;
        }
      },
      d(detaching) {
        if (detaching) {
          detach(div1);
        }
        if (if_block0)
          if_block0.d();
        if (if_block1)
          if_block1.d();
        if (if_block2)
          if_block2.d();
        if (if_block3)
          if_block3.d();
      }
    };
  }
  function create_if_block_4(ctx) {
    let div5;
    let div0;
    let span0;
    let t1;
    let span1;
    let t2_value = getPrice(
      /*$coupon*/
      ctx[0].couponInfo
    ) + "";
    let t2;
    let t3;
    let span2;
    let t5;
    let div1;
    let t6;
    let div4;
    let div2;
    let t7_value = (
      /*$coupon*/
      ctx[0].couponInfo + ""
    );
    let t7;
    let t8;
    let div3;
    let t9;
    let t10_value = (
      /*$coupon*/
      ctx[0].couponEndTime + ""
    );
    let t10;
    let t11;
    let mounted2;
    let dispose;
    let if_block = (
      /*$coupon*/
      ctx[0].remainCount != null && /*$coupon*/
      ctx[0].remainCount != "" && create_if_block_5(ctx)
    );
    return {
      c() {
        div5 = element("div");
        div0 = element("div");
        span0 = element("span");
        span0.textContent = "¥";
        t1 = space();
        span1 = element("span");
        t2 = text(t2_value);
        t3 = space();
        span2 = element("span");
        span2.textContent = "元";
        t5 = space();
        div1 = element("div");
        t6 = space();
        div4 = element("div");
        div2 = element("div");
        t7 = text(t7_value);
        t8 = space();
        div3 = element("div");
        t9 = text("有效期至:");
        t10 = text(t10_value);
        t11 = space();
        if (if_block)
          if_block.c();
        attr(span0, "class", "symbol svelte-afbzno");
        attr(span1, "class", "price svelte-afbzno");
        attr(span2, "class", "unit svelte-afbzno");
        attr(div0, "class", "left svelte-afbzno");
        attr(div1, "class", "middle svelte-afbzno");
        attr(div2, "class", "desc svelte-afbzno");
        attr(div3, "class", "time svelte-afbzno");
        attr(div4, "class", "right svelte-afbzno");
        attr(div5, "class", "coupon svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div5, anchor);
        append(div5, div0);
        append(div0, span0);
        append(div0, t1);
        append(div0, span1);
        append(span1, t2);
        append(div0, t3);
        append(div0, span2);
        append(div5, t5);
        append(div5, div1);
        append(div5, t6);
        append(div5, div4);
        append(div4, div2);
        append(div2, t7);
        append(div4, t8);
        append(div4, div3);
        append(div3, t9);
        append(div3, t10);
        append(div4, t11);
        if (if_block)
          if_block.m(div4, null);
        if (!mounted2) {
          dispose = listen(
            div5,
            "click",
            /*handleGo*/
            ctx[3]
          );
          mounted2 = true;
        }
      },
      p(ctx2, dirty) {
        if (dirty & /*$coupon*/
        1 && t2_value !== (t2_value = getPrice(
          /*$coupon*/
          ctx2[0].couponInfo
        ) + ""))
          set_data(t2, t2_value);
        if (dirty & /*$coupon*/
        1 && t7_value !== (t7_value = /*$coupon*/
        ctx2[0].couponInfo + ""))
          set_data(t7, t7_value);
        if (dirty & /*$coupon*/
        1 && t10_value !== (t10_value = /*$coupon*/
        ctx2[0].couponEndTime + ""))
          set_data(t10, t10_value);
        if (
          /*$coupon*/
          ctx2[0].remainCount != null && /*$coupon*/
          ctx2[0].remainCount != ""
        ) {
          if (if_block) {
            if_block.p(ctx2, dirty);
          } else {
            if_block = create_if_block_5(ctx2);
            if_block.c();
            if_block.m(div4, null);
          }
        } else if (if_block) {
          if_block.d(1);
          if_block = null;
        }
      },
      d(detaching) {
        if (detaching) {
          detach(div5);
        }
        if (if_block)
          if_block.d();
        mounted2 = false;
        dispose();
      }
    };
  }
  function create_if_block_5(ctx) {
    let div;
    let t0;
    let t1_value = (
      /*$coupon*/
      ctx[0].remainCount + ""
    );
    let t1;
    return {
      c() {
        div = element("div");
        t0 = text("剩余:");
        t1 = text(t1_value);
        attr(div, "class", "remain svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div, anchor);
        append(div, t0);
        append(div, t1);
      },
      p(ctx2, dirty) {
        if (dirty & /*$coupon*/
        1 && t1_value !== (t1_value = /*$coupon*/
        ctx2[0].remainCount + ""))
          set_data(t1, t1_value);
      },
      d(detaching) {
        if (detaching) {
          detach(div);
        }
      }
    };
  }
  function create_if_block_3(ctx) {
    let div2;
    let div0;
    let t0;
    let t1_value = (
      /*$coupon*/
      ctx[0].maxPrice + ""
    );
    let t1;
    let t2;
    let t3_value = (
      /*$coupon*/
      ctx[0].maxDate + ""
    );
    let t3;
    let t4;
    let t5;
    let div1;
    let t6;
    let t7_value = (
      /*$coupon*/
      ctx[0].minPrice + ""
    );
    let t7;
    let t8;
    let t9_value = (
      /*$coupon*/
      ctx[0].minDate + ""
    );
    let t9;
    let t10;
    return {
      c() {
        div2 = element("div");
        div0 = element("div");
        t0 = text("历史最高价:");
        t1 = text(t1_value);
        t2 = text("(");
        t3 = text(t3_value);
        t4 = text(")");
        t5 = space();
        div1 = element("div");
        t6 = text("历史最低价:");
        t7 = text(t7_value);
        t8 = text("(");
        t9 = text(t9_value);
        t10 = text(")");
        attr(div0, "class", "high-price svelte-afbzno");
        attr(div1, "class", "low-price svelte-afbzno");
        attr(div2, "class", "price-container svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div2, anchor);
        append(div2, div0);
        append(div0, t0);
        append(div0, t1);
        append(div0, t2);
        append(div0, t3);
        append(div0, t4);
        append(div2, t5);
        append(div2, div1);
        append(div1, t6);
        append(div1, t7);
        append(div1, t8);
        append(div1, t9);
        append(div1, t10);
      },
      p(ctx2, dirty) {
        if (dirty & /*$coupon*/
        1 && t1_value !== (t1_value = /*$coupon*/
        ctx2[0].maxPrice + ""))
          set_data(t1, t1_value);
        if (dirty & /*$coupon*/
        1 && t3_value !== (t3_value = /*$coupon*/
        ctx2[0].maxDate + ""))
          set_data(t3, t3_value);
        if (dirty & /*$coupon*/
        1 && t7_value !== (t7_value = /*$coupon*/
        ctx2[0].minPrice + ""))
          set_data(t7, t7_value);
        if (dirty & /*$coupon*/
        1 && t9_value !== (t9_value = /*$coupon*/
        ctx2[0].minDate + ""))
          set_data(t9, t9_value);
      },
      d(detaching) {
        if (detaching) {
          detach(div2);
        }
      }
    };
  }
  function create_if_block_2(ctx) {
    let div;
    let span;
    let t0_value = getScanText(
      /*$platform*/
      ctx[1]
    ) + "";
    let t0;
    let t1_value = (
      /*$coupon*/
      ctx[0].couponInfo != null && /*$coupon*/
      ctx[0].couponInfo != "" ? "领取" : "下单"
    );
    let t1;
    let t2;
    let t3;
    let img;
    let img_src_value;
    return {
      c() {
        div = element("div");
        span = element("span");
        t0 = text(t0_value);
        t1 = text(t1_value);
        t2 = text(":");
        t3 = space();
        img = element("img");
        attr(img, "width", "100px");
        attr(img, "height", "100px");
        attr(img, "alt", "qrcode");
        if (!src_url_equal(img.src, img_src_value = /*$coupon*/
        ctx[0].qrcode))
          attr(img, "src", img_src_value);
        attr(div, "class", "qrcode svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div, anchor);
        append(div, span);
        append(span, t0);
        append(span, t1);
        append(span, t2);
        append(div, t3);
        append(div, img);
      },
      p(ctx2, dirty) {
        if (dirty & /*$platform*/
        2 && t0_value !== (t0_value = getScanText(
          /*$platform*/
          ctx2[1]
        ) + ""))
          set_data(t0, t0_value);
        if (dirty & /*$coupon*/
        1 && t1_value !== (t1_value = /*$coupon*/
        ctx2[0].couponInfo != null && /*$coupon*/
        ctx2[0].couponInfo != "" ? "领取" : "下单"))
          set_data(t1, t1_value);
        if (dirty & /*$coupon*/
        1 && !src_url_equal(img.src, img_src_value = /*$coupon*/
        ctx2[0].qrcode)) {
          attr(img, "src", img_src_value);
        }
      },
      d(detaching) {
        if (detaching) {
          detach(div);
        }
      }
    };
  }
  function create_if_block_1(ctx) {
    let div;
    let button0;
    let t1;
    let button1;
    let mounted2;
    let dispose;
    return {
      c() {
        div = element("div");
        button0 = element("button");
        button0.textContent = "分享好友";
        t1 = space();
        button1 = element("button");
        button1.textContent = "立即领取";
        attr(button0, "class", "svelte-afbzno");
        attr(button1, "class", "svelte-afbzno");
        attr(div, "class", "action svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div, anchor);
        append(div, button0);
        append(div, t1);
        append(div, button1);
        if (!mounted2) {
          dispose = [
            listen(
              button0,
              "click",
              /*handleCopy*/
              ctx[2]
            ),
            listen(
              button1,
              "click",
              /*handleGo*/
              ctx[3]
            )
          ];
          mounted2 = true;
        }
      },
      p: noop,
      d(detaching) {
        if (detaching) {
          detach(div);
        }
        mounted2 = false;
        run_all(dispose);
      }
    };
  }
  function create_fragment$1(ctx) {
    let div;
    let toasts2;
    let t;
    let current;
    toasts2 = new Toasts({});
    let if_block = (
      /*$coupon*/
      ctx[0] != null && create_if_block(ctx)
    );
    return {
      c() {
        div = element("div");
        create_component(toasts2.$$.fragment);
        t = space();
        if (if_block)
          if_block.c();
        attr(div, "class", "container svelte-afbzno");
      },
      m(target, anchor) {
        insert(target, div, anchor);
        mount_component(toasts2, div, null);
        append(div, t);
        if (if_block)
          if_block.m(div, null);
        current = true;
      },
      p(ctx2, [dirty]) {
        if (
          /*$coupon*/
          ctx2[0] != null
        ) {
          if (if_block) {
            if_block.p(ctx2, dirty);
          } else {
            if_block = create_if_block(ctx2);
            if_block.c();
            if_block.m(div, null);
          }
        } else if (if_block) {
          if_block.d(1);
          if_block = null;
        }
      },
      i(local) {
        if (current)
          return;
        transition_in(toasts2.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(toasts2.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(div);
        }
        destroy_component(toasts2);
        if (if_block)
          if_block.d();
      }
    };
  }
  function instance($$self, $$props, $$invalidate) {
    let $coupon;
    let $platform;
    component_subscribe($$self, coupon, ($$value) => $$invalidate(0, $coupon = $$value));
    component_subscribe($$self, platform, ($$value) => $$invalidate(1, $platform = $$value));
    function handleCopy() {
      if ($coupon == null) {
        return;
      }
      const text2 = getCopyText($coupon);
      navigator.clipboard.writeText(text2).then(() => {
        addToast({
          type: "success",
          message: getToastMsg($platform),
          dismissible: true,
          timeout: 5e3
        });
      }).catch((error) => {
        console.error("Failed to copy text:", error);
      });
    }
    function handleGo() {
      if (($coupon == null ? void 0 : $coupon.shortUrl) != null && ($coupon == null ? void 0 : $coupon.shortUrl) != "") {
        window.location.replace($coupon == null ? void 0 : $coupon.shortUrl);
      }
    }
    return [$coupon, $platform, handleCopy, handleGo];
  }
  class Coupon extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, instance, create_fragment$1, safe_not_equal, {});
    }
  }
  const baseUrl = "https://api.jasonzk.com";
  const getTaobaoCouponUrlV3 = `${baseUrl}/taobao/couponV3`;
  const getJdCouponUrl = `${baseUrl}/jd/couponV2`;
  const getVipCouponUrl = `${baseUrl}/vip/couponV2`;
  const words = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "f",
    "g",
    "h",
    "i",
    "j",
    "k",
    "l",
    "m",
    "n",
    "o",
    "p",
    "q",
    "r",
    "s",
    "t",
    "u",
    "v",
    "w",
    "x",
    "y",
    "z",
    "A",
    "B",
    "C",
    "D",
    "E",
    "F",
    "G",
    "H",
    "I",
    "J",
    "K",
    "L",
    "M",
    "N",
    "O",
    "P",
    "Q",
    "R",
    "S",
    "T",
    "U",
    "V",
    "W",
    "X",
    "Y",
    "Z",
    "-",
    ","
  ];
  function shuffleWords() {
    return words.sort(() => Math.random() - 0.5);
  }
  function getToken() {
    const words2 = shuffleWords();
    const index0 = getIndex(words2, "all", true);
    const index1 = getIndex(words2, "iance", true);
    const random = Math.floor(Math.random() * 2);
    const splits = [getIndex(words2, ","), getIndex(words2, "-")];
    const now2 = Date.now();
    const split = random == 0 ? "," : "-";
    const data = [
      split,
      index0,
      splits[random] + split,
      index1,
      splits[random] + split,
      now2
    ];
    const key = "jason";
    const token = CryptoJS2.AES.encrypt(data.join(""), key).toString();
    const keyMap = getKeyMap(words2, now2, split, key);
    return {
      token,
      keyMap
    };
  }
  function getKeyMap(words2, now2, split, key) {
    const data = [split, words2, now2];
    const keyMap = CryptoJS2.AES.encrypt(JSON.stringify(data), key).toString();
    return keyMap;
  }
  function getIndex(words2, keyword, needSplit = false) {
    const index = [];
    for (let i = 0; i < keyword.length; i++) {
      index.push(words2.indexOf(keyword[i]).toString());
      if (needSplit) {
        index.push("@");
      }
    }
    return index.join("");
  }
  async function get(url, data) {
    const params = new URLSearchParams(data ?? {});
    url = url + "?" + params.toString();
    const { token, keyMap } = getToken();
    return await fetch(url, {
      headers: {
        authorization: token,
        authhash: keyMap
      }
    });
  }
  function create_fragment(ctx) {
    let main;
    let t;
    let coupon2;
    let current;
    let if_block = false;
    coupon2 = new Coupon({});
    return {
      c() {
        main = element("main");
        t = space();
        create_component(coupon2.$$.fragment);
      },
      m(target, anchor) {
        insert(target, main, anchor);
        append(main, t);
        mount_component(coupon2, main, null);
        current = true;
      },
      p: noop,
      i(local) {
        if (current)
          return;
        transition_in(if_block);
        transition_in(coupon2.$$.fragment, local);
        current = true;
      },
      o(local) {
        transition_out(if_block);
        transition_out(coupon2.$$.fragment, local);
        current = false;
      },
      d(detaching) {
        if (detaching) {
          detach(main);
        }
        destroy_component(coupon2);
      }
    };
  }
  class App extends SvelteComponent {
    constructor(options) {
      super();
      init(this, options, null, create_fragment, safe_not_equal, {});
    }
  }
  function createScript(src) {
    const script = document.createElement("script");
    script.src = src;
    script.setAttribute("type", "text/javascript");
    document.getElementsByTagName("head").item(0).appendChild(script);
  }
  async function createTarget(target) {
    const div = document.createElement("div");
    return new Promise((resolve) => {
      let timer = 0;
      function addSibling() {
        let t = null;
        for (const item of target) {
          t = document.querySelector(item);
          if (t) {
            break;
          }
        }
        if (t) {
          t.after(div);
          clearTimeout(timer);
          resolve(div);
        } else {
          timer = setTimeout(addSibling, 100);
        }
      }
      timer = setTimeout(addSibling, 100);
    });
  }
  async function mountedTaobao() {
    const { id } = getUrlParams();
    if (id == null || id == "") {
      return;
    }
    platform.updatePlatform(Platform.Taobao);
    const title = await getTaobaoTitle();
    const res = await get(getTaobaoCouponUrlV3, {
      goodsId: id,
      url: location.href,
      title
    });
    const json = await res.json();
    if (checkCanRedirect(Platform.Taobao, json.data, location.href)) {
      window.location.replace(json.data.shortUrl);
      return;
    }
    if (json.data != null) {
      coupon.updateCoupon(json.data);
      const target = await createTarget(
        json.data.selector ?? [".Price--root--1CrVGjc"]
      );
      new App({
        target
      });
    }
  }
  async function mountedJd() {
    const url = window.location.origin + window.location.pathname;
    platform.updatePlatform(Platform.JD);
    const res = await get(getJdCouponUrl, {
      url
    });
    const json = await res.json();
    if (checkCanRedirect(Platform.JD, json.data, url)) {
      window.location.replace(json.data.shortUrl);
      return;
    }
    if (json.data != null) {
      coupon.updateCoupon(json.data);
      const target = await createTarget(json.data.selector ?? [".summary-first"]);
      new App({
        target
      });
    }
  }
  async function mountedVip() {
    const url = window.location.origin + window.location.pathname;
    platform.updatePlatform(Platform.Vip);
    const res = await get(getVipCouponUrl, {
      url
    });
    const json = await res.json();
    if (checkCanRedirect(Platform.Vip, json.data, url)) {
      window.location.replace(json.data.shortUrl);
      return;
    }
    if (json.data != null) {
      coupon.updateCoupon(json.data);
      const target = await createTarget(
        json.data.selector ?? ["#J-pi-price-box"]
      );
      new App({
        target
      });
    }
  }
  async function mounted() {
    const url = window.location.host;
    if (url.indexOf(UrlType.Taobao) != -1 || url.indexOf(UrlType.Tmall) != -1 || url.indexOf(UrlType.YYTmall) != -1) {
      mountedTaobao();
    } else if (url.indexOf(UrlType.JD) != -1) {
      mountedJd();
    } else if (url.indexOf(UrlType.Vip) != -1) {
      mountedVip();
    }
    {
      createScript(
        "https://cdn.bootcdn.net/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"
      );
    }
  }
  mounted();
})(CryptoJS);





})();