{"version":3,"file":"v-img.mjs","sources":["../lib/ImgScreen.vue","../lib/index.js"],"sourcesContent":["<template>\n  <!-- FORMAT THIS FILE ONCE vetur WILL ADD prettier-eslint support for vscode! :) -->\n  <!--\n    hate these double quotes in script section but I'm too lazy to change default\n    prettier settings since I'm using prettier-eslint\n   -->\n  <transition appear name=\"v-img-fade\">\n    <div v-if=\"!closed\" class=\"fullscreen-v-img\" @click.self=\"close\">\n      <!--\n        Count of total images in array and current position.\n        We're showing wrapper element of this counter just to\n        position other elements with flex, space-between\n      -->\n      <div class=\"header-v-img\">\n        <span class=\"count-v-img\">\n          <span v-if=\"images.length > 1\">\n            {{ currentImageIndex + 1 }}/{{ images.length }}\n          </span>\n        </span>\n        <span class=\"title-v-img\">\n          {{ titles[currentImageIndex] }}\n        </span>\n        <div class=\"buttons-v-img\">\n          <span v-if=\"sourceButtons[currentImageIndex]\">\n            <a :href=\"images[currentImageIndex]\" target=\"_blank\">\n              <svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" id=\"Capa_1\" x=\"0px\" y=\"0px\" width=\"512px\" height=\"512px\" viewBox=\"0 0 475.078 475.077\" style=\"enable-background:new 0 0 475.078 475.077;\" xml:space=\"preserve\">\n                <path d=\"M467.083,318.627c-5.324-5.328-11.8-7.994-19.41-7.994H315.195l-38.828,38.827c-11.04,10.657-23.982,15.988-38.828,15.988    c-14.843,0-27.789-5.324-38.828-15.988l-38.543-38.827H27.408c-7.612,0-14.083,2.669-19.414,7.994    C2.664,323.955,0,330.427,0,338.044v91.358c0,7.614,2.664,14.085,7.994,19.414c5.33,5.328,11.801,7.99,19.414,7.99h420.266    c7.61,0,14.086-2.662,19.41-7.99c5.332-5.329,7.994-11.8,7.994-19.414v-91.358C475.078,330.427,472.416,323.955,467.083,318.627z     M360.025,414.841c-3.621,3.617-7.905,5.424-12.854,5.424s-9.227-1.807-12.847-5.424c-3.614-3.617-5.421-7.898-5.421-12.844    c0-4.948,1.807-9.236,5.421-12.847c3.62-3.62,7.898-5.431,12.847-5.431s9.232,1.811,12.854,5.431    c3.613,3.61,5.421,7.898,5.421,12.847C365.446,406.942,363.638,411.224,360.025,414.841z M433.109,414.841    c-3.614,3.617-7.898,5.424-12.848,5.424c-4.948,0-9.229-1.807-12.847-5.424c-3.613-3.617-5.42-7.898-5.42-12.844    c0-4.948,1.807-9.236,5.42-12.847c3.617-3.62,7.898-5.431,12.847-5.431c4.949,0,9.233,1.811,12.848,5.431    c3.617,3.61,5.427,7.898,5.427,12.847C438.536,406.942,436.729,411.224,433.109,414.841z\" fill=\"#FFFFFF\" />\n                <path d=\"M224.692,323.479c3.428,3.613,7.71,5.421,12.847,5.421c5.141,0,9.418-1.808,12.847-5.421l127.907-127.908    c5.899-5.519,7.234-12.182,3.997-19.986c-3.23-7.421-8.847-11.132-16.844-11.136h-73.091V36.543c0-4.948-1.811-9.231-5.421-12.847    c-3.62-3.617-7.901-5.426-12.847-5.426h-73.096c-4.946,0-9.229,1.809-12.847,5.426c-3.615,3.616-5.424,7.898-5.424,12.847V164.45    h-73.089c-7.998,0-13.61,3.715-16.846,11.136c-3.234,7.801-1.903,14.467,3.999,19.986L224.692,323.479z\" fill=\"#FFFFFF\" />\n              </svg>\n            </a>\n          </span>\n          <span @click=\"close\">\n            &times;\n          </span>\n        </div>\n      </div>\n\n      <!-- Controls start -->\n      <transition appear name=\"v-img-fade\">\n        <span v-if=\"visibleUI && images.length !== 1\" class=\"prev-v-img\" @click=\"prev\">\n          <svg width=\"25\" height=\"25\" viewBox=\"0 0 1792 1915\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path d=\"M1664 896v128q0 53-32.5 90.5t-84.5 37.5h-704l293 294q38 36 38 90t-38 90l-75 76q-37 37-90 37-52 0-91-37l-651-652q-37-37-37-90 0-52 37-91l651-650q38-38 91-38 52 0 90 38l75 74q38 38 38 91t-38 91l-293 293h704q52 0 84.5 37.5t32.5 90.5z\" fill=\"#fff\" />\n          </svg>\n        </span>\n      </transition>\n      <transition appear name=\"v-img-fade\">\n        <span v-if=\"visibleUI && images.length !== 1\" class=\"next-v-img\" @click=\"next\">\n          <svg width=\"25\" height=\"25\" viewBox=\"0 0 1792 1915\" xmlns=\"http://www.w3.org/2000/svg\">\n            <path d=\"M1600 960q0 54-37 91l-651 651q-39 37-91 37-51 0-90-37l-75-75q-38-38-38-91t38-91l293-293h-704q-52 0-84.5-37.5t-32.5-90.5v-128q0-53 32.5-90.5t84.5-37.5h704l-293-294q-38-36-38-90t38-90l75-75q38-38 90-38 53 0 91 38l651 651q37 35 37 90z\" fill=\"#fff\" />\n          </svg>\n        </span>\n      </transition>\n      <!-- Constols end -->\n\n      <div class=\"footer-v-img\" v-if=\"thumbnails && images.length > 1\">\n        <img\n          v-for=\"(thumbnail, index) in images\"\n          :key=\"index\"\n          :src=\"thumbnail\"\n          @click=\"select(index)\"\n          :class=\"{'is-selected': currentImageIndex == index}\">\n      </div>\n\n      <div class=\"content-v-img\">\n        <img :src=\"images[currentImageIndex]\" @click=\"next\">\n      </div>\n\n    </div>\n  </transition>\n</template>\n\n<script>\nexport default {\n  data() {\n    return {\n      images: [],\n      titles: [],\n      sourceButtons: [],\n      visibleUI: true,\n      currentImageIndex: 0,\n      closed: true,\n      uiTimeout: null,\n      handlers: {},\n      thumbnails: false,\n    };\n  },\n  watch: {\n    closed(newVal) {\n      if (newVal && this.handlers.closed) {\n        this.handlers.closed();\n      }\n      if (!newVal && this.handlers.opened) {\n        this.handlers.opened();\n      }\n    },\n  },\n  methods: {\n    // Not using currentImageIndex watcher because it will\n    // fire on all cases when opened not first image and\n    // index should be changed in order to show clicked image\n    // in the image set.\n    fireChangeEvent() {\n      if (this.handlers.changed) {\n        this.handlers.changed(this.currentImageIndex);\n      }\n    },\n    close() {\n      if (!this.closed) {\n        document.querySelector('body').classList.remove('body-fs-v-img');\n        this.images = [];\n        this.currentImageIndex = 0;\n        this.closed = true;\n      }\n    },\n    next() {\n      if (!this.closed && this.images.length > 1) {\n        // if next index not exists in array of images, set index to first element\n        if (this.currentImageIndex + 1 < this.images.length) {\n          this.currentImageIndex++;\n        } else {\n          this.currentImageIndex = 0;\n        }\n        this.fireChangeEvent();\n      }\n    },\n    select(selectedImage) {\n      this.currentImageIndex = selectedImage;\n    },\n    prev() {\n      if (!this.closed && this.images.length > 1) {\n        // if prev index not exists in array of images, set index to last element\n        if (this.currentImageIndex > 0) {\n          this.currentImageIndex--;\n        } else {\n          this.currentImageIndex = this.images.length - 1;\n        }\n        this.fireChangeEvent();\n      }\n    },\n    showUI() {\n      if (!this.closed) {\n        // UI's hidden, we reveal it for some time only on mouse move and\n        // ImageScreen appear\n        clearTimeout(this.uiTimeout);\n        this.visibleUI = true;\n        this.uiTimeout = setTimeout(() => {\n          this.visibleUI = false;\n        }, 3500);\n      }\n    },\n  },\n  created() {\n    window.addEventListener('keyup', e => {\n      // esc key and 'q' for quit\n      if (e.keyCode === 27 || e.keyCode === 81) this.close();\n      // arrow right and 'l' key (vim-like binding)\n      if (e.keyCode === 39 || e.keyCode === 76) this.next();\n      // arrow left and 'h' key (vim-like binding)\n      if (e.keyCode === 37 || e.keyCode === 72) this.prev();\n    });\n    window.addEventListener('scroll', () => {\n      this.close();\n    });\n    window.addEventListener('mousemove', () => {\n      this.showUI();\n    });\n  },\n};\n</script>\n\n<style scoped>\n* {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n.fullscreen-v-img {\n  z-index: 9999;\n  height: 100%;\n  width: 100%;\n  position: fixed;\n  top: 0;\n  left: 0;\n  overflow: hidden;\n  background-color: rgba(0, 0, 0, 0.7);\n  -ms-touch-action: none;\n  touch-action: none;\n}\n\n.content-v-img img {\n  width: auto;\n  height: auto;\n  max-width: 100%;\n  max-height: 100%;\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  margin: auto;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.header-v-img,\n.footer-v-img {\n  position: absolute;\n  width: 100%;\n  background-color: rgba(0, 0, 0, 0.3);\n  height: 50px;\n  z-index: 9999;\n  display: flex;\n  align-items: center;\n}\n\n.header-v-img {\n  justify-content: space-between;\n}\n\n.footer-v-img {\n  bottom: 0;\n  justify-content: center;\n  height: 70px;\n  /* scrolling thumbnails on mobile */\n  overflow-x: auto;\n}\n\n.footer-v-img img {\n  width: 60px;\n  height: 60px;\n  cursor: pointer;\n  -webkit-transition: transform 0.2s ease-out;\n  transition: transform 0.2s ease-out;\n  object-fit: cover;\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.footer-v-img img.is-selected {\n  transform: scale(1.1);\n}\n\n.footer-v-img img:not(:last-child) {\n  margin-right: 7px;\n}\n\n.title-v-img {\n  font-family: 'Avenir', Helvetica, Arial, sans-serif;\n  font-size: 18px;\n  font-weight: 400;\n  color: white;\n  text-align: center;\n  max-height: 100%;\n  overflow: auto;\n}\n\n.count-v-img,\n.buttons-v-img {\n  width: 80px;\n  font-family: 'Avenir', Helvetica, Arial, sans-serif;\n}\n\n.count-v-img {\n  font-size: 15px;\n  color: white;\n  margin-left: 10px;\n}\n\n.buttons-v-img {\n  margin-right: 10px;\n  text-align: right;\n}\n\n.buttons-v-img span path {\n  fill: #e5e6eb;\n  -webkit-transition: fill 0.4s ease-in-out;\n  transition: fill 0.4s ease-in-out;\n}\n\n.buttons-v-img span {\n  cursor: pointer;\n  color: #e5e6eb;\n  font-size: 30px;\n  -webkit-transition: color 0.4s ease-in-out;\n  transition: color 0.4s ease-in-out;\n  text-decoration: none;\n  text-align: center;\n}\n\n.buttons-v-img span:not(:last-child) {\n  margin-right: 8px;\n}\n\n.buttons-v-img span svg {\n  height: 20px;\n  width: 15px;\n}\n\n.buttons-v-img span:hover svg path {\n  fill: white;\n}\n\n.buttons-v-img span:hover {\n  color: white;\n}\n\n.prev-v-img svg,\n.next-v-img svg {\n  margin: 5px auto;\n}\n\n.prev-v-img,\n.next-v-img {\n  color: white;\n  width: 35px;\n  height: 35px;\n  position: absolute;\n  top: 50%;\n  margin-top: -12.5px;\n  font-size: 15px;\n  font-family: 'Avenir', Helvetica, Arial, sans-serif;\n  text-align: center;\n  background-color: rgba(0, 0, 0, 0.3);\n  z-index: 1000;\n  opacity: 0.3;\n  -webkit-transition: opacity 0.3s ease-in-out;\n  transition: opacity 0.3s ease-in-out;\n  cursor: pointer;\n}\n\n.prev-v-img:hover,\n.next-v-img:hover {\n  opacity: 1;\n}\n\n.prev-v-img {\n  left: 10px;\n}\n\n.next-v-img {\n  right: 10px;\n}\n\n.v-img-fade-enter,\n.v-img-fade-leave-to {\n  opacity: 0;\n}\n\n.v-img-fade-enter-active,\n.v-img-fade-leave-active {\n  -webkit-transition: opacity 0.3s ease-in-out;\n  transition: opacity 0.3s ease-in-out;\n}\n</style>\n","/* eslint-disable no-undef */\n/* eslint-disable no-console */\n\nimport ImgScreen from './ImgScreen.vue';\n\nconst addPluginAttributes = (el, binding, options) => {\n  // Defaults\n  let cursor = 'pointer';\n  let group = binding.arg || null;\n  let openOn;\n  let sourceButton;\n  let src = el.src; // eslint-disable-line prefer-destructuring\n  let title;\n  let thumbnails;\n  const events = {};\n\n  if (options.altAsTitle) title = el.alt;\n\n  /* eslint-disable prefer-destructuring */\n  // Assigning values from plugin initialization options here\n  openOn = options.openOn;\n  sourceButton = options.sourceButton;\n  thumbnails = options.thumbnails;\n  /* eslint-enable prefer-destructuring */\n\n  // Overriding options if they're provided in binding.value\n  if (typeof binding.value !== 'undefined') {\n    cursor = binding.value.cursor || cursor;\n    group = binding.value.group || group;\n    openOn = binding.value.openOn || openOn;\n    src = binding.value.src || src;\n    title = binding.value.title || title;\n    // Lifecycle functions\n    events.opened = binding.value.opened;\n    events.closed = binding.value.closed;\n    events.changed = binding.value.changed;\n    // binding.value.sourceButton could be set to false, (part before || will always be ignored)\n    // that's why we're comparing it to undefined but not using approach\n    // as in src, group, title, etc.\n    if (binding.value.sourceButton !== undefined) {\n      sourceButton = binding.value.sourceButton; // eslint-disable-line prefer-destructuring\n    }\n    // same as above\n    if (binding.value.thumbnails !== undefined) {\n      thumbnails = binding.value.thumbnails; // eslint-disable-line prefer-destructuring\n    }\n  }\n\n  // Setting up data attributes for dynamic properties\n  el.setAttribute('data-vue-img-src', src);\n\n  if (group) el.setAttribute('data-vue-img-group', group);\n  if (title) el.setAttribute('data-vue-img-title', title);\n  if (sourceButton) el.setAttribute('data-vue-img-source-button', sourceButton);\n  if (thumbnails) el.setAttribute('data-vue-img-thumbnails', thumbnails);\n\n  if (!src) console.error('v-img element missing src parameter.');\n\n  // Applying options\n  el.style.cursor = cursor; // eslint-disable-line no-param-reassign\n\n  return {\n    cursor,\n    src,\n    group,\n    title,\n    events,\n    sourceButton,\n    openOn,\n    thumbnails,\n  };\n};\n\nconst install = (Vue, options) => {\n  const Screen = Vue.extend(ImgScreen);\n\n  const defaultOptions = {\n    altAsTitle: false,\n    sourceButton: false,\n    thumbnails: false,\n    openOn: 'click',\n  };\n\n  // eslint-disable-next-line no-param-reassign\n  options = Object.assign(defaultOptions, options);\n\n  Vue.directive('img', {\n    update(el, binding, vnode, oldVnode) {\n      let altUpdated;\n      let srcUpdated;\n\n      if (oldVnode.data.attrs && vnode.data.attrs) {\n        srcUpdated = oldVnode.data.attrs.src !== vnode.data.attrs.src;\n        // handle alt tag change only if option altAsTitle is enabled\n        if (options.altAsTitle) {\n          altUpdated = oldVnode.data.attrs.alt !== vnode.data.attrs.alt;\n        }\n      }\n\n      const bindingValueUpdated = binding.oldValue !== binding.value;\n\n      if (srcUpdated || altUpdated || bindingValueUpdated) {\n        addPluginAttributes(el, binding, options);\n      }\n    },\n\n    bind(el, binding) {\n      // Don't pass anything that could be dynamic from addedAttributes\n      // object to vm.\n      const addedAttributes = addPluginAttributes(el, binding, options);\n\n      // Finding existing vm, or creating new one\n      let vm = window.vueImg;\n      if (!vm) {\n        const element = document.createElement('div');\n        element.setAttribute('id', 'imageScreen');\n        document.querySelector('body').appendChild(element);\n        // eslint-disable-next-line no-multi-assign\n        vm = window.vueImg = new Screen().$mount('#imageScreen');\n      }\n\n      // Updating vm's data\n      el.addEventListener(addedAttributes.openOn, () => {\n        let images;\n        if (!el.dataset.vueImgGroup) {\n          images = [el];\n        } else {\n          images = [\n            ...document.querySelectorAll(`img[data-vue-img-group=\"${el.dataset.vueImgGroup}\"]`),\n          ];\n        }\n        Vue.set(vm, 'images', images.map(e => e.dataset.vueImgSrc));\n        Vue.set(vm, 'titles', images.map(e => e.dataset.vueImgTitle));\n        Vue.set(vm, 'sourceButtons', images.map(e => e.dataset.vueImgSourceButton === 'true'));\n        Vue.set(vm, 'thumbnails', el.dataset.vueImgThumbnails === 'true');\n        Vue.set(vm, 'currentImageIndex', images.indexOf(el));\n        Vue.set(vm, 'handlers', addedAttributes.events);\n        Vue.set(vm, 'closed', false);\n      });\n    },\n  });\n};\n\nif (typeof window !== 'undefined' && window.Vue) {\n  window.Vue.use(install);\n}\n\nexport default install;\n"],"names":["render","newVal","this","handlers","closed","opened","changed","currentImageIndex","querySelector","classList","remove","images","length","fireChangeEvent","selectedImage","uiTimeout","visibleUI","setTimeout","addEventListener","e","keyCode","_this2","close","next","prev","showUI","addPluginAttributes","el","binding","options","cursor","group","arg","openOn","sourceButton","src","title","thumbnails","events","altAsTitle","alt","value","undefined","setAttribute","console","error","style","install","Vue","Screen","extend","ImgScreen","babelHelpers.extends","directive","vnode","oldVnode","altUpdated","srcUpdated","data","attrs","bindingValueUpdated","oldValue","addedAttributes","vm","window","vueImg","element","document","createElement","appendChild","$mount","dataset","vueImgGroup","querySelectorAll","set","map","vueImgSrc","vueImgTitle","vueImgSourceButton","vueImgThumbnails","indexOf","use"],"mappings":"CAAA,koHAAA,GAwEA,eAAgBA,qkIAMC,oBACQ,UACX,YACG,6BAEC,2BAIPC,GACDA,GAAUC,KAAKC,SAASC,aACrBD,SAASC,UAEXH,GAAUC,KAAKC,SAASE,aACtBF,SAASE,+CAUZH,KAAKC,SAASG,cACXH,SAASG,QAAQJ,KAAKK,qCAIxBL,KAAKE,kBACCI,cAAc,QAAQC,UAAUC,OAAO,sBAC3CC,eACAJ,kBAAoB,OACpBH,QAAS,qBAIXF,KAAKE,QAAUF,KAAKS,OAAOC,OAAS,IAEnCV,KAAKK,kBAAoB,EAAIL,KAAKS,OAAOC,YACtCL,yBAEAA,kBAAoB,OAEtBM,oCAGFC,QACAP,kBAAoBO,oBAGpBZ,KAAKE,QAAUF,KAAKS,OAAOC,OAAS,IAEnCV,KAAKK,kBAAoB,OACtBA,yBAEAA,kBAAoBL,KAAKS,OAAOC,OAAS,OAE3CC,iDAIFX,KAAKE,sBAGKF,KAAKa,gBACbC,WAAY,OACZD,UAAYE,WAAW,aACrBD,WAAY,GAChB,8CAKAE,iBAAiB,QAAS,YAEb,KAAdC,EAAEC,SAAgC,KAAdD,EAAEC,SAAgBC,EAAKC,QAE7B,KAAdH,EAAEC,SAAgC,KAAdD,EAAEC,SAAgBC,EAAKE,OAE7B,KAAdJ,EAAEC,SAAgC,KAAdD,EAAEC,SAAgBC,EAAKG,gBAE1CN,iBAAiB,SAAU,aAC3BI,iBAEAJ,iBAAiB,YAAa,aAC9BO,g3CC/JLC,oBAAsB,SAACC,EAAIC,EAASC,OAEpCC,EAAS,UACTC,EAAQH,EAAQI,KAAO,KACvBC,SACAC,SACAC,EAAMR,EAAGQ,IACTC,SACAC,SACEC,YAEFT,EAAQU,aAAYH,EAAQT,EAAGa,OAI1BX,EAAQI,SACFJ,EAAQK,eACVL,EAAQQ,gBAIQ,IAAlBT,EAAQa,UACRb,EAAQa,MAAMX,QAAUA,IACzBF,EAAQa,MAAMV,OAASA,IACtBH,EAAQa,MAAMR,QAAUA,IAC3BL,EAAQa,MAAMN,KAAOA,IACnBP,EAAQa,MAAML,OAASA,IAExB/B,OAASuB,EAAQa,MAAMpC,SACvBD,OAASwB,EAAQa,MAAMrC,SACvBE,QAAUsB,EAAQa,MAAMnC,aAIIoC,IAA/Bd,EAAQa,MAAMP,iBACDN,EAAQa,MAAMP,mBAGEQ,IAA7Bd,EAAQa,MAAMJ,eACHT,EAAQa,MAAMJ,eAK5BM,aAAa,mBAAoBR,GAEhCJ,GAAOJ,EAAGgB,aAAa,qBAAsBZ,GAC7CK,GAAOT,EAAGgB,aAAa,qBAAsBP,GAC7CF,GAAcP,EAAGgB,aAAa,6BAA8BT,GAC5DG,GAAYV,EAAGgB,aAAa,0BAA2BN,GAEtDF,GAAKS,QAAQC,MAAM,0CAGrBC,MAAMhB,OAASA,kFAcdiB,QAAU,SAACC,EAAKnB,OACdoB,EAASD,EAAIE,OAAOC,aAUhBC,sBAPI,gBACE,cACF,SACJ,SAI8BvB,KAEpCwB,UAAU,uBACL1B,EAAIC,EAAS0B,EAAOC,OACrBC,SACAC,SAEAF,EAASG,KAAKC,OAASL,EAAMI,KAAKC,UACvBJ,EAASG,KAAKC,MAAMxB,MAAQmB,EAAMI,KAAKC,MAAMxB,IAEtDN,EAAQU,eACGgB,EAASG,KAAKC,MAAMnB,MAAQc,EAAMI,KAAKC,MAAMnB,UAIxDoB,EAAsBhC,EAAQiC,WAAajC,EAAQa,OAErDgB,GAAcD,GAAcI,wBACVjC,EAAIC,EAASC,kBAIhCF,EAAIC,OAGDkC,EAAkBpC,oBAAoBC,EAAIC,EAASC,GAGrDkC,EAAKC,OAAOC,WACXF,EAAI,KACDG,EAAUC,SAASC,cAAc,SAC/BzB,aAAa,KAAM,wBAClBnC,cAAc,QAAQ6D,YAAYH,KAEtCF,OAAOC,QAAS,IAAIhB,GAASqB,OAAO,kBAIxCpD,iBAAiB4C,EAAgB7B,OAAQ,eACtCtB,WACCgB,EAAG4C,QAAQC,wCAITL,SAASM,4CAA4C9C,EAAG4C,QAAQC,qBAH3D7C,KAMR+C,IAAIX,EAAI,SAAUpD,EAAOgE,IAAI,mBAAKxD,EAAEoD,QAAQK,eAC5CF,IAAIX,EAAI,SAAUpD,EAAOgE,IAAI,mBAAKxD,EAAEoD,QAAQM,iBAC5CH,IAAIX,EAAI,gBAAiBpD,EAAOgE,IAAI,kBAAsC,SAAjCxD,EAAEoD,QAAQO,wBACnDJ,IAAIX,EAAI,aAA8C,SAAhCpC,EAAG4C,QAAQQ,oBACjCL,IAAIX,EAAI,oBAAqBpD,EAAOqE,QAAQrD,MAC5C+C,IAAIX,EAAI,WAAYD,EAAgBxB,UACpCoC,IAAIX,EAAI,UAAU,SAMR,oBAAXC,QAA0BA,OAAOhB,YACnCA,IAAIiC,IAAIlC"}