Plugin Directory

Changeset 3202837


Ignore:
Timestamp:
12/05/2024 08:11:47 AM (16 months ago)
Author:
rashmiwp
Message:

Released version 0.1.3 with slider group option

Location:
flexi-flick
Files:
33 added
6 edited

Legend:

Unmodified
Added
Removed
  • flexi-flick/trunk/build/index.asset.php

    r3185975 r3202837  
    1 <?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'd691d0ec5ee72c677241');
     1<?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '4b092c880f868694e909');
  • flexi-flick/trunk/build/index.js

    r3185975 r3202837  
    4545  category: 'widgets',
    4646  attributes: {
     47    sliderGroup: {
     48      type: 'string',
     49      default: ''
     50    },
    4751    showArrows: {
    4852      type: 'boolean',
     
    105109      return [];
    106110    }, []);
     111    const [sliderGroups, setSliderGroups] = (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useState)([]);
     112
     113    // Fetch available slider groups
     114    (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useEffect)(() => {
     115      wp.apiFetch({
     116        path: '/wp/v2/flexiflick_slider_group'
     117      }).then(groups => {
     118        setSliderGroups(groups.map(group => ({
     119          label: group.name,
     120          value: group.id
     121        })));
     122      });
     123    }, []);
    107124    (0,_wordpress_element__WEBPACK_IMPORTED_MODULE_4__.useEffect)(() => {
    108125      // Initialize Flickity only if posts are loaded
     
    127144      onChange: value => setAttributes({
    128145        showArrows: value
     146      })
     147    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.SelectControl, {
     148      label: "Select Slider Group",
     149      value: attributes.sliderGroup,
     150      options: [{
     151        label: 'Select a group',
     152        value: ''
     153      }, ...sliderGroups],
     154      onChange: value => setAttributes({
     155        sliderGroup: value
    129156      })
    130157    }), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(_wordpress_components__WEBPACK_IMPORTED_MODULE_7__.ToggleControl, {
     
    185212    }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("div", {
    186213      className: "flickity-placeholder-content"
    187     }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("h3", null, "Flickity Responsive Slider/Carousel"), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, "...................................."), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, `{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, `{ showPager: ${attributes.showPager ? 'True' : 'False'} }`)))));
     214    }, (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("h3", null, "Flickity Responsive Slider/Carousel"), attributes.sliderGroup && (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, "Selected Group ID: ", attributes.sliderGroup), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, "...................................."), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, `{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`), (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)("p", null, `{ showPager: ${attributes.showPager ? 'True' : 'False'} }`)))));
    188215  },
    189216  save() {
  • flexi-flick/trunk/build/index.js.map

    r3185975 r3202837  
    1 {"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB;AACU;AACQ;AACe;AACX;AAC+B;AACI;AAC1C;AACD;AAEpC,MAAM;EAAEW;AAAkB,CAAC,GAAGC,EAAE,CAACC,MAAM;AAGvCF,iBAAiB,CAACD,6CAAa,EAAE;EAC7BK,KAAK,EAAEN,mDAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAC5CO,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,SAAS;EACnBC,UAAU,EAAE;IACRC,UAAU,EAAE;MACRC,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDC,SAAS,EAAE;MACPF,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDE,SAAS,EAAE;MACPH,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDG,UAAU,EAAE;MACRJ,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDI,UAAU,EAAE;MACRL,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDK,oBAAoB,EAAE;MAClBN,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDM,QAAQ,EAAE;MACNP,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb,CAAC;IACDO,SAAS,EAAE;MACPR,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb;EACJ,CAAC;EACLQ,IAAIA,CAAC;IAAEX,UAAU;IAAEY;EAAc,CAAC,EAAE;IAChC,MAAMC,UAAU,GAAG1B,sEAAa,CAAC,CAAC;IAClC,MAAM2B,SAAS,GAAG9B,0DAAM,CAAC,CAAC;;IAE1B;IACA,MAAM+B,KAAK,GAAG9B,0DAAS,CAAE+B,MAAM,IAAK;MAChC,MAAMC,YAAY,GAAGD,MAAM,CAAC,MAAM,CAAC,CAACE,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,EAAE;QACrFC,QAAQ,EAAE,CAAC;QAAE;QACbC,MAAM,EAAE,IAAI,CAAE;MAClB,CAAC,CAAC;MAEF,IAAIH,YAAY,EAAE;QACd,OAAOA,YAAY,CAACI,GAAG,CAAEC,IAAI,KAAM;UAC/BC,EAAE,EAAED,IAAI,CAACC,EAAE;UACX1B,KAAK,EAAEyB,IAAI,CAACzB,KAAK,CAAC2B,QAAQ;UAC1BC,OAAO,EAAEH,IAAI,CAACG,OAAO,CAACD,QAAQ;UAAE;UAChCE,kBAAkB,EAAEJ,IAAI,CAACK,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAEC,UAAU,IAAI;QACjF,CAAC,CAAC,CAAC;MACP;MAEA,OAAO,EAAE;IACb,CAAC,EAAE,EAAE,CAAC;IAEN7C,6DAAS,CAAC,MAAM;MACR;MACA,IAAIgC,KAAK,CAACc,MAAM,GAAG,CAAC,IAAIf,SAAS,CAACgB,OAAO,EAAE;QACvC,MAAMC,gBAAgB,GAAG,IAAIjD,iDAAQ,CAACgC,SAAS,CAACgB,OAAO,EAAE;UACrDE,eAAe,EAAEhC,UAAU,CAACC,UAAU;UACtCgC,QAAQ,EAAEjC,UAAU,CAACI;QACzB,CAAC,CAAC;QAEF,OAAO,MAAM;UACT2B,gBAAgB,CAACG,OAAO,CAAC,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,EAAE,CAAClC,UAAU,CAACC,UAAU,EAAED,UAAU,CAACI,SAAS,EAAEW,KAAK,CAAC,CAAC;IAG5D,OACIoB,oDAAA;MAAA,GAAStB;IAAU,GACXsB,oDAAA,CAACjD,sEAAiB,QACdiD,oDAAA,CAAC/C,4DAAS;MAACS,KAAK,EAAEN,mDAAE,CAAC,iBAAiB,EAAE,YAAY;IAAE,GAClD4C,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC8C,IAAI,EAAE9C,mDAAE,CAAC,4HAA4H,EAAE,YAAY,CAAE;MACrJ+C,OAAO,EAAEtC,UAAU,CAACC,UAAW;MAC/BsC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEX,UAAU,EAAEuC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,YAAY,EAAE,YAAY,CAAE;MACtC8C,IAAI,EAAE9C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F+C,OAAO,EAAEtC,UAAU,CAACI,SAAU;MAC9BmC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAER,SAAS,EAAEoC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC8C,IAAI,EAAE9C,mDAAE,CAAC,2EAA2E,EAAE,YAAY,CAAE;MACpG+C,OAAO,EAAEtC,UAAU,CAACM,UAAW;MAC/BiC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEN,UAAU,EAAEkC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,WAAW,EAAE,YAAY,CAAE;MACrC8C,IAAI,EAAE9C,mDAAE,CAAC,2JAA2J,EAAE,YAAY,CAAE;MACpL+C,OAAO,EAAEtC,UAAU,CAACK,SAAU;MAC9BkC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEP,SAAS,EAAEmC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvC8C,IAAI,EAAE9C,mDAAE,CAAC,8FAA8F,EAAE,YAAY,CAAE;MAEvH+C,OAAO,EAAEtC,UAAU,CAACO,UAAW;MAC/BgC,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEL,UAAU,EAAEiC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFL,oDAAA,CAAC9C,gEAAa;MACV+C,KAAK,EAAE7C,mDAAE,CAAC,0BAA0B,EAAE,YAAY,CAAE;MACpD8C,IAAI,EAAE9C,mDAAE,CAAC,iEAAiE,EAAE,YAAY,CAAE;MAC1F+C,OAAO,EAAEtC,UAAU,CAACQ,oBAAqB;MACzC+B,QAAQ,EAAGC,KAAK,IAAK5B,aAAa,CAAC;QAAEJ,oBAAoB,EAAEgC;MAAM,CAAC;IAAE,CACvE,CAAC,EACFL,oDAAA,CAAC7C,8DAAW;MACR8C,KAAK,EAAE7C,mDAAE,CAAC,qBAAqB,EAAE,YAAY,CAAE;MAC/C8C,IAAI,EAAE9C,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9FiD,KAAK,EAAExC,UAAU,CAACS,QAAS;MAC3B8B,QAAQ,EAAG9B,QAAQ,IAAKG,aAAa,CAAC;QAAEH,QAAQ,EAAEgC,QAAQ,CAAChC,QAAQ,CAAC,IAAI;MAAE,CAAC,CAAE;MAC7EP,IAAI,EAAC;IAAQ,CAChB,CAAC,EACFiC,oDAAA,CAAC7C,8DAAW;MACR8C,KAAK,EAAE7C,mDAAE,CAAC,iBAAiB,EAAE,YAAY,CAAE;MAC3C8C,IAAI,EAAE9C,mDAAE,CAAC,+CAA+C,EAAE,YAAY,CAAE;MACxEiD,KAAK,EAAExC,UAAU,CAACU,SAAU;MAC5B6B,QAAQ,EAAG7B,SAAS,IAAKE,aAAa,CAAC;QAAEF,SAAS,EAAE+B,QAAQ,CAAC/B,SAAS,CAAC,IAAI;MAAI,CAAC,CAAE;MAClFR,IAAI,EAAC;IAAQ,CAChB,CACM,CACI,CAAC,EACpBiC,oDAAA;MAAKO,SAAS,EAAC;IAAsB,GACjCP,oDAAA;MAAMQ,GAAG,EAAE7B;IAAU,GACbqB,oDAAA;MAAKO,SAAS,EAAC;IAA8B,GACzCP,oDAAA,aAAI,qCAAuC,CAAC,EAC5CA,oDAAA,YAAG,sCAAuC,CAAC,EAC3CA,oDAAA,YAAI,iBAAiBnC,UAAU,CAACC,UAAU,GAAG,MAAM,GAAG,OAAO,IAAQ,CAAC,EACtEkC,oDAAA,YAAI,gBAAgBnC,UAAU,CAACI,SAAS,GAAG,MAAM,GAAG,OAAO,IAAQ,CAClE,CACR,CACJ,CACJ,CAAC;EAEd,CAAC;EACDwC,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAAC,CAAC;EACjB;AACJ,CAAC,CAAC;;;;;;;;;;AClKF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnGF;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,SAAS;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU,KAAK,eAAe,IAAI,MAAM;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,IAAI;AACJ;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnMF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACzIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,8DAAgB;AACtD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW,uBAAuB,WAAW;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7KF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,qDAAU;AAChD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACtDF;AACA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,qDAAU;AAC1B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,oDAAS;AACzB,QAAQ,mBAAO,CAAC,wDAAW;AAC3B;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;AACA;;AAEA;AACA,QAAQ,4BAA4B;AACpC,MAAM,SAAS;;AAEf;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D,wBAAwB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAQ,yBAAyB;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,yBAAyB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,yCAAyC,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,uBAAuB,qBAAqB;AAC5C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAM,gBAAgB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACt3BF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,QAAQ,aAAa;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ,IAAI,WAAW,OAAO,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnSF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,iEAAc;AAC9B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACrCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAyB;AAC9B,mBAAmB,mBAAO,CAAC,kDAAQ;AACnC,EAAE,mBAAO,CAAC,kDAAQ;AAClB,EAAE,mBAAO,CAAC,0EAAoB;AAC9B,EAAE,mBAAO,CAAC,4DAAa;AACvB,EAAE,mBAAO,CAAC,sDAAU;AACpB,EAAE,mBAAO,CAAC,wEAAmB;AAC7B,EAAE,mBAAO,CAAC,0DAAY;AACtB,EAAE,mBAAO,CAAC,kEAAgB;;AAE1B;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA,uBAAuB,SAAS;AAChC,0BAA0B,SAAS;AACnC,2BAA2B,SAAS,SAAS,YAAY;AACzD,SAAS,eAAe,YAAY,eAAe;;AAEnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACjKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,eAAe;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ,yBAAyB;;AAEjC;AACA,cAAc,GAAG;AACjB,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG;AACX,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;;AAEA,QAAQ,0BAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7DF;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,2DAAY;AAC1D,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;AACF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oBAAoB;AAC/B,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;;AC9UF;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;AChSF;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEnDA;UACA;UACA;UACA;UACA","sources":["webpack://flexiflick/./src/index.js","webpack://flexiflick/./node_modules/ev-emitter/ev-emitter.js","webpack://flexiflick/./node_modules/fizzy-ui-utils/utils.js","webpack://flexiflick/./node_modules/flickity/js/add-remove-cell.js","webpack://flexiflick/./node_modules/flickity/js/animate.js","webpack://flexiflick/./node_modules/flickity/js/cell.js","webpack://flexiflick/./node_modules/flickity/js/core.js","webpack://flexiflick/./node_modules/flickity/js/drag.js","webpack://flexiflick/./node_modules/flickity/js/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/js/index.js","webpack://flexiflick/./node_modules/flickity/js/lazyload.js","webpack://flexiflick/./node_modules/flickity/js/page-dots.js","webpack://flexiflick/./node_modules/flickity/js/player.js","webpack://flexiflick/./node_modules/flickity/js/prev-next-button.js","webpack://flexiflick/./node_modules/flickity/js/slide.js","webpack://flexiflick/./node_modules/get-size/get-size.js","webpack://flexiflick/./node_modules/imagesloaded/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/dist/flickity.min.css","webpack://flexiflick/./src/style.scss","webpack://flexiflick/./node_modules/unidragger/unidragger.js","webpack://flexiflick/external window \"React\"","webpack://flexiflick/external window [\"wp\",\"blockEditor\"]","webpack://flexiflick/external window [\"wp\",\"components\"]","webpack://flexiflick/external window [\"wp\",\"data\"]","webpack://flexiflick/external window [\"wp\",\"element\"]","webpack://flexiflick/external window [\"wp\",\"i18n\"]","webpack://flexiflick/webpack/bootstrap","webpack://flexiflick/webpack/runtime/chunk loaded","webpack://flexiflick/webpack/runtime/compat get default export","webpack://flexiflick/webpack/runtime/define property getters","webpack://flexiflick/webpack/runtime/hasOwnProperty shorthand","webpack://flexiflick/webpack/runtime/make namespace object","webpack://flexiflick/webpack/runtime/jsonp chunk loading","webpack://flexiflick/webpack/before-startup","webpack://flexiflick/webpack/startup","webpack://flexiflick/webpack/after-startup"],"sourcesContent":["import './style.scss';\nimport Flickity from 'flickity';\nimport 'flickity/dist/flickity.min.css';\nimport { useEffect, useRef } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { InspectorControls, useBlockProps } from '@wordpress/block-editor';\nimport { PanelBody, ToggleControl, TextControl  } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport metadata from './block.json';\n\nconst { registerBlockType } = wp.blocks;\n\n\nregisterBlockType(metadata.name, {\n    title: __('FlexiFlick Slider', 'flexiflick'),\n    icon: 'slides',\n    category: 'widgets',\n    attributes: {\n        showArrows: {\n            type: 'boolean',\n            default: true,\n        },\n        showPager: {\n            type: 'boolean',\n            default: true,\n        },\n        draggable: {\n            type: 'boolean',\n            default: false,\n        },\n        wrapAround: {\n            type: 'boolean',\n            default: false,\n        },\n        freeScroll: {\n            type: 'boolean',\n            default: true,\n        },\n        pauseAutoPlayOnHover: {\n            type: 'boolean',\n            default: false,\n        },\n        autoPlay: {\n            type: 'number',   // Number input for autoPlay\n            default: 0,\n        },\n        minHeight: {\n            type: 'number',   // Number input for autoPlay\n            default: 450,\n        },\n    },\nedit({ attributes, setAttributes }) {\n    const blockProps = useBlockProps();\n    const sliderRef = useRef();\n\n    // Fetch the custom post type content\n    const posts = useSelect((select) => {\n        const fetchedPosts = select('core').getEntityRecords('postType', 'flexiflick_slide_cpt', {\n            per_page: 3, // Limit the number of posts for the preview\n            _embed: true, // Embed related resources, such as the featured media\n        });\n\n        if (fetchedPosts) {\n            return fetchedPosts.map((post) => ({\n                id: post.id,\n                title: post.title.rendered,\n                content: post.content.rendered, // Use the body content instead of the excerpt\n                featured_media_url: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '',\n            }));\n        }\n\n        return [];\n    }, []);\n\n    useEffect(() => {\n            // Initialize Flickity only if posts are loaded\n            if (posts.length > 0 && sliderRef.current) {\n                const flickityInstance = new Flickity(sliderRef.current, {\n                    prevNextButtons: attributes.showArrows,\n                    pageDots: attributes.showPager,\n                });\n\n                return () => {\n                    flickityInstance.destroy();\n                };\n            }\n        }, [attributes.showArrows, attributes.showPager, posts]);\n\n\n    return (\n        <div {...blockProps}>\n                <InspectorControls>\n                    <PanelBody title={__('Slider Settings', 'flexiflick')}>\n                        <ToggleControl\n                            label={__('Show Arrows', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. For example 1500 will advance cells every 1.5 seconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            checked={attributes.showArrows}\n                            onChange={(value) => setAttributes({ showArrows: value })}\n                        />\n                        <ToggleControl\n                            label={__('Show Pager', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            checked={attributes.showPager}\n                            onChange={(value) => setAttributes({ showPager: value })}\n                        />\n                        <ToggleControl\n                            label={__('Wrap Around', 'flexiflick')}\n                            help={__('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick')}\n                            checked={attributes.wrapAround}\n                            onChange={(value) => setAttributes({ wrapAround: value })}\n                        />\n                        <ToggleControl\n                            label={__('Draggable', 'flexiflick')}\n                            help={__('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick')}\n                            checked={attributes.draggable}\n                            onChange={(value) => setAttributes({ draggable: value })}\n                        />\n                        <ToggleControl\n                            label={__('Free Scroll', 'flexiflick')}\n                            help={__('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick')}\n\n                            checked={attributes.freeScroll}\n                            onChange={(value) => setAttributes({ freeScroll: value })}\n                        />\n                        <ToggleControl\n                            label={__('Pause Auto Play On Hover', 'flexiflick')}\n                            help={__('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick')}\n                            checked={attributes.pauseAutoPlayOnHover}\n                            onChange={(value) => setAttributes({ pauseAutoPlayOnHover: value })}\n                        />\n                        <TextControl\n                            label={__('AutoPlay Speed (ms)', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            value={attributes.autoPlay}\n                            onChange={(autoPlay) => setAttributes({ autoPlay: parseInt(autoPlay) || 0 })}\n                            type=\"number\"\n                        />\n                        <TextControl\n                            label={__('Min Height (px)', 'flexiflick')}\n                            help={__('Enter the minimum height in pixels for slider', 'flexiflick')}\n                            value={attributes.minHeight}\n                            onChange={(minHeight) => setAttributes({ minHeight: parseInt(minHeight) || 450 })}\n                            type=\"number\"\n                        />\n                    </PanelBody>\n                </InspectorControls>\n                <div className=\"flickity-placeholder\">\n                    <div  ref={sliderRef}>\n                            <div className=\"flickity-placeholder-content\">\n                                <h3>Flickity Responsive Slider/Carousel</h3>\n                                <p>....................................</p>\n                                <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>\n                                <p>{`{ showPager: ${attributes.showPager ? 'True' : 'False'} }`}</p>\n                            </div>\n                    </div>\n                </div>\n            </div>\n    );\n    },\n    save() {\n        return null; // Rendered on the server.\n    },\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( global );\n  } else {\n    // browser global\n    global.fizzyUIUtils = factory( global );\n  }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) return [];\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  let index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( elem.matches( selector ) ) return elem;\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n\n  return elems\n    // check that elem is an actual element\n    .filter( ( elem ) => elem instanceof HTMLElement )\n    .reduce( ( ffElems, elem ) => {\n      // add elem if no selector\n      if ( !selector ) {\n        ffElems.push( elem );\n        return ffElems;\n      }\n      // filter & find items if we have a selector\n      // filter\n      if ( elem.matches( selector ) ) {\n        ffElems.push( elem );\n      }\n      // find children\n      let childElems = elem.querySelectorAll( selector );\n      // concat childElems to filterFound array\n      ffElems = ffElems.concat( ...childElems );\n      return ffElems;\n    }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  let method = _class.prototype[ methodName ];\n  let timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    clearTimeout( this[ timeoutName ] );\n\n    let args = arguments;\n    this[ timeoutName ] = setTimeout( () => {\n      method.apply( this, args );\n      delete this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n  let readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( onDocReady );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', onDocReady );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    let dashedNamespace = utils.toDashed( namespace );\n    let dataAttr = 'data-' + dashedNamespace;\n    let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n    let jQuery = global.jQuery;\n\n    [ ...dataAttrElems ].forEach( ( elem ) => {\n      let attr = elem.getAttribute( dataAttr );\n      let options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n        }\n        return;\n      }\n      // initialize\n      let instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    } );\n\n  } );\n};\n\n// -----  ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  let fragment = document.createDocumentFragment();\n  cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  let cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  let fragment = getCellsFragment( cells );\n  // append to slider\n  let isAppend = index === len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    let insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    let endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index );\n  this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  let cells = this.getCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( ( cell ) => {\n    cell.remove();\n    let index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  } );\n\n  this.cellChange( minCellIndex );\n  this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  let cell = this.getCell( elem );\n  if ( !cell ) return;\n\n  cell.getSize();\n\n  let index = this.cells.indexOf( cell );\n  this.cellChange( index );\n  // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n  let prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex, try to maintain position & select previous selected element\n  let cell = this.getCell( prevSelectedElem );\n  if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('fizzy-ui-utils') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) return;\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  let previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n  let x = this.x;\n  // wrap position around\n  if ( this.isWrapping ) {\n    x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  if ( this.options.rightToLeft ) x = -x;\n  let translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n  let firstSlide = this.slides[0];\n  if ( !firstSlide ) return;\n\n  let positionX = -this.x - firstSlide.target;\n  let progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) return;\n\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  let isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n  if ( isResting ) this.restingFrames++;\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  let beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  cells.forEach( ( cell ) => {\n    let cellShift = gap > 0 ? shift : 0;\n    this._wrapShiftCell( cell, cellShift );\n    gap -= cell.size.outerWidth;\n  } );\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) return;\n\n  cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n  this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) return;\n\n  // change the position to drag position by applying force\n  let dragVelocity = this.dragX - this.x;\n  let dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  let dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n  let distance = this.selectedSlide.target * -1 - this.x;\n  let force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('get-size') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory( window.getSize );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n  this.element = elem;\n  this.element.classList.add( cellClassName );\n\n  this.x = 0;\n  this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.classList.remove( cellClassName );\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n  this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n        require('get-size'),\n        require('fizzy-ui-utils'),\n        require('./cell'),\n        require('./slide'),\n        require('./animate'),\n    );\n  } else {\n    // browser global\n    let _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n  let queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    let instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = { ...this.constructor.defaults };\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  let { resize, watchCSS, rightToLeft } = this.options;\n  // add id for Flickity.data\n  let id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n  this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n  // used for keyboard navigation\n  this.focusableElems = [ this.element ];\n\n  if ( resize || watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( let eventName in this.options.on ) {\n    let listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  for ( let method in Flickity.create ) {\n    Flickity.create[ method ].call( this );\n  }\n\n  if ( watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) return;\n\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  let cellElems = this._filterFindCellElements( this.element.children );\n  this.slider.append( ...cellElems );\n  this.viewport.append( this.slider );\n  this.element.append( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  let slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  let cellElems = this._filterFindCellElements( elems );\n\n  // create new Cells for collection\n  return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  let cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    let startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n\n  this.cells.slice( index ).forEach( ( cell ) => {\n    cell.x = cellX;\n    this._renderCellPosition( cell, cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  } );\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = this.cells.length ?\n    this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n  // render position of cell with in slider\n  let sideOffset = this.options.rightToLeft ? -1 : 1;\n  let renderX = x * sideOffset;\n  if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n  let positionValue = this.getPositionValue( renderX );\n  cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) return;\n\n  let { beginMargin, endMargin } = this;\n  let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n  this.slides.push( slide );\n\n  let canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( ( cell, i ) => {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n    if ( canCellFit( i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( beginMargin, endMargin, this.cellAlign );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  } );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  let { groupCells } = this.options;\n  if ( !groupCells ) return () => false;\n\n  if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    let number = parseInt( groupCells, 10 );\n    return ( i ) => ( i % number ) !== 0;\n  }\n  // default, group by width of slide\n  let percent = 1;\n  // parse '75%\n  let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n  if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n  let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n  return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n  left: 0,\n  center: 0.5,\n  right: 1,\n};\n\nproto.setCellAlign = function() {\n  let { cellAlign, rightToLeft } = this.options;\n  let shorthand = cellAlignShorthands[ cellAlign ];\n  this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n  if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( !this.options.setGallerySize ) return;\n\n  let height = this.options.adaptiveHeight && this.selectedSlide ?\n    this.selectedSlide.height : this.maxCellHeight;\n  this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n  // update isWrapping\n  this.isWrapping = this.getIsWrapping();\n  // only for wrap-around\n  if ( !this.isWrapping ) return;\n\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  let beforeGapX = this.cursorPosition;\n  let lastIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  let afterGapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n  let { wrapAround } = this.options;\n  if ( !wrapAround || this.slides.length < 2 ) return false;\n\n  if ( wrapAround !== 'fill' ) return true;\n  // check that slides can fit\n\n  let gapWidth = this.slideableWidth - this.size.innerWidth;\n  if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n  // check that content width - shifting cell is bigger than viewport width\n  for ( let cell of this.cells ) {\n    if ( cell.size.outerWidth > gapWidth ) return false;\n  }\n  return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  let cells = [];\n  while ( gapX > 0 ) {\n    let cell = this.cells[ cellIndex ];\n    if ( !cell ) break;\n\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  let isContaining = this.options.contain && !this.isWrapping &&\n      this.cells.length;\n  if ( !isContaining ) return;\n\n  let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n  // content is less than gallery size\n  let isContentSmaller = contentWidth < this.size.innerWidth;\n  if ( isContentSmaller ) {\n    // all cells fit inside gallery\n    this.slides.forEach( ( slide ) => {\n      slide.target = contentWidth * this.cellAlign;\n    } );\n  } else {\n    // contain to bounds\n    let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n    let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n    this.slides.forEach( ( slide ) => {\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    } );\n  }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  let emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    let $event = type;\n    if ( event ) {\n      // create jQuery event\n      let jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\nconst unidraggerEvents = [\n  'dragStart',\n  'dragMove',\n  'dragEnd',\n  'pointerDown',\n  'pointerMove',\n  'pointerEnd',\n  'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n  if ( eventName === 'staticClick' ) {\n    // add cellElem and cellIndex args to staticClick\n    let clickedCell = this.getParentCell( args[0].target );\n    let cellElem = clickedCell && clickedCell.element;\n    let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n    args = args.concat( cellElem, cellIndex );\n  }\n  // do regular thing\n  _emitEvent.call( this, eventName, args );\n  // duck-punch in jQuery events for Unidragger events\n  let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n  if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n  eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n  let event = args.shift( 0 );\n  let jQEvent = new jQuery.Event( event );\n  jQEvent.type = eventName;\n  this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) return;\n\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.isWrapping || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) return;\n\n  let prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index !== prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  if ( !this.isWrapping ) return;\n\n  const { selectedIndex, slideableWidth, slides: { length } } = this;\n  // shift index for wrap, do not wrap dragSelect\n  if ( !this.isDragSelect ) {\n    let wrapIndex = utils.modulo( index, length );\n    // go to shortest\n    let delta = Math.abs( wrapIndex - selectedIndex );\n    let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n    let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n    if ( backWrapDelta < delta ) {\n      index += length;\n    } else if ( forewardWrapDelta < delta ) {\n      index -= length;\n    }\n  }\n\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= slideableWidth;\n  } else if ( index >= length ) {\n    this.x += slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  let slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) return;\n\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n  let initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    let cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  let index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  let cell = this.queryCell( value );\n  if ( !cell ) return;\n\n  let index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slide that has cell\n  let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n  return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( let cell of this.cells ) {\n    if ( cell.element === elem ) return cell;\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  let cell = this.getCell( elem );\n  if ( cell ) return cell;\n\n  // try to get parent cell elem\n  let closest = elem.closest('.flickity-slider > *');\n  return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n  index = index === undefined ? this.selectedIndex : index;\n\n  let len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements(); // get all\n  }\n\n  let cellElems = [];\n  for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n    let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n    let slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  // do not select invalid selectors from hash: #123, #/. #791\n  let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n  if ( isSelectorString ) {\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n  this.getSize();\n  // wrap values\n  if ( this.isWrapping ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  let selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  if ( !this.options.watchCSS ) return;\n\n  let afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.includes('flickity') ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  let { activeElement } = document;\n  let handler = Flickity.keyboardHandlers[ event.key ];\n  // only work if element is in focus\n  if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n  let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n  if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n  ArrowLeft: function() {\n    this.uiChange();\n    let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this[ leftMethod ]();\n  },\n  ArrowRight: function() {\n    this.uiChange();\n    let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) return;\n\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( ( cell ) => cell.destroy() );\n  this.viewport.remove();\n  // move child elements back into element\n  this.element.append( ...this.slider.children );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n  jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./core'),\n        require('unidragger'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// --------------------------  -------------------------- //\n\nFlickity.create.drag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  this.on( 'pointerDown', this.handlePointerDown );\n  this.on( 'pointerUp', this.handlePointerUp );\n  this.on( 'pointerDown', this.handlePointerDone );\n  this.on( 'dragStart', this.handleDragStart );\n  this.on( 'dragMove', this.handleDragMove );\n  this.on( 'dragEnd', this.handleDragEnd );\n  this.on( 'staticClick', this.handleStaticClick );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable === '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n  if ( !this.isDraggable ) {\n    // proceed for staticClick\n    this.bindActivePointerEvents( event );\n    return;\n  }\n\n  let isTouchStart = event.type === 'touchstart';\n  let isTouchPointer = event.pointerType === 'touch';\n  let isFocusNode = event.target.matches('input, textarea, select');\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n  if ( !isFocusNode ) this.focus();\n  // blur\n  if ( document.activeElement !== this.element ) document.activeElement.blur();\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n  this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n  if ( !this.isDraggable ) return;\n\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) return;\n\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  let direction = this.options.rightToLeft ? -1 : 1;\n  // wrap around move. #589\n  if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n  let dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.isWrapping ) {\n    // slow drag\n    let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n  this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n  if ( !this.isDraggable ) return;\n\n  let { freeScroll } = this.options;\n  if ( freeScroll ) this.isFreeScrolling = true;\n  // set selectedIndex based on where flick will end up\n  let index = this.dragEndRestingSelect();\n\n  if ( freeScroll && !this.isWrapping ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    let restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !freeScroll && index === this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.isWrapping;\n  this.select( index );\n  delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n  let restingX = this.getRestingPosition();\n  // how far away from selected slide\n  let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  let positiveResting = this._getClosestResting( restingX, distance, 1 );\n  let negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  return positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  let index = this.selectedIndex;\n  let minDistance = Infinity;\n  let condition = this.options.contain && !this.isWrapping ?\n    // if containing, keep going if distance is equal to minDistance\n    ( dist, minDist ) => dist <= minDist :\n    ( dist, minDist ) => dist < minDist;\n\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) break;\n\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  let len = this.slides.length;\n  // wrap around if at least 2 slides\n  let isWrapAround = this.options.wrapAround && len > 1;\n  let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  let slide = this.slides[ slideIndex ];\n  if ( !slide ) return null;\n\n  // add distance for wrap-around slides\n  let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  let delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  let scroll = getScrollPosition();\n  let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this.pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('imagesloaded'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.imagesLoaded,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n  this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n  if ( !this.options.imagesLoaded ) return;\n\n  let onImagesLoadedProgress = ( instance, image ) => {\n    let cell = this.getParentCell( image.img );\n    this.cellSizeChange( cell && cell.element );\n    if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n  };\n  imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n  const Flickity = require('./core');\n  require('./drag');\n  require('./prev-next-button');\n  require('./page-dots');\n  require('./player');\n  require('./add-remove-cell');\n  require('./lazyload');\n  require('./imagesloaded');\n\n  module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n  `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n  this.on( 'select', this.lazyLoad );\n\n  this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n  let { lazyLoad } = this.options;\n  if ( !lazyLoad ) return;\n\n  // get adjacent cells, use lazyLoad option for adjacent count\n  let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  // lazy load images\n  this.getAdjacentCellElements( adjCount )\n    .map( getCellLazyImages )\n    .flat()\n    .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.matches('img') ) {\n    let cellAttr = cellElem.getAttribute( lazyAttr );\n    let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n    let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n    if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n      return cellElem;\n    }\n  }\n  // select lazy images in cell\n  return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n  let cell = this.getParentCell( img );\n  let cellElem = cell && cell.element;\n  this.cellSizeChange( cellElem );\n\n  this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n  this.img = img;\n  this.onComplete = onComplete;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  let src = this.img.getAttribute( lazyAttr ) ||\n    this.img.getAttribute( lazySrcAttr );\n  let srcset = this.img.getAttribute( lazySrcsetAttr );\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n  // remove attr\n  this.img.removeAttribute( lazyAttr );\n  this.img.removeAttribute( lazySrcAttr );\n  this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n  let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n  mediaElem.classList.add( className );\n\n  this.onComplete( this.img, event );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n  // create holder element\n  this.holder = document.createElement('div');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n  // get difference between number of slides and number of dots\n  let delta = slidesLength - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  let newDots = new Array( count ).fill()\n    .map( ( item, i ) => {\n      let dot = document.createElement('button');\n      dot.setAttribute( 'type', 'button' );\n      let num = i + 1 + this.dots.length;\n      dot.className = 'flickity-page-dot';\n      dot.textContent = `View slide ${num}`;\n      return dot;\n    } );\n\n  this.holder.append( ...newDots );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  let removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.classList.remove('is-selected');\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) return;\n\n  this.selectedDot = this.dots[ index ];\n  this.selectedDot.classList.add('is-selected');\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n  if ( !this.options.pageDots ) return;\n\n  this.pageDots = new PageDots();\n  this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n  this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n  this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n  let index = this.pageDots.dots.indexOf( event.target );\n  if ( index === -1 ) return; // only dot clicks\n\n  this.uiChange();\n  this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.dots.forEach( ( dot ) => {\n    utils.removeFrom( this.focusableElems, dot );\n  } );\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.holder.remove();\n  this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n  this.autoPlay = autoPlay;\n  this.onTick = onTick;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state === 'playing' ) return;\n\n  // do not play if page is hidden, start playing when page is visible\n  let isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state !== 'playing' ) return;\n\n  // default to 3 seconds\n  let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( () => {\n    this.onTick();\n    this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state === 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  let isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n  this.player = new Player( this.options.autoPlay, () => {\n    this.next( true );\n  } );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) return;\n\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) return;\n\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n  this.increment = increment;\n  this.direction = direction;\n  this.isPrevious = increment === 'previous';\n  this.isLeft = direction === 'left';\n  this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n  // properties\n  let element = this.element = document.createElement('button');\n  element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n  let label = this.isPrevious ? 'Previous' : 'Next';\n  // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  element.setAttribute( 'aria-label', label );\n  // init as disabled\n  this.disable();\n  // create arrow\n  let svg = this.createSVG( label, arrowShape );\n  element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n  let svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  // add title #1189\n  let title = document.createElementNS( svgURI, 'title' );\n  title.append( label );\n  // add path\n  let path = document.createElementNS( svgURI, 'path' );\n  let pathMovements = getArrowMovements( arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n  }\n  svg.append( title, path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) return shape;\n\n  let { x0, x1, x2, x3, y1, y2 } = shape;\n\n  // create movement string\n  return `M ${x0}, 50\n    L ${x1}, ${y1 + 50}\n    L ${x2}, ${y2 + 50}\n    L ${x3}, 50\n    L ${x2}, ${50 - y2}\n    L ${x1}, ${50 - y1}\n    Z`;\n}\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n  this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.create.prevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) return;\n\n  let { rightToLeft, arrowShape } = this.options;\n  let prevDirection = rightToLeft ? 'right' : 'left';\n  let nextDirection = rightToLeft ? 'left' : 'right';\n  this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n  this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n  this.focusableElems.push( this.prevButton.element );\n  this.focusableElems.push( this.nextButton.element );\n\n  this.handlePrevButtonClick = () => {\n    this.uiChange();\n    this.previous();\n  };\n\n  this.handleNextButtonClick = () => {\n    this.uiChange();\n    this.next();\n  };\n\n  this.on( 'activate', this.activatePrevNextButtons );\n  this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n  let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n  this.updatePrevNextButton( this.prevButton, 0 );\n  this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n  // enable is wrapAround and at least 2 slides\n  if ( this.isWrapping && this.slides.length > 1 ) {\n    button.enable();\n    return;\n  }\n\n  let isEnabled = this.selectedIndex !== disabledIndex;\n  button[ isEnabled ? 'enable' : 'disable' ]();\n  // if disabling button that is focused,\n  // shift focus to element to maintain keyboard accessibility\n  let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n  if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n  this.element.append( this.prevButton.element, this.nextButton.element );\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.element.remove();\n  this.nextButton.element.remove();\n  this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n  this.beginMargin = beginMargin;\n  this.endMargin = endMargin;\n  this.cellAlign = cellAlign;\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length === 1 ) {\n    this.x = cell.x; // x comes from first cell\n    this.firstMargin = cell.size[ this.beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  let lastCell = this.getLastCell();\n  let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n  let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  let num = parseFloat( value );\n  // not a percent like '100%', and a number\n  let isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  let size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0,\n  };\n  measurements.forEach( ( measurement ) => {\n    size[ measurement ] = 0;\n  } );\n  return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n  // do not proceed on non-objects\n  let isElement = elem && typeof elem == 'object' && elem.nodeType;\n  if ( !isElement ) return;\n\n  let style = getComputedStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) return getZeroSize();\n\n  let size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  measurements.forEach( ( measurement ) => {\n    let value = style[ measurement ];\n    let num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  } );\n\n  let paddingWidth = size.paddingLeft + size.paddingRight;\n  let paddingHeight = size.paddingTop + size.paddingBottom;\n  let marginWidth = size.marginLeft + size.marginRight;\n  let marginHeight = size.marginTop + size.marginBottom;\n  let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  // overwrite width and height if we can get it from style\n  let styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingWidth + borderWidth );\n  }\n\n  let styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, require('ev-emitter') );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n        window,\n        window.EvEmitter,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n  // HACK prefer Touch Events as you can preventDefault on touchstart to\n  // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n  startEvent = 'touchstart';\n  activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n  // Pointer Events\n  startEvent = 'pointerdown';\n  activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n  // mouse events\n  startEvent = 'mousedown';\n  activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n  this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n  this.handles.forEach( ( handle ) => {\n    handle[ bindMethod ]( startEvent, this );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n  } );\n};\n\nproto.bindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.addEventListener( eventName, this );\n  } );\n};\n\nproto.unbindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.removeEventListener( eventName, this );\n  } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n  if ( event.pointerId === this.pointerIdentifier ) {\n    this[ methodName ]( event, event );\n  }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n  let touch;\n  for ( let changedTouch of event.changedTouches ) {\n    if ( changedTouch.identifier === this.pointerIdentifier ) {\n      touch = changedTouch;\n    }\n  }\n  if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  // dismiss multi-touch taps, right clicks, and clicks on text fields\n  let isCursorNode = cursorNodes.includes( event.target.nodeName );\n  let isClickType = clickTypes.includes( event.target.type );\n  let isOkayElement = !isCursorNode || isClickType;\n  let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n  if ( !isOkay ) return;\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n  // track position for move\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  this.bindActivePointerEvents();\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n  this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n  this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  let moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY,\n  };\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  // start drag if pointer has moved far enough to start drag\n  let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n  if ( isDragStarting ) this.dragStart( event, pointer );\n  if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  this.isPreventingClicks = true; // set flag to prevent clicks\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n  this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n  this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n  if ( this.isDragging ) {\n    this.dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this.staticClick( event, pointer );\n  }\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.isDragging = false; // reset flag\n  // re-enable clicking async\n  setTimeout( () => delete this.isPreventingClicks );\n\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n  this.unbindActivePointerEvents();\n  this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n  this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  let isMouseup = event.type === 'mouseup';\n  if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( isMouseup ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 400ms\n    setTimeout( () => {\n      delete this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\n// -----  ----- //\n\nreturn Unidragger;\n\n} ) );\n","module.exports = window[\"React\"];","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0,\n\t\"./style-index\": 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkflexiflick\"] = self[\"webpackChunkflexiflick\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [\"./style-index\"], () => (__webpack_require__(\"./src/index.js\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["Flickity","useEffect","useRef","useSelect","InspectorControls","useBlockProps","PanelBody","ToggleControl","TextControl","__","metadata","registerBlockType","wp","blocks","name","title","icon","category","attributes","showArrows","type","default","showPager","draggable","wrapAround","freeScroll","pauseAutoPlayOnHover","autoPlay","minHeight","edit","setAttributes","blockProps","sliderRef","posts","select","fetchedPosts","getEntityRecords","per_page","_embed","map","post","id","rendered","content","featured_media_url","_embedded","source_url","length","current","flickityInstance","prevNextButtons","pageDots","destroy","createElement","label","help","checked","onChange","value","parseInt","className","ref","save"],"sourceRoot":""}
     1{"version":3,"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAsB;AACU;AACQ;AACyB;AACrB;AAC+B;AACmB;AACzD;AACD;AAEpC,MAAM;EAAEa;AAAkB,CAAC,GAAGC,EAAE,CAACC,MAAM;AAGvCF,iBAAiB,CAACD,6CAAa,EAAE;EAC7BK,KAAK,EAAEN,mDAAE,CAAC,mBAAmB,EAAE,YAAY,CAAC;EAC5CO,IAAI,EAAE,QAAQ;EACdC,QAAQ,EAAE,SAAS;EACnBC,UAAU,EAAE;IACRC,WAAW,EAAE;MACTC,IAAI,EAAE,QAAQ;MACdC,OAAO,EAAE;IACb,CAAC;IACDC,UAAU,EAAE;MACRF,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDE,SAAS,EAAE;MACPH,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDG,SAAS,EAAE;MACPJ,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDI,UAAU,EAAE;MACRL,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDK,UAAU,EAAE;MACRN,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDM,oBAAoB,EAAE;MAClBP,IAAI,EAAE,SAAS;MACfC,OAAO,EAAE;IACb,CAAC;IACDO,QAAQ,EAAE;MACNR,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb,CAAC;IACDQ,SAAS,EAAE;MACPT,IAAI,EAAE,QAAQ;MAAI;MAClBC,OAAO,EAAE;IACb;EACJ,CAAC;EACLS,IAAIA,CAAC;IAAEZ,UAAU;IAAEa;EAAc,CAAC,EAAE;IAChC,MAAMC,UAAU,GAAG5B,sEAAa,CAAC,CAAC;IAClC,MAAM6B,SAAS,GAAGhC,0DAAM,CAAC,CAAC;;IAE1B;IACA,MAAMiC,KAAK,GAAGhC,0DAAS,CAAEiC,MAAM,IAAK;MAChC,MAAMC,YAAY,GAAGD,MAAM,CAAC,MAAM,CAAC,CAACE,gBAAgB,CAAC,UAAU,EAAE,sBAAsB,EAAE;QACrFC,QAAQ,EAAE,CAAC;QAAE;QACbC,MAAM,EAAE,IAAI,CAAE;MAClB,CAAC,CAAC;MAEF,IAAIH,YAAY,EAAE;QACd,OAAOA,YAAY,CAACI,GAAG,CAAEC,IAAI,KAAM;UAC/BC,EAAE,EAAED,IAAI,CAACC,EAAE;UACX3B,KAAK,EAAE0B,IAAI,CAAC1B,KAAK,CAAC4B,QAAQ;UAC1BC,OAAO,EAAEH,IAAI,CAACG,OAAO,CAACD,QAAQ;UAAE;UAChCE,kBAAkB,EAAEJ,IAAI,CAACK,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAEC,UAAU,IAAI;QACjF,CAAC,CAAC,CAAC;MACP;MAEA,OAAO,EAAE;IACb,CAAC,EAAE,EAAE,CAAC;IAEN,MAAM,CAACC,YAAY,EAAEC,eAAe,CAAC,GAAGjD,4DAAQ,CAAC,EAAE,CAAC;;IAEpD;IACAD,6DAAS,CAAC,MAAM;MACRa,EAAE,CAACsC,QAAQ,CAAC;QAAEC,IAAI,EAAE;MAAiC,CAAC,CAAC,CAACC,IAAI,CAAEC,MAAM,IAAK;QACrEJ,eAAe,CAACI,MAAM,CAACb,GAAG,CAAEc,KAAK,KAAM;UACnCC,KAAK,EAAED,KAAK,CAACxC,IAAI;UACjB0C,KAAK,EAAEF,KAAK,CAACZ;QACjB,CAAC,CAAC,CAAC,CAAC;MACR,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC;IAEV3C,6DAAS,CAAC,MAAM;MACR;MACA,IAAImC,KAAK,CAACuB,MAAM,GAAG,CAAC,IAAIxB,SAAS,CAACyB,OAAO,EAAE;QACvC,MAAMC,gBAAgB,GAAG,IAAI7D,iDAAQ,CAACmC,SAAS,CAACyB,OAAO,EAAE;UACrDE,eAAe,EAAE1C,UAAU,CAACI,UAAU;UACtCuC,QAAQ,EAAE3C,UAAU,CAACK;QACzB,CAAC,CAAC;QAEF,OAAO,MAAM;UACToC,gBAAgB,CAACG,OAAO,CAAC,CAAC;QAC9B,CAAC;MACL;IACJ,CAAC,EAAE,CAAC5C,UAAU,CAACI,UAAU,EAAEJ,UAAU,CAACK,SAAS,EAAEW,KAAK,CAAC,CAAC;IAG5D,OACI6B,oDAAA;MAAA,GAAS/B;IAAU,GACX+B,oDAAA,CAAC5D,sEAAiB,QACd4D,oDAAA,CAAC1D,4DAAS;MAACU,KAAK,EAAEN,mDAAE,CAAC,iBAAiB,EAAE,YAAY;IAAE,GAClDsD,oDAAA,CAACzD,gEAAa;MACViD,KAAK,EAAE9C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvCuD,IAAI,EAAEvD,mDAAE,CAAC,4HAA4H,EAAE,YAAY,CAAE;MACrJwD,OAAO,EAAE/C,UAAU,CAACI,UAAW;MAC/B4C,QAAQ,EAAGV,KAAK,IAAKzB,aAAa,CAAC;QAAET,UAAU,EAAEkC;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFO,oDAAA,CAACvD,gEAAa;MACV+C,KAAK,EAAC,qBAAqB;MAC3BC,KAAK,EAAEtC,UAAU,CAACC,WAAY;MAC9BgD,OAAO,EAAE,CACL;QAAEZ,KAAK,EAAE,gBAAgB;QAAEC,KAAK,EAAE;MAAG,CAAC,EACtC,GAAGR,YAAY,CACjB;MACFkB,QAAQ,EAAGV,KAAK,IACZzB,aAAa,CAAC;QAAEZ,WAAW,EAAEqC;MAAM,CAAC;IACvC,CACJ,CAAC,EACFO,oDAAA,CAACzD,gEAAa;MACViD,KAAK,EAAE9C,mDAAE,CAAC,YAAY,EAAE,YAAY,CAAE;MACtCuD,IAAI,EAAEvD,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9FwD,OAAO,EAAE/C,UAAU,CAACK,SAAU;MAC9B2C,QAAQ,EAAGV,KAAK,IAAKzB,aAAa,CAAC;QAAER,SAAS,EAAEiC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFO,oDAAA,CAACzD,gEAAa;MACViD,KAAK,EAAE9C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvCuD,IAAI,EAAEvD,mDAAE,CAAC,2EAA2E,EAAE,YAAY,CAAE;MACpGwD,OAAO,EAAE/C,UAAU,CAACO,UAAW;MAC/ByC,QAAQ,EAAGV,KAAK,IAAKzB,aAAa,CAAC;QAAEN,UAAU,EAAE+B;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFO,oDAAA,CAACzD,gEAAa;MACViD,KAAK,EAAE9C,mDAAE,CAAC,WAAW,EAAE,YAAY,CAAE;MACrCuD,IAAI,EAAEvD,mDAAE,CAAC,2JAA2J,EAAE,YAAY,CAAE;MACpLwD,OAAO,EAAE/C,UAAU,CAACM,SAAU;MAC9B0C,QAAQ,EAAGV,KAAK,IAAKzB,aAAa,CAAC;QAAEP,SAAS,EAAEgC;MAAM,CAAC;IAAE,CAC5D,CAAC,EACFO,oDAAA,CAACzD,gEAAa;MACViD,KAAK,EAAE9C,mDAAE,CAAC,aAAa,EAAE,YAAY,CAAE;MACvCuD,IAAI,EAAEvD,mDAAE,CAAC,8FAA8F,EAAE,YAAY,CAAE;MAEvHwD,OAAO,EAAE/C,UAAU,CAACQ,UAAW;MAC/BwC,QAAQ,EAAGV,KAAK,IAAKzB,aAAa,CAAC;QAAEL,UAAU,EAAE8B;MAAM,CAAC;IAAE,CAC7D,CAAC,EACFO,oDAAA,CAACzD,gEAAa;MACViD,KAAK,EAAE9C,mDAAE,CAAC,0BAA0B,EAAE,YAAY,CAAE;MACpDuD,IAAI,EAAEvD,mDAAE,CAAC,iEAAiE,EAAE,YAAY,CAAE;MAC1FwD,OAAO,EAAE/C,UAAU,CAACS,oBAAqB;MACzCuC,QAAQ,EAAGV,KAAK,IAAKzB,aAAa,CAAC;QAAEJ,oBAAoB,EAAE6B;MAAM,CAAC;IAAE,CACvE,CAAC,EACFO,oDAAA,CAACxD,8DAAW;MACRgD,KAAK,EAAE9C,mDAAE,CAAC,qBAAqB,EAAE,YAAY,CAAE;MAC/CuD,IAAI,EAAEvD,mDAAE,CAAC,qEAAqE,EAAE,YAAY,CAAE;MAC9F+C,KAAK,EAAEtC,UAAU,CAACU,QAAS;MAC3BsC,QAAQ,EAAGtC,QAAQ,IAAKG,aAAa,CAAC;QAAEH,QAAQ,EAAEwC,QAAQ,CAACxC,QAAQ,CAAC,IAAI;MAAE,CAAC,CAAE;MAC7ER,IAAI,EAAC;IAAQ,CAChB,CAAC,EACF2C,oDAAA,CAACxD,8DAAW;MACRgD,KAAK,EAAE9C,mDAAE,CAAC,iBAAiB,EAAE,YAAY,CAAE;MAC3CuD,IAAI,EAAEvD,mDAAE,CAAC,+CAA+C,EAAE,YAAY,CAAE;MACxE+C,KAAK,EAAEtC,UAAU,CAACW,SAAU;MAC5BqC,QAAQ,EAAGrC,SAAS,IAAKE,aAAa,CAAC;QAAEF,SAAS,EAAEuC,QAAQ,CAACvC,SAAS,CAAC,IAAI;MAAI,CAAC,CAAE;MAClFT,IAAI,EAAC;IAAQ,CAChB,CACM,CACI,CAAC,EACpB2C,oDAAA;MAAKM,SAAS,EAAC;IAAsB,GACjCN,oDAAA;MAAMO,GAAG,EAAErC;IAAU,GACb8B,oDAAA;MAAKM,SAAS,EAAC;IAA8B,GACzCN,oDAAA,aAAI,qCAAuC,CAAC,EAC3C7C,UAAU,CAACC,WAAW,IACnB4C,oDAAA,YAAG,qBAAmB,EAAC7C,UAAU,CAACC,WAAe,CACpD,EACD4C,oDAAA,YAAG,sCAAuC,CAAC,EAC3CA,oDAAA,YAAI,iBAAiB7C,UAAU,CAACI,UAAU,GAAG,MAAM,GAAG,OAAO,IAAQ,CAAC,EACtEyC,oDAAA,YAAI,gBAAgB7C,UAAU,CAACK,SAAS,GAAG,MAAM,GAAG,OAAO,IAAQ,CAClE,CACR,CACJ,CACJ,CAAC;EAEd,CAAC;EACDgD,IAAIA,CAAA,EAAG;IACH,OAAO,IAAI,CAAC,CAAC;EACjB;AACJ,CAAC,CAAC;;;;;;;;;;AChMF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnGF;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,SAAS;AAChE;;AAEA;AACA;AACA;AACA;AACA;AACA,QAAQ;AACR;AACA;AACA,0CAA0C,UAAU,KAAK,eAAe,IAAI,MAAM;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;;AAEN,IAAI;AACJ;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnMF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACzIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,8DAAgB;AACtD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,WAAW,uBAAuB,WAAW;AAChE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,qBAAqB;AACrB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;;AAEA;AACA;;AAEA,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7KF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,qDAAU;AAChD,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACtDF;AACA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,qDAAU;AAC1B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,oDAAS;AACzB,QAAQ,mBAAO,CAAC,wDAAW;AAC3B;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;AACA;;AAEA;AACA,QAAQ,4BAA4B;AACpC,MAAM,SAAS;;AAEf;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,8DAA8D,wBAAwB;AACtF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,mBAAmB;AACnB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,QAAQ,gCAAgC;AACxC;AACA;AACA,kCAAkC;AAClC,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,gCAAgC;AAC3C,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,eAAe;AAC/D;;AAEA;AACA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,QAAQ,yBAAyB;AACjC;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,yBAAyB;AACjC;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kCAAkC,OAAO;AACzC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,QAAQ,aAAa;AACrB;;AAEA;AACA;;AAEA;AACA,sDAAsD;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,OAAO;AAClB,WAAW,OAAO;AAClB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,UAAU,yCAAyC,WAAW;AAC9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,4BAA4B;AACvC,aAAa,OAAO;AACpB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,aAAa,OAAO;AACpB;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,aAAa,cAAc;AAC3B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,SAAS;AACpB,WAAW,SAAS;AACpB,aAAa,OAAO;AACpB;AACA;AACA;;AAEA;;AAEA;AACA;AACA,mCAAmC;AACnC;;AAEA;AACA,kCAAkC,uBAAuB;AACzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,2BAA2B;AACtC,aAAa,eAAe;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0BAA0B;AAC1B;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;;AAEA;AACA;AACA,QAAQ,gBAAgB;AACxB;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;AAEA;AACA,uBAAuB,qBAAqB;AAC5C;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA,WAAW,mBAAmB;AAC9B,aAAa,UAAU;AACvB;AACA;AACA;AACA;AACA;;AAEA;;AAEA,MAAM,gBAAgB;AACtB;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACt3BF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,2DAAY;AAC5B,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;;AAEA;AACA;AACA;AACA,EAAE;;AAEF;;AAEA;AACA,8CAA8C;AAC9C;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,QAAQ,aAAa;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ,IAAI,WAAW,OAAO,UAAU;AACrD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,SAAS;AACpB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACnSF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,iEAAc;AAC9B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;AACD;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACrCF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,KAAK,KAAyB;AAC9B,mBAAmB,mBAAO,CAAC,kDAAQ;AACnC,EAAE,mBAAO,CAAC,kDAAQ;AAClB,EAAE,mBAAO,CAAC,0EAAoB;AAC9B,EAAE,mBAAO,CAAC,4DAAa;AACvB,EAAE,mBAAO,CAAC,sDAAU;AACpB,EAAE,mBAAO,CAAC,wEAAmB;AAC7B,EAAE,mBAAO,CAAC,0DAAY;AACtB,EAAE,mBAAO,CAAC,kEAAgB;;AAE1B;AACA;;;;;;;;;;;ACtBA;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA,uBAAuB,SAAS;AAChC,0BAA0B,SAAS;AACnC,2BAA2B,SAAS,SAAS,YAAY;AACzD,SAAS,eAAe,YAAY,eAAe;;AAEnD;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,UAAU;AACrB;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,QAAQ,mBAAO,CAAC,kDAAQ;AACxB,QAAQ,mBAAO,CAAC,8DAAgB;AAChC;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,IAAI;AAC1C;AACA,MAAM;;AAEN;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,8BAA8B;;AAE9B;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxIF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,EAAE;;AAEF;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACjKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,8BAA8B,mBAAO,CAAC,kDAAQ;AAC9C,IAAI;AACJ;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,mEAAmE,eAAe;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,QAAQ,yBAAyB;;AAEjC;AACA,cAAc,GAAG;AACjB,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG;AACX,QAAQ,GAAG,IAAI;AACf,QAAQ,GAAG,IAAI;AACf;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH,EAAE;;AAEF;AACA;;AAEA,QAAQ,0BAA0B;AAClC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;ACxKF;AACA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qBAAqB;AACrB;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC7DF;AACA;AACA;AACA;AACA;;AAEA;AACA,OAAO,KAAyB;AAChC;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;;AAEF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;;AAEJ;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA,EAAE;;;;;;;;;;;AC3HF;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA,sCAAsC,mBAAO,CAAC,2DAAY;AAC1D,IAAI;AACJ;AACA;AACA;;AAEA,EAAE;AACF;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,oCAAoC;AAC/C,WAAW,oBAAoB;AAC/B,WAAW,UAAU;AACrB,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD,kBAAkB;AACpE;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA,WAAW,MAAM;AACjB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,WAAW;AACnB;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,WAAW,OAAO;AAClB;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAM;AACN;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,QAAQ;AACtC;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,QAAQ,aAAa;AACrB;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;;AC9UF;;;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO,KAAyB;AAChC;AACA;AACA;AACA,QAAQ,mBAAO,CAAC,2DAAY;AAC5B;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC;;AAED;;AAEA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,WAAW,QAAQ;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;AACA,IAAI;AACJ;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,WAAW,OAAO;AAClB,WAAW,eAAe;AAC1B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,kCAAkC;AAClC;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;;AAEA,EAAE;;;;;;;;;;;;AChSF;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;UAEA;UACA;;;;;WCzBA;WACA;WACA;WACA;WACA,+BAA+B,wCAAwC;WACvE;WACA;WACA;WACA;WACA,iBAAiB,qBAAqB;WACtC;WACA;WACA;WACA;WACA,kBAAkB,qBAAqB;WACvC;WACA;WACA,KAAK;WACL;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;;;;WC7BA;WACA;WACA;WACA;WACA;WACA,iCAAiC,WAAW;WAC5C;WACA;;;;;WCPA;WACA;WACA;WACA;WACA,yCAAyC,wCAAwC;WACjF;WACA;WACA;;;;;WCPA;;;;;WCAA;WACA;WACA;WACA,uDAAuD,iBAAiB;WACxE;WACA,gDAAgD,aAAa;WAC7D;;;;;WCNA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;;WAEA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA;WACA,MAAM,qBAAqB;WAC3B;WACA;WACA;WACA;WACA;WACA;WACA;WACA;;WAEA;WACA;WACA;;;;;UEnDA;UACA;UACA;UACA;UACA","sources":["webpack://flexiflick/./src/index.js","webpack://flexiflick/./node_modules/ev-emitter/ev-emitter.js","webpack://flexiflick/./node_modules/fizzy-ui-utils/utils.js","webpack://flexiflick/./node_modules/flickity/js/add-remove-cell.js","webpack://flexiflick/./node_modules/flickity/js/animate.js","webpack://flexiflick/./node_modules/flickity/js/cell.js","webpack://flexiflick/./node_modules/flickity/js/core.js","webpack://flexiflick/./node_modules/flickity/js/drag.js","webpack://flexiflick/./node_modules/flickity/js/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/js/index.js","webpack://flexiflick/./node_modules/flickity/js/lazyload.js","webpack://flexiflick/./node_modules/flickity/js/page-dots.js","webpack://flexiflick/./node_modules/flickity/js/player.js","webpack://flexiflick/./node_modules/flickity/js/prev-next-button.js","webpack://flexiflick/./node_modules/flickity/js/slide.js","webpack://flexiflick/./node_modules/get-size/get-size.js","webpack://flexiflick/./node_modules/imagesloaded/imagesloaded.js","webpack://flexiflick/./node_modules/flickity/dist/flickity.min.css?8fe7","webpack://flexiflick/./src/style.scss?75bd","webpack://flexiflick/./node_modules/unidragger/unidragger.js","webpack://flexiflick/external window \"React\"","webpack://flexiflick/external window [\"wp\",\"blockEditor\"]","webpack://flexiflick/external window [\"wp\",\"components\"]","webpack://flexiflick/external window [\"wp\",\"data\"]","webpack://flexiflick/external window [\"wp\",\"element\"]","webpack://flexiflick/external window [\"wp\",\"i18n\"]","webpack://flexiflick/webpack/bootstrap","webpack://flexiflick/webpack/runtime/chunk loaded","webpack://flexiflick/webpack/runtime/compat get default export","webpack://flexiflick/webpack/runtime/define property getters","webpack://flexiflick/webpack/runtime/hasOwnProperty shorthand","webpack://flexiflick/webpack/runtime/make namespace object","webpack://flexiflick/webpack/runtime/jsonp chunk loading","webpack://flexiflick/webpack/before-startup","webpack://flexiflick/webpack/startup","webpack://flexiflick/webpack/after-startup"],"sourcesContent":["import './style.scss';\nimport Flickity from 'flickity';\nimport 'flickity/dist/flickity.min.css';\nimport { useEffect, useState, useRef } from '@wordpress/element';\nimport { useSelect } from '@wordpress/data';\nimport { InspectorControls, useBlockProps } from '@wordpress/block-editor';\nimport { PanelBody, ToggleControl, TextControl, SelectControl  } from '@wordpress/components';\nimport { __ } from '@wordpress/i18n';\nimport metadata from './block.json';\n\nconst { registerBlockType } = wp.blocks;\n\n\nregisterBlockType(metadata.name, {\n    title: __('FlexiFlick Slider', 'flexiflick'),\n    icon: 'slides',\n    category: 'widgets',\n    attributes: {\n        sliderGroup: {\n            type: 'string',\n            default: '',\n        },\n        showArrows: {\n            type: 'boolean',\n            default: true,\n        },\n        showPager: {\n            type: 'boolean',\n            default: true,\n        },\n        draggable: {\n            type: 'boolean',\n            default: false,\n        },\n        wrapAround: {\n            type: 'boolean',\n            default: false,\n        },\n        freeScroll: {\n            type: 'boolean',\n            default: true,\n        },\n        pauseAutoPlayOnHover: {\n            type: 'boolean',\n            default: false,\n        },\n        autoPlay: {\n            type: 'number',   // Number input for autoPlay\n            default: 0,\n        },\n        minHeight: {\n            type: 'number',   // Number input for autoPlay\n            default: 450,\n        },\n    },\nedit({ attributes, setAttributes }) {\n    const blockProps = useBlockProps();\n    const sliderRef = useRef();\n\n    // Fetch the custom post type content\n    const posts = useSelect((select) => {\n        const fetchedPosts = select('core').getEntityRecords('postType', 'flexiflick_slide_cpt', {\n            per_page: 3, // Limit the number of posts for the preview\n            _embed: true, // Embed related resources, such as the featured media\n        });\n\n        if (fetchedPosts) {\n            return fetchedPosts.map((post) => ({\n                id: post.id,\n                title: post.title.rendered,\n                content: post.content.rendered, // Use the body content instead of the excerpt\n                featured_media_url: post._embedded?.['wp:featuredmedia']?.[0]?.source_url || '',\n            }));\n        }\n\n        return [];\n    }, []);\n\n    const [sliderGroups, setSliderGroups] = useState([]);\n\n    // Fetch available slider groups\n    useEffect(() => {\n            wp.apiFetch({ path: '/wp/v2/flexiflick_slider_group' }).then((groups) => {\n                setSliderGroups(groups.map((group) => ({\n                    label: group.name,\n                    value: group.id,\n                })));\n            });\n        }, []);\n\n    useEffect(() => {\n            // Initialize Flickity only if posts are loaded\n            if (posts.length > 0 && sliderRef.current) {\n                const flickityInstance = new Flickity(sliderRef.current, {\n                    prevNextButtons: attributes.showArrows,\n                    pageDots: attributes.showPager,\n                });\n\n                return () => {\n                    flickityInstance.destroy();\n                };\n            }\n        }, [attributes.showArrows, attributes.showPager, posts]);\n\n\n    return (\n        <div {...blockProps}>\n                <InspectorControls>\n                    <PanelBody title={__('Slider Settings', 'flexiflick')}>\n                        <ToggleControl\n                            label={__('Show Arrows', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. For example 1500 will advance cells every 1.5 seconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            checked={attributes.showArrows}\n                            onChange={(value) => setAttributes({ showArrows: value })}\n                        />\n                        <SelectControl\n                            label=\"Select Slider Group\"\n                            value={attributes.sliderGroup}\n                            options={[\n                                { label: 'Select a group', value: '' },\n                                ...sliderGroups,\n                            ]}\n                            onChange={(value) =>\n                                setAttributes({ sliderGroup: value })\n                            }\n                        />\n                        <ToggleControl\n                            label={__('Show Pager', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            checked={attributes.showPager}\n                            onChange={(value) => setAttributes({ showPager: value })}\n                        />\n                        <ToggleControl\n                            label={__('Wrap Around', 'flexiflick')}\n                            help={__('At the end of cells, wrap-around to the other end for infinite scrolling.', 'flexiflick')}\n                            checked={attributes.wrapAround}\n                            onChange={(value) => setAttributes({ wrapAround: value })}\n                        />\n                        <ToggleControl\n                            label={__('Draggable', 'flexiflick')}\n                            help={__('Enables dragging and flicking. Enabled by default when carousel has 2 or more slides. more detail can be found here https://flickity.metafizzy.co/options', 'flexiflick')}\n                            checked={attributes.draggable}\n                            onChange={(value) => setAttributes({ draggable: value })}\n                        />\n                        <ToggleControl\n                            label={__('Free Scroll', 'flexiflick')}\n                            help={__('Enables content to be freely scrolled and flicked without aligning cells to an end position.', 'flexiflick')}\n\n                            checked={attributes.freeScroll}\n                            onChange={(value) => setAttributes({ freeScroll: value })}\n                        />\n                        <ToggleControl\n                            label={__('Pause Auto Play On Hover', 'flexiflick')}\n                            help={__('Auto-playing will pause when the user hovers over the carousel.', 'flexiflick')}\n                            checked={attributes.pauseAutoPlayOnHover}\n                            onChange={(value) => setAttributes({ pauseAutoPlayOnHover: value })}\n                        />\n                        <TextControl\n                            label={__('AutoPlay Speed (ms)', 'flexiflick')}\n                            help={__('Enter the autoPlay speed in milliseconds. Set to 0 for no autoPlay.', 'flexiflick')}\n                            value={attributes.autoPlay}\n                            onChange={(autoPlay) => setAttributes({ autoPlay: parseInt(autoPlay) || 0 })}\n                            type=\"number\"\n                        />\n                        <TextControl\n                            label={__('Min Height (px)', 'flexiflick')}\n                            help={__('Enter the minimum height in pixels for slider', 'flexiflick')}\n                            value={attributes.minHeight}\n                            onChange={(minHeight) => setAttributes({ minHeight: parseInt(minHeight) || 450 })}\n                            type=\"number\"\n                        />\n                    </PanelBody>\n                </InspectorControls>\n                <div className=\"flickity-placeholder\">\n                    <div  ref={sliderRef}>\n                            <div className=\"flickity-placeholder-content\">\n                                <h3>Flickity Responsive Slider/Carousel</h3>\n                                {attributes.sliderGroup && (\n                                    <p>Selected Group ID: {attributes.sliderGroup}</p>\n                                )}\n                                <p>....................................</p>\n                                <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>\n                                <p>{`{ showPager: ${attributes.showPager ? 'True' : 'False'} }`}</p>\n                            </div>\n                    </div>\n                </div>\n            </div>\n    );\n    },\n    save() {\n        return null; // Rendered on the server.\n    },\n});\n","/**\n * EvEmitter v2.1.1\n * Lil' event emitter\n * MIT License\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\nfunction EvEmitter() {}\n\nlet proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // set events hash\n  let events = this._events = this._events || {};\n  // set listeners array\n  let listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( !listeners.includes( listener ) ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) return this;\n\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  let onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  let onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  let index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  let listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) return this;\n\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice( 0 );\n  args = args || [];\n  // once stuff\n  let onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( let listener of listeners ) {\n    let isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n  return this;\n};\n\nreturn EvEmitter;\n\n} ) );\n","/**\n * Fizzy UI utils v3.0.0\n * MIT license\n */\n\n( function( global, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( global );\n  } else {\n    // browser global\n    global.fizzyUIUtils = factory( global );\n  }\n\n}( this, function factory( global ) {\n\nlet utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  return Object.assign( a, b );\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) return [];\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  let index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( elem.matches( selector ) ) return elem;\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n\n  return elems\n    // check that elem is an actual element\n    .filter( ( elem ) => elem instanceof HTMLElement )\n    .reduce( ( ffElems, elem ) => {\n      // add elem if no selector\n      if ( !selector ) {\n        ffElems.push( elem );\n        return ffElems;\n      }\n      // filter & find items if we have a selector\n      // filter\n      if ( elem.matches( selector ) ) {\n        ffElems.push( elem );\n      }\n      // find children\n      let childElems = elem.querySelectorAll( selector );\n      // concat childElems to filterFound array\n      ffElems = ffElems.concat( ...childElems );\n      return ffElems;\n    }, [] );\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  let method = _class.prototype[ methodName ];\n  let timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    clearTimeout( this[ timeoutName ] );\n\n    let args = arguments;\n    this[ timeoutName ] = setTimeout( () => {\n      method.apply( this, args );\n      delete this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( onDocReady ) {\n  let readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( onDocReady );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', onDocReady );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://bit.ly/3oYLusc\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  } ).toLowerCase();\n};\n\nlet console = global.console;\n\n// allow user to initialize classes via [data-namespace] or .js-namespace class\n// htmlInit( Widget, 'widgetName' )\n// options are parsed from data-namespace-options\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    let dashedNamespace = utils.toDashed( namespace );\n    let dataAttr = 'data-' + dashedNamespace;\n    let dataAttrElems = document.querySelectorAll( `[${dataAttr}]` );\n    let jQuery = global.jQuery;\n\n    [ ...dataAttrElems ].forEach( ( elem ) => {\n      let attr = elem.getAttribute( dataAttr );\n      let options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( `Error parsing ${dataAttr} on ${elem.className}: ${error}` );\n        }\n        return;\n      }\n      // initialize\n      let instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    } );\n\n  } );\n};\n\n// -----  ----- //\n\nreturn utils;\n\n} ) );\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  let fragment = document.createDocumentFragment();\n  cells.forEach( ( cell ) => fragment.appendChild( cell.element ) );\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nlet proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {[Element, Array, NodeList]} elems - Elements to insert\n * @param {Integer} index - Zero-based number to insert\n */\nproto.insert = function( elems, index ) {\n  let cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  let fragment = getCellsFragment( cells );\n  // append to slider\n  let isAppend = index === len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    let insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    let endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index );\n  this.positionSliderAtSelected();\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {[Element, Array, NodeList]} elems - ELements to remove\n */\nproto.remove = function( elems ) {\n  let cells = this.getCells( elems );\n  if ( !cells || !cells.length ) return;\n\n  let minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( ( cell ) => {\n    cell.remove();\n    let index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  } );\n\n  this.cellChange( minCellIndex );\n  this.positionSliderAtSelected();\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  let cell = this.getCell( elem );\n  if ( !cell ) return;\n\n  cell.getSize();\n\n  let index = this.cells.indexOf( cell );\n  this.cellChange( index );\n  // do not position slider after lazy load\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex ) {\n  let prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex, try to maintain position & select previous selected element\n  let cell = this.getCell( prevSelectedElem );\n  if ( cell ) this.selectedIndex = this.getCellSlideIndex( cell );\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('fizzy-ui-utils') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory( window.fizzyUIUtils );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( utils ) {\n\n// -------------------------- animate -------------------------- //\n\nlet proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) return;\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  let previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) requestAnimationFrame( () => this.animate() );\n};\n\nproto.positionSlider = function() {\n  let x = this.x;\n  // wrap position around\n  if ( this.isWrapping ) {\n    x = utils.modulo( x, this.slideableWidth ) - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  this.setTranslateX( x, this.isAnimating );\n  this.dispatchScrollEvent();\n};\n\nproto.setTranslateX = function( x, is3d ) {\n  x += this.cursorPosition;\n  // reverse if right-to-left and using transform\n  if ( this.options.rightToLeft ) x = -x;\n  let translateX = this.getPositionValue( x );\n  // use 3D transforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = is3d ?\n    `translate3d(${translateX},0,0)` : `translateX(${translateX})`;\n};\n\nproto.dispatchScrollEvent = function() {\n  let firstSlide = this.slides[0];\n  if ( !firstSlide ) return;\n\n  let positionX = -this.x - firstSlide.target;\n  let progress = positionX / this.slidesWidth;\n  this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) return;\n\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 ) + '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  let isResting = !this.isPointerDown &&\n      Math.round( this.x * 100 ) === Math.round( previousX * 100 );\n  if ( isResting ) this.restingFrames++;\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  let beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  let afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  cells.forEach( ( cell ) => {\n    let cellShift = gap > 0 ? shift : 0;\n    this._wrapShiftCell( cell, cellShift );\n    gap -= cell.size.outerWidth;\n  } );\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) return;\n\n  cells.forEach( ( cell ) => this._wrapShiftCell( cell, 0 ) );\n};\n\n// @param {Integer} shift - 0, 1, or -1\nproto._wrapShiftCell = function( cell, shift ) {\n  this._renderCellPosition( cell, cell.x + this.slideableWidth * shift );\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) return;\n\n  // change the position to drag position by applying force\n  let dragVelocity = this.dragX - this.x;\n  let dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  let dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) return;\n\n  let distance = this.selectedSlide.target * -1 - this.x;\n  let force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n} ) );\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('get-size') );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory( window.getSize );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( getSize ) {\n\nconst cellClassName = 'flickity-cell';\n\nfunction Cell( elem ) {\n  this.element = elem;\n  this.element.classList.add( cellClassName );\n\n  this.x = 0;\n  this.unselect();\n}\n\nlet proto = Cell.prototype;\n\nproto.destroy = function() {\n  // reset style\n  this.unselect();\n  this.element.classList.remove( cellClassName );\n  this.element.style.transform = '';\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.select = function() {\n  this.element.classList.add('is-selected');\n  this.element.removeAttribute('aria-hidden');\n};\n\nproto.unselect = function() {\n  this.element.classList.remove('is-selected');\n  this.element.setAttribute( 'aria-hidden', 'true' );\n};\n\nproto.remove = function() {\n  this.element.remove();\n};\n\nreturn Cell;\n\n} ) );\n","// Flickity main\n/* eslint-disable max-params */\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n        require('get-size'),\n        require('fizzy-ui-utils'),\n        require('./cell'),\n        require('./slide'),\n        require('./animate'),\n    );\n  } else {\n    // browser global\n    let _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n        window,\n        window.EvEmitter,\n        window.getSize,\n        window.fizzyUIUtils,\n        _Flickity.Cell,\n        _Flickity.Slide,\n        _Flickity.animatePrototype,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n/* eslint-enable max-params */\n\n// vars\nconst { getComputedStyle, console } = window;\nlet { jQuery } = window;\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nlet GUID = 0;\n// internal store of all Flickity intances\nlet instances = {};\n\nfunction Flickity( element, options ) {\n  let queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) console.error(`Bad element for Flickity: ${queryElement || element}`);\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    let instance = instances[ this.element.flickityGUID ];\n    if ( instance ) instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = { ...this.constructor.defaults };\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true,\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.create = {};\n\nlet proto = Flickity.prototype;\n// inherit EventEmitter\nObject.assign( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  let { resize, watchCSS, rightToLeft } = this.options;\n  // add id for Flickity.data\n  let id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.beginMargin = rightToLeft ? 'marginRight' : 'marginLeft';\n  this.endMargin = rightToLeft ? 'marginLeft' : 'marginRight';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n  // used for keyboard navigation\n  this.focusableElems = [ this.element ];\n\n  if ( resize || watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( let eventName in this.options.on ) {\n    let listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  for ( let method in Flickity.create ) {\n    Flickity.create[ method ].call( this );\n  }\n\n  if ( watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n};\n\n/**\n * set options\n * @param {Object} opts - options to extend\n */\nproto.option = function( opts ) {\n  Object.assign( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) return;\n\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  let cellElems = this._filterFindCellElements( this.element.children );\n  this.slider.append( ...cellElems );\n  this.viewport.append( this.slider );\n  this.element.append( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n  this.selectInitialIndex();\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  let slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {[Array, NodeList, HTMLElement]} elems - elements to make into cells\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  let cellElems = this._filterFindCellElements( elems );\n\n  // create new Cells for collection\n  return cellElems.map( ( cellElem ) => new Cell( cellElem ) );\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  let cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    let startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n\n  this.cells.slice( index ).forEach( ( cell ) => {\n    cell.x = cellX;\n    this._renderCellPosition( cell, cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  } );\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = this.cells.length ?\n    this.getLastSlide().target - this.slides[0].target : 0;\n};\n\nproto._renderCellPosition = function( cell, x ) {\n  // render position of cell with in slider\n  let sideOffset = this.options.rightToLeft ? -1 : 1;\n  let renderX = x * sideOffset;\n  if ( this.options.percentPosition ) renderX *= this.size.innerWidth / cell.size.width;\n  let positionValue = this.getPositionValue( renderX );\n  cell.element.style.transform = `translateX( ${positionValue} )`;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells - cells to size\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( ( cell ) => cell.getSize() );\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) return;\n\n  let { beginMargin, endMargin } = this;\n  let slide = new Slide( beginMargin, endMargin, this.cellAlign );\n  this.slides.push( slide );\n\n  let canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( ( cell, i ) => {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    let slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ endMargin ] );\n\n    if ( canCellFit( i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( beginMargin, endMargin, this.cellAlign );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  } );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  let { groupCells } = this.options;\n  if ( !groupCells ) return () => false;\n\n  if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    let number = parseInt( groupCells, 10 );\n    return ( i ) => ( i % number ) !== 0;\n  }\n  // default, group by width of slide\n  let percent = 1;\n  // parse '75%\n  let percentMatch = typeof groupCells == 'string' && groupCells.match( /^(\\d+)%$/ );\n  if ( percentMatch ) percent = parseInt( percentMatch[1], 10 ) / 100;\n  let groupWidth = ( this.size.innerWidth + 1 ) * percent;\n  return ( i, slideWidth ) => slideWidth <= groupWidth;\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nlet cellAlignShorthands = {\n  left: 0,\n  center: 0.5,\n  right: 1,\n};\n\nproto.setCellAlign = function() {\n  let { cellAlign, rightToLeft } = this.options;\n  let shorthand = cellAlignShorthands[ cellAlign ];\n  this.cellAlign = shorthand !== undefined ? shorthand : cellAlign;\n  if ( rightToLeft ) this.cellAlign = 1 - this.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( !this.options.setGallerySize ) return;\n\n  let height = this.options.adaptiveHeight && this.selectedSlide ?\n    this.selectedSlide.height : this.maxCellHeight;\n  this.viewport.style.height = `${height}px`;\n};\n\nproto._updateWrapShiftCells = function() {\n  // update isWrapping\n  this.isWrapping = this.getIsWrapping();\n  // only for wrap-around\n  if ( !this.isWrapping ) return;\n\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  let beforeGapX = this.cursorPosition;\n  let lastIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( beforeGapX, lastIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  let afterGapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( afterGapX, 0, 1 );\n};\n\nproto.getIsWrapping = function() {\n  let { wrapAround } = this.options;\n  if ( !wrapAround || this.slides.length < 2 ) return false;\n\n  if ( wrapAround !== 'fill' ) return true;\n  // check that slides can fit\n\n  let gapWidth = this.slideableWidth - this.size.innerWidth;\n  if ( gapWidth > this.size.innerWidth ) return true; // gap * 2x big, all good\n  // check that content width - shifting cell is bigger than viewport width\n  for ( let cell of this.cells ) {\n    if ( cell.size.outerWidth > gapWidth ) return false;\n  }\n  return true;\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  let cells = [];\n  while ( gapX > 0 ) {\n    let cell = this.cells[ cellIndex ];\n    if ( !cell ) break;\n\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain & wrap ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  let isContaining = this.options.contain && !this.isWrapping &&\n      this.cells.length;\n  if ( !isContaining ) return;\n\n  let contentWidth = this.slideableWidth - this.getLastCell().size[ this.endMargin ];\n  // content is less than gallery size\n  let isContentSmaller = contentWidth < this.size.innerWidth;\n  if ( isContentSmaller ) {\n    // all cells fit inside gallery\n    this.slides.forEach( ( slide ) => {\n      slide.target = contentWidth * this.cellAlign;\n    } );\n  } else {\n    // contain to bounds\n    let beginBound = this.cursorPosition + this.cells[0].size[ this.beginMargin ];\n    let endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n    this.slides.forEach( ( slide ) => {\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    } );\n  }\n};\n\n// ----- events ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  let emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    let $event = type;\n    if ( event ) {\n      // create jQuery event\n      let jQEvent = new jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\nconst unidraggerEvents = [\n  'dragStart',\n  'dragMove',\n  'dragEnd',\n  'pointerDown',\n  'pointerMove',\n  'pointerEnd',\n  'staticClick',\n];\n\nlet _emitEvent = proto.emitEvent;\nproto.emitEvent = function( eventName, args ) {\n  if ( eventName === 'staticClick' ) {\n    // add cellElem and cellIndex args to staticClick\n    let clickedCell = this.getParentCell( args[0].target );\n    let cellElem = clickedCell && clickedCell.element;\n    let cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n    args = args.concat( cellElem, cellIndex );\n  }\n  // do regular thing\n  _emitEvent.call( this, eventName, args );\n  // duck-punch in jQuery events for Unidragger events\n  let isUnidraggerEvent = unidraggerEvents.includes( eventName );\n  if ( !isUnidraggerEvent || !jQuery || !this.$element ) return;\n\n  eventName += this.options.namespaceJQueryEvents ? '.flickity' : '';\n  let event = args.shift( 0 );\n  let jQEvent = new jQuery.Event( event );\n  jQEvent.type = eventName;\n  this.$element.trigger( jQEvent, args );\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) return;\n\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.isWrapping || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) return;\n\n  let prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index !== prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  if ( !this.isWrapping ) return;\n\n  const { selectedIndex, slideableWidth, slides: { length } } = this;\n  // shift index for wrap, do not wrap dragSelect\n  if ( !this.isDragSelect ) {\n    let wrapIndex = utils.modulo( index, length );\n    // go to shortest\n    let delta = Math.abs( wrapIndex - selectedIndex );\n    let backWrapDelta = Math.abs( ( wrapIndex + length ) - selectedIndex );\n    let forewardWrapDelta = Math.abs( ( wrapIndex - length ) - selectedIndex );\n    if ( backWrapDelta < delta ) {\n      index += length;\n    } else if ( forewardWrapDelta < delta ) {\n      index -= length;\n    }\n  }\n\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= slideableWidth;\n  } else if ( index >= length ) {\n    this.x += slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  let slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) return;\n\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) this.selectedSlide.unselect();\n};\n\nproto.selectInitialIndex = function() {\n  let initialIndex = this.options.initialIndex;\n  // already activated, select previous selectedIndex\n  if ( this.isInitActivated ) {\n    this.select( this.selectedIndex, false, true );\n    return;\n  }\n  // select with selector string\n  if ( initialIndex && typeof initialIndex == 'string' ) {\n    let cell = this.queryCell( initialIndex );\n    if ( cell ) {\n      this.selectCell( initialIndex, false, true );\n      return;\n    }\n  }\n\n  let index = 0;\n  // select with number\n  if ( initialIndex && this.slides[ initialIndex ] ) {\n    index = initialIndex;\n  }\n  // select instantly\n  this.select( index, false, true );\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, Number]} value - zero-based index or element to select\n * @param {Boolean} isWrap - enables wrapping around for extra index\n * @param {Boolean} isInstant - disables slide animation\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  let cell = this.queryCell( value );\n  if ( !cell ) return;\n\n  let index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slide that has cell\n  let cellSlide = this.slides.find( ( slide ) => slide.cells.includes( cell ) );\n  return this.slides.indexOf( cellSlide );\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem - matching cell element\n * @returns {Flickity.Cell} cell - matching cell\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( let cell of this.cells ) {\n    if ( cell.element === elem ) return cell;\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {[Element, Array, NodeList]} elems - multiple elements\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  return elems.map( ( elem ) => this.getCell( elem ) ).filter( Boolean );\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem - child element\n * @returns {Flickit.Cell} cell - parent cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  let cell = this.getCell( elem );\n  if ( cell ) return cell;\n\n  // try to get parent cell elem\n  let closest = elem.closest('.flickity-slider > *');\n  return this.getCell( closest );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) return this.selectedSlide.getCellElements();\n\n  index = index === undefined ? this.selectedIndex : index;\n\n  let len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements(); // get all\n  }\n\n  let cellElems = [];\n  for ( let i = index - adjCount; i <= index + adjCount; i++ ) {\n    let slideIndex = this.isWrapping ? utils.modulo( i, len ) : i;\n    let slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {[Element, String, Number]} selector - element, selector string, or index\n * @returns {Flickity.Cell} - matching cell\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  // do not select invalid selectors from hash: #123, #/. #791\n  let isSelectorString = typeof selector == 'string' && !selector.match( /^[#.]?[\\d/]/ );\n  if ( isSelectorString ) {\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  // #1177 disable resize behavior when animating or dragging for iOS 15\n  if ( !this.isActive || this.isAnimating || this.isDragging ) return;\n  this.getSize();\n  // wrap values\n  if ( this.isWrapping ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._updateWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  let selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  if ( !this.options.watchCSS ) return;\n\n  let afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.includes('flickity') ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  let { activeElement } = document;\n  let handler = Flickity.keyboardHandlers[ event.key ];\n  // only work if element is in focus\n  if ( !this.options.accessibility || !activeElement || !handler ) return;\n\n  let isFocused = this.focusableElems.some( ( elem ) => activeElement === elem );\n  if ( isFocused ) handler.call( this );\n};\n\nFlickity.keyboardHandlers = {\n  ArrowLeft: function() {\n    this.uiChange();\n    let leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this[ leftMethod ]();\n  },\n  ArrowRight: function() {\n    this.uiChange();\n    let rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  this.element.focus({ preventScroll: true });\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) return;\n\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( ( cell ) => cell.destroy() );\n  this.viewport.remove();\n  // move child elements back into element\n  this.element.append( ...this.slider.children );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.allOff();\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nObject.assign( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {[Element, String]} elem - element or selector string\n * @returns {Flickity} - Flickity instance\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  if ( elem ) return instances[ elem.flickityGUID ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nlet { jQueryBridget } = window;\nif ( jQuery && jQueryBridget ) {\n  jQueryBridget( 'flickity', Flickity, jQuery );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\nFlickity.Slide = Slide;\n\nreturn Flickity;\n\n} ) );\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('./core'),\n        require('unidragger'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n        window,\n        window.Flickity,\n        window.Unidragger,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( window, Flickity, Unidragger, utils ) {\n\n// ----- defaults ----- //\n\nObject.assign( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n} );\n\n// -------------------------- drag prototype -------------------------- //\n\nlet proto = Flickity.prototype;\nObject.assign( proto, Unidragger.prototype ); // inherit Unidragger\nproto.touchActionValue = '';\n\n// --------------------------  -------------------------- //\n\nFlickity.create.drag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'deactivate', this.onDeactivateDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  this.on( 'pointerDown', this.handlePointerDown );\n  this.on( 'pointerUp', this.handlePointerUp );\n  this.on( 'pointerDown', this.handlePointerDone );\n  this.on( 'dragStart', this.handleDragStart );\n  this.on( 'dragMove', this.handleDragMove );\n  this.on( 'dragEnd', this.handleDragEnd );\n  this.on( 'staticClick', this.handleStaticClick );\n  // TODO updateDraggable on resize? if groupCells & slides change\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable === '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  this.element.classList.toggle( 'is-draggable', this.isDraggable );\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.handlePointerDown = function( event ) {\n  if ( !this.isDraggable ) {\n    // proceed for staticClick\n    this.bindActivePointerEvents( event );\n    return;\n  }\n\n  let isTouchStart = event.type === 'touchstart';\n  let isTouchPointer = event.pointerType === 'touch';\n  let isFocusNode = event.target.matches('input, textarea, select');\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) event.preventDefault();\n  if ( !isFocusNode ) this.focus();\n  // blur\n  if ( document.activeElement !== this.element ) document.activeElement.blur();\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n  this.bindActivePointerEvents( event );\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.handlePointerUp = function() {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n};\n\nproto.handlePointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.handleDragStart = function() {\n  if ( !this.isDraggable ) return;\n\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n};\n\nproto.handleDragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) return;\n\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  let direction = this.options.rightToLeft ? -1 : 1;\n  // wrap around move. #589\n  if ( this.isWrapping ) moveVector.x %= this.slideableWidth;\n  let dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.isWrapping ) {\n    // slow drag\n    let originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    let endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n  this.dragMoveTime = new Date();\n};\n\nproto.handleDragEnd = function() {\n  if ( !this.isDraggable ) return;\n\n  let { freeScroll } = this.options;\n  if ( freeScroll ) this.isFreeScrolling = true;\n  // set selectedIndex based on where flick will end up\n  let index = this.dragEndRestingSelect();\n\n  if ( freeScroll && !this.isWrapping ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    let restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !freeScroll && index === this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.isWrapping;\n  this.select( index );\n  delete this.isDragSelect;\n};\n\nproto.dragEndRestingSelect = function() {\n  let restingX = this.getRestingPosition();\n  // how far away from selected slide\n  let distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  let positiveResting = this._getClosestResting( restingX, distance, 1 );\n  let negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  return positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  let index = this.selectedIndex;\n  let minDistance = Infinity;\n  let condition = this.options.contain && !this.isWrapping ?\n    // if containing, keep going if distance is equal to minDistance\n    ( dist, minDist ) => dist <= minDist :\n    ( dist, minDist ) => dist < minDist;\n\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) break;\n\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment,\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x - horizontal position\n * @param {Integer} index - slide index\n * @returns {Number} - slide distance\n */\nproto.getSlideDistance = function( x, index ) {\n  let len = this.slides.length;\n  // wrap around if at least 2 slides\n  let isWrapAround = this.options.wrapAround && len > 1;\n  let slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  let slide = this.slides[ slideIndex ];\n  if ( !slide ) return null;\n\n  // add distance for wrap-around slides\n  let wrap = isWrapAround ? this.slideableWidth * Math.floor( index/len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  let distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  let delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  let scroll = getScrollPosition();\n  let scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  let scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this.pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset,\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n} ) );\n","// imagesloaded\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('imagesloaded'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.imagesLoaded,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this,\n    function factory( Flickity, imagesLoaded ) {\n\nFlickity.create.imagesLoaded = function() {\n  this.on( 'activate', this.imagesLoaded );\n};\n\nFlickity.prototype.imagesLoaded = function() {\n  if ( !this.options.imagesLoaded ) return;\n\n  let onImagesLoadedProgress = ( instance, image ) => {\n    let cell = this.getParentCell( image.img );\n    this.cellSizeChange( cell && cell.element );\n    if ( !this.options.freeScroll ) this.positionSliderAtSelected();\n  };\n  imagesLoaded( this.slider ).on( 'progress', onImagesLoadedProgress );\n};\n\nreturn Flickity;\n\n} ) );\n","/*!\n * Flickity v3.0.0\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2022 Metafizzy\n */\n\nif ( typeof module == 'object' && module.exports ) {\n  const Flickity = require('./core');\n  require('./drag');\n  require('./prev-next-button');\n  require('./page-dots');\n  require('./player');\n  require('./add-remove-cell');\n  require('./lazyload');\n  require('./imagesloaded');\n\n  module.exports = Flickity;\n}\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\nconst lazyAttr = 'data-flickity-lazyload';\nconst lazySrcAttr = `${lazyAttr}-src`;\nconst lazySrcsetAttr = `${lazyAttr}-srcset`;\nconst imgSelector = `img[${lazyAttr}], img[${lazySrcAttr}], ` +\n  `img[${lazySrcsetAttr}], source[${lazySrcsetAttr}]`;\n\nFlickity.create.lazyLoad = function() {\n  this.on( 'select', this.lazyLoad );\n\n  this.handleLazyLoadComplete = this.onLazyLoadComplete.bind( this );\n};\n\nlet proto = Flickity.prototype;\n\nproto.lazyLoad = function() {\n  let { lazyLoad } = this.options;\n  if ( !lazyLoad ) return;\n\n  // get adjacent cells, use lazyLoad option for adjacent count\n  let adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  // lazy load images\n  this.getAdjacentCellElements( adjCount )\n    .map( getCellLazyImages )\n    .flat()\n    .forEach( ( img ) => new LazyLoader( img, this.handleLazyLoadComplete ) );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.matches('img') ) {\n    let cellAttr = cellElem.getAttribute( lazyAttr );\n    let cellSrcAttr = cellElem.getAttribute( lazySrcAttr );\n    let cellSrcsetAttr = cellElem.getAttribute( lazySrcsetAttr );\n    if ( cellAttr || cellSrcAttr || cellSrcsetAttr ) {\n      return cellElem;\n    }\n  }\n  // select lazy images in cell\n  return [ ...cellElem.querySelectorAll( imgSelector ) ];\n}\n\nproto.onLazyLoadComplete = function( img, event ) {\n  let cell = this.getParentCell( img );\n  let cellElem = cell && cell.element;\n  this.cellSizeChange( cellElem );\n\n  this.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n * @param {Image} img - Image element\n * @param {Function} onComplete - callback function\n */\nfunction LazyLoader( img, onComplete ) {\n  this.img = img;\n  this.onComplete = onComplete;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  let src = this.img.getAttribute( lazyAttr ) ||\n    this.img.getAttribute( lazySrcAttr );\n  let srcset = this.img.getAttribute( lazySrcsetAttr );\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) this.img.setAttribute( 'srcset', srcset );\n  // remove attr\n  this.img.removeAttribute( lazyAttr );\n  this.img.removeAttribute( lazySrcAttr );\n  this.img.removeAttribute( lazySrcsetAttr );\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n  let mediaElem = this.img.parentNode.matches('picture') ? this.img.parentNode : this.img;\n  mediaElem.classList.add( className );\n\n  this.onComplete( this.img, event );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n} ) );\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        require('./core'),\n        require('fizzy-ui-utils'),\n    );\n  } else {\n    // browser global\n    factory(\n        window.Flickity,\n        window.fizzyUIUtils,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\nfunction PageDots() {\n  // create holder element\n  this.holder = document.createElement('div');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n}\n\nPageDots.prototype.setDots = function( slidesLength ) {\n  // get difference between number of slides and number of dots\n  let delta = slidesLength - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  let newDots = new Array( count ).fill()\n    .map( ( item, i ) => {\n      let dot = document.createElement('button');\n      dot.setAttribute( 'type', 'button' );\n      let num = i + 1 + this.dots.length;\n      dot.className = 'flickity-page-dot';\n      dot.textContent = `View slide ${num}`;\n      return dot;\n    } );\n\n  this.holder.append( ...newDots );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  let removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( ( dot ) => dot.remove() );\n};\n\nPageDots.prototype.updateSelected = function( index ) {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.classList.remove('is-selected');\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) return;\n\n  this.selectedDot = this.dots[ index ];\n  this.selectedDot.classList.add('is-selected');\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pageDots: true,\n} );\n\nFlickity.create.pageDots = function() {\n  if ( !this.options.pageDots ) return;\n\n  this.pageDots = new PageDots();\n  this.handlePageDotsClick = this.onPageDotsClick.bind( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePageDots = function() {\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n  this.pageDots.holder.addEventListener( 'click', this.handlePageDotsClick );\n  this.element.append( this.pageDots.holder );\n};\n\nproto.onPageDotsClick = function( event ) {\n  let index = this.pageDots.dots.indexOf( event.target );\n  if ( index === -1 ) return; // only dot clicks\n\n  this.uiChange();\n  this.select( index );\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected( this.selectedIndex );\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.dots.forEach( ( dot ) => {\n    utils.removeFrom( this.focusableElems, dot );\n  } );\n  this.pageDots.setDots( this.slides.length );\n  this.focusableElems.push( ...this.pageDots.dots );\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.holder.remove();\n  this.pageDots.holder.removeEventListener( 'click', this.handlePageDotsClick );\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n} ) );\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( autoPlay, onTick ) {\n  this.autoPlay = autoPlay;\n  this.onTick = onTick;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state === 'playing' ) return;\n\n  // do not play if page is hidden, start playing when page is visible\n  let isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state !== 'playing' ) return;\n\n  // default to 3 seconds\n  let time = typeof this.autoPlay == 'number' ? this.autoPlay : 3000;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( () => {\n    this.onTick();\n    this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state === 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state === 'paused' ) this.play();\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  let isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  pauseAutoPlayOnHover: true,\n} );\n\nFlickity.create.player = function() {\n  this.player = new Player( this.options.autoPlay, () => {\n    this.next( true );\n  } );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nlet proto = Flickity.prototype;\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) return;\n\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) return;\n\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n} ) );\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( require('./core') );\n  } else {\n    // browser global\n    factory( window.Flickity );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( Flickity ) {\n\nconst svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( increment, direction, arrowShape ) {\n  this.increment = increment;\n  this.direction = direction;\n  this.isPrevious = increment === 'previous';\n  this.isLeft = direction === 'left';\n  this._create( arrowShape );\n}\n\nPrevNextButton.prototype._create = function( arrowShape ) {\n  // properties\n  let element = this.element = document.createElement('button');\n  element.className = `flickity-button flickity-prev-next-button ${this.increment}`;\n  let label = this.isPrevious ? 'Previous' : 'Next';\n  // prevent button from submitting form https://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  element.setAttribute( 'aria-label', label );\n  // init as disabled\n  this.disable();\n  // create arrow\n  let svg = this.createSVG( label, arrowShape );\n  element.append( svg );\n};\n\nPrevNextButton.prototype.createSVG = function( label, arrowShape ) {\n  let svg = document.createElementNS( svgURI, 'svg' );\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  // add title #1189\n  let title = document.createElementNS( svgURI, 'title' );\n  title.append( label );\n  // add path\n  let path = document.createElementNS( svgURI, 'path' );\n  let pathMovements = getArrowMovements( arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180)' );\n  }\n  svg.append( title, path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) return shape;\n\n  let { x0, x1, x2, x3, y1, y2 } = shape;\n\n  // create movement string\n  return `M ${x0}, 50\n    L ${x1}, ${y1 + 50}\n    L ${x2}, ${y2 + 50}\n    L ${x3}, 50\n    L ${x2}, ${50 - y2}\n    L ${x1}, ${50 - y1}\n    Z`;\n}\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  this.element.removeAttribute('disabled');\n};\n\nPrevNextButton.prototype.disable = function() {\n  this.element.setAttribute( 'disabled', true );\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nObject.assign( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30,\n  },\n} );\n\nFlickity.create.prevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) return;\n\n  let { rightToLeft, arrowShape } = this.options;\n  let prevDirection = rightToLeft ? 'right' : 'left';\n  let nextDirection = rightToLeft ? 'left' : 'right';\n  this.prevButton = new PrevNextButton( 'previous', prevDirection, arrowShape );\n  this.nextButton = new PrevNextButton( 'next', nextDirection, arrowShape );\n  this.focusableElems.push( this.prevButton.element );\n  this.focusableElems.push( this.nextButton.element );\n\n  this.handlePrevButtonClick = () => {\n    this.uiChange();\n    this.previous();\n  };\n\n  this.handleNextButtonClick = () => {\n    this.uiChange();\n    this.next();\n  };\n\n  this.on( 'activate', this.activatePrevNextButtons );\n  this.on( 'select', this.updatePrevNextButtons );\n};\n\nlet proto = Flickity.prototype;\n\nproto.updatePrevNextButtons = function() {\n  let lastIndex = this.slides.length ? this.slides.length - 1 : 0;\n  this.updatePrevNextButton( this.prevButton, 0 );\n  this.updatePrevNextButton( this.nextButton, lastIndex );\n};\n\nproto.updatePrevNextButton = function( button, disabledIndex ) {\n  // enable is wrapAround and at least 2 slides\n  if ( this.isWrapping && this.slides.length > 1 ) {\n    button.enable();\n    return;\n  }\n\n  let isEnabled = this.selectedIndex !== disabledIndex;\n  button[ isEnabled ? 'enable' : 'disable' ]();\n  // if disabling button that is focused,\n  // shift focus to element to maintain keyboard accessibility\n  let isDisabledFocused = !isEnabled && document.activeElement === button.element;\n  if ( isDisabledFocused ) this.focus();\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.element.addEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.addEventListener( 'click', this.handleNextButtonClick );\n  this.element.append( this.prevButton.element, this.nextButton.element );\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.element.remove();\n  this.nextButton.element.remove();\n  this.prevButton.element.removeEventListener( 'click', this.handlePrevButtonClick );\n  this.nextButton.element.removeEventListener( 'click', this.handleNextButtonClick );\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n} ) );\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory() {\n\nfunction Slide( beginMargin, endMargin, cellAlign ) {\n  this.beginMargin = beginMargin;\n  this.endMargin = endMargin;\n  this.cellAlign = cellAlign;\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nlet proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length === 1 ) {\n    this.x = cell.x; // x comes from first cell\n    this.firstMargin = cell.size[ this.beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  let lastCell = this.getLastCell();\n  let lastMargin = lastCell ? lastCell.size[ this.endMargin ] : 0;\n  let slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.cells.forEach( ( cell ) => cell.select() );\n};\n\nproto.unselect = function() {\n  this.cells.forEach( ( cell ) => cell.unselect() );\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( ( cell ) => cell.element );\n};\n\nreturn Slide;\n\n} ) );\n","/*!\n * Infinite Scroll v2.0.4\n * measure size of elements\n * MIT license\n */\n\n( function( window, factory ) {\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n} )( window, function factory() {\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  let num = parseFloat( value );\n  // not a percent like '100%', and a number\n  let isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\n// -------------------------- measurements -------------------------- //\n\nlet measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth',\n];\n\nlet measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  let size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0,\n  };\n  measurements.forEach( ( measurement ) => {\n    size[ measurement ] = 0;\n  } );\n  return size;\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) elem = document.querySelector( elem );\n\n  // do not proceed on non-objects\n  let isElement = elem && typeof elem == 'object' && elem.nodeType;\n  if ( !isElement ) return;\n\n  let style = getComputedStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) return getZeroSize();\n\n  let size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  let isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  measurements.forEach( ( measurement ) => {\n    let value = style[ measurement ];\n    let num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  } );\n\n  let paddingWidth = size.paddingLeft + size.paddingRight;\n  let paddingHeight = size.paddingTop + size.paddingBottom;\n  let marginWidth = size.marginLeft + size.marginRight;\n  let marginHeight = size.marginTop + size.marginBottom;\n  let borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  let borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  // overwrite width and height if we can get it from style\n  let styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingWidth + borderWidth );\n  }\n\n  let styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBox ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n} );\n","/*!\n * imagesLoaded v5.0.0\n * JavaScript is all like \"You images are done yet or what?\"\n * MIT License\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory( window, require('ev-emitter') );\n  } else {\n    // browser global\n    window.imagesLoaded = factory( window, window.EvEmitter );\n  }\n\n} )( typeof window !== 'undefined' ? window : this,\n    function factory( window, EvEmitter ) {\n\nlet $ = window.jQuery;\nlet console = window.console;\n\n// -------------------------- helpers -------------------------- //\n\n// turn element or nodeList into an array\nfunction makeArray( obj ) {\n  // use object if already an array\n  if ( Array.isArray( obj ) ) return obj;\n\n  let isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  // convert nodeList to array\n  if ( isArrayLike ) return [ ...obj ];\n\n  // array of single index\n  return [ obj ];\n}\n\n// -------------------------- imagesLoaded -------------------------- //\n\n/**\n * @param {[Array, Element, NodeList, String]} elem\n * @param {[Object, Function]} options - if function, use as callback\n * @param {Function} onAlways - callback function\n * @returns {ImagesLoaded}\n */\nfunction ImagesLoaded( elem, options, onAlways ) {\n  // coerce ImagesLoaded() without new, to be new ImagesLoaded()\n  if ( !( this instanceof ImagesLoaded ) ) {\n    return new ImagesLoaded( elem, options, onAlways );\n  }\n  // use elem as selector string\n  let queryElem = elem;\n  if ( typeof elem == 'string' ) {\n    queryElem = document.querySelectorAll( elem );\n  }\n  // bail if bad element\n  if ( !queryElem ) {\n    console.error(`Bad element for imagesLoaded ${queryElem || elem}`);\n    return;\n  }\n\n  this.elements = makeArray( queryElem );\n  this.options = {};\n  // shift arguments if no options set\n  if ( typeof options == 'function' ) {\n    onAlways = options;\n  } else {\n    Object.assign( this.options, options );\n  }\n\n  if ( onAlways ) this.on( 'always', onAlways );\n\n  this.getImages();\n  // add jQuery Deferred object\n  if ( $ ) this.jqDeferred = new $.Deferred();\n\n  // HACK check async to allow time to bind listeners\n  setTimeout( this.check.bind( this ) );\n}\n\nImagesLoaded.prototype = Object.create( EvEmitter.prototype );\n\nImagesLoaded.prototype.getImages = function() {\n  this.images = [];\n\n  // filter & find items if we have an item selector\n  this.elements.forEach( this.addElementImages, this );\n};\n\nconst elementNodeTypes = [ 1, 9, 11 ];\n\n/**\n * @param {Node} elem\n */\nImagesLoaded.prototype.addElementImages = function( elem ) {\n  // filter siblings\n  if ( elem.nodeName === 'IMG' ) {\n    this.addImage( elem );\n  }\n  // get background image on element\n  if ( this.options.background === true ) {\n    this.addElementBackgroundImages( elem );\n  }\n\n  // find children\n  // no non-element nodes, #143\n  let { nodeType } = elem;\n  if ( !nodeType || !elementNodeTypes.includes( nodeType ) ) return;\n\n  let childImgs = elem.querySelectorAll('img');\n  // concat childElems to filterFound array\n  for ( let img of childImgs ) {\n    this.addImage( img );\n  }\n\n  // get child background images\n  if ( typeof this.options.background == 'string' ) {\n    let children = elem.querySelectorAll( this.options.background );\n    for ( let child of children ) {\n      this.addElementBackgroundImages( child );\n    }\n  }\n};\n\nconst reURL = /url\\((['\"])?(.*?)\\1\\)/gi;\n\nImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {\n  let style = getComputedStyle( elem );\n  // Firefox returns null if in a hidden iframe https://bugzil.la/548397\n  if ( !style ) return;\n\n  // get url inside url(\"...\")\n  let matches = reURL.exec( style.backgroundImage );\n  while ( matches !== null ) {\n    let url = matches && matches[2];\n    if ( url ) {\n      this.addBackground( url, elem );\n    }\n    matches = reURL.exec( style.backgroundImage );\n  }\n};\n\n/**\n * @param {Image} img\n */\nImagesLoaded.prototype.addImage = function( img ) {\n  let loadingImage = new LoadingImage( img );\n  this.images.push( loadingImage );\n};\n\nImagesLoaded.prototype.addBackground = function( url, elem ) {\n  let background = new Background( url, elem );\n  this.images.push( background );\n};\n\nImagesLoaded.prototype.check = function() {\n  this.progressedCount = 0;\n  this.hasAnyBroken = false;\n  // complete if no images\n  if ( !this.images.length ) {\n    this.complete();\n    return;\n  }\n\n  /* eslint-disable-next-line func-style */\n  let onProgress = ( image, elem, message ) => {\n    // HACK - Chrome triggers event before object properties have changed. #83\n    setTimeout( () => {\n      this.progress( image, elem, message );\n    } );\n  };\n\n  this.images.forEach( function( loadingImage ) {\n    loadingImage.once( 'progress', onProgress );\n    loadingImage.check();\n  } );\n};\n\nImagesLoaded.prototype.progress = function( image, elem, message ) {\n  this.progressedCount++;\n  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;\n  // progress event\n  this.emitEvent( 'progress', [ this, image, elem ] );\n  if ( this.jqDeferred && this.jqDeferred.notify ) {\n    this.jqDeferred.notify( this, image );\n  }\n  // check if completed\n  if ( this.progressedCount === this.images.length ) {\n    this.complete();\n  }\n\n  if ( this.options.debug && console ) {\n    console.log( `progress: ${message}`, image, elem );\n  }\n};\n\nImagesLoaded.prototype.complete = function() {\n  let eventName = this.hasAnyBroken ? 'fail' : 'done';\n  this.isComplete = true;\n  this.emitEvent( eventName, [ this ] );\n  this.emitEvent( 'always', [ this ] );\n  if ( this.jqDeferred ) {\n    let jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';\n    this.jqDeferred[ jqMethod ]( this );\n  }\n};\n\n// --------------------------  -------------------------- //\n\nfunction LoadingImage( img ) {\n  this.img = img;\n}\n\nLoadingImage.prototype = Object.create( EvEmitter.prototype );\n\nLoadingImage.prototype.check = function() {\n  // If complete is true and browser supports natural sizes,\n  // try to check for image status manually.\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    // report based on naturalWidth\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    return;\n  }\n\n  // If none of the checks above matched, simulate loading on detached element.\n  this.proxyImage = new Image();\n  // add crossOrigin attribute. #204\n  if ( this.img.crossOrigin ) {\n    this.proxyImage.crossOrigin = this.img.crossOrigin;\n  }\n  this.proxyImage.addEventListener( 'load', this );\n  this.proxyImage.addEventListener( 'error', this );\n  // bind to image as well for Firefox. #191\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.proxyImage.src = this.img.currentSrc || this.img.src;\n};\n\nLoadingImage.prototype.getIsImageComplete = function() {\n  // check for non-zero, non-undefined naturalWidth\n  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671\n  return this.img.complete && this.img.naturalWidth;\n};\n\nLoadingImage.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  let { parentNode } = this.img;\n  // emit progress with parent <picture> or self <img>\n  let elem = parentNode.nodeName === 'PICTURE' ? parentNode : this.img;\n  this.emitEvent( 'progress', [ this, elem, message ] );\n};\n\n// ----- events ----- //\n\n// trigger specified handler for event type\nLoadingImage.prototype.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nLoadingImage.prototype.onload = function() {\n  this.confirm( true, 'onload' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.onerror = function() {\n  this.confirm( false, 'onerror' );\n  this.unbindEvents();\n};\n\nLoadingImage.prototype.unbindEvents = function() {\n  this.proxyImage.removeEventListener( 'load', this );\n  this.proxyImage.removeEventListener( 'error', this );\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\n// -------------------------- Background -------------------------- //\n\nfunction Background( url, element ) {\n  this.url = url;\n  this.element = element;\n  this.img = new Image();\n}\n\n// inherit LoadingImage prototype\nBackground.prototype = Object.create( LoadingImage.prototype );\n\nBackground.prototype.check = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  this.img.src = this.url;\n  // check if image is already complete\n  let isComplete = this.getIsImageComplete();\n  if ( isComplete ) {\n    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );\n    this.unbindEvents();\n  }\n};\n\nBackground.prototype.unbindEvents = function() {\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n};\n\nBackground.prototype.confirm = function( isLoaded, message ) {\n  this.isLoaded = isLoaded;\n  this.emitEvent( 'progress', [ this, this.element, message ] );\n};\n\n// -------------------------- jQuery -------------------------- //\n\nImagesLoaded.makeJQueryPlugin = function( jQuery ) {\n  jQuery = jQuery || window.jQuery;\n  if ( !jQuery ) return;\n\n  // set local variable\n  $ = jQuery;\n  // $().imagesLoaded()\n  $.fn.imagesLoaded = function( options, onAlways ) {\n    let instance = new ImagesLoaded( this, options, onAlways );\n    return instance.jqDeferred.promise( $( this ) );\n  };\n};\n// try making plugin\nImagesLoaded.makeJQueryPlugin();\n\n// --------------------------  -------------------------- //\n\nreturn ImagesLoaded;\n\n} );\n","// extracted by mini-css-extract-plugin\nexport {};","// extracted by mini-css-extract-plugin\nexport {};","/*!\n * Unidragger v3.0.1\n * Draggable base class\n * MIT license\n */\n\n( function( window, factory ) {\n  // universal module definition\n  if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n        window,\n        require('ev-emitter'),\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n        window,\n        window.EvEmitter,\n    );\n  }\n\n}( typeof window != 'undefined' ? window : this, function factory( window, EvEmitter ) {\n\nfunction Unidragger() {}\n\n// inherit EvEmitter\nlet proto = Unidragger.prototype = Object.create( EvEmitter.prototype );\n\n// ----- bind start ----- //\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  let method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\nlet startEvent, activeEvents;\nif ( 'ontouchstart' in window ) {\n  // HACK prefer Touch Events as you can preventDefault on touchstart to\n  // disable scroll in iOS & mobile Chrome metafizzy/flickity#1177\n  startEvent = 'touchstart';\n  activeEvents = [ 'touchmove', 'touchend', 'touchcancel' ];\n} else if ( window.PointerEvent ) {\n  // Pointer Events\n  startEvent = 'pointerdown';\n  activeEvents = [ 'pointermove', 'pointerup', 'pointercancel' ];\n} else {\n  // mouse events\n  startEvent = 'mousedown';\n  activeEvents = [ 'mousemove', 'mouseup' ];\n}\n\n// prototype so it can be overwriteable by Flickity\nproto.touchActionValue = 'none';\n\nproto.bindHandles = function() {\n  this._bindHandles( 'addEventListener', this.touchActionValue );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( 'removeEventListener', '' );\n};\n\n/**\n * Add or remove start event\n * @param {String} bindMethod - addEventListener or removeEventListener\n * @param {String} touchAction - value for touch-action CSS property\n */\nproto._bindHandles = function( bindMethod, touchAction ) {\n  this.handles.forEach( ( handle ) => {\n    handle[ bindMethod ]( startEvent, this );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) handle.style.touchAction = touchAction;\n  } );\n};\n\nproto.bindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.addEventListener( eventName, this );\n  } );\n};\n\nproto.unbindActivePointerEvents = function() {\n  activeEvents.forEach( ( eventName ) => {\n    window.removeEventListener( eventName, this );\n  } );\n};\n\n// ----- event handler helpers ----- //\n\n// trigger method with matching pointer\nproto.withPointer = function( methodName, event ) {\n  if ( event.pointerId === this.pointerIdentifier ) {\n    this[ methodName ]( event, event );\n  }\n};\n\n// trigger method with matching touch\nproto.withTouch = function( methodName, event ) {\n  let touch;\n  for ( let changedTouch of event.changedTouches ) {\n    if ( changedTouch.identifier === this.pointerIdentifier ) {\n      touch = changedTouch;\n    }\n  }\n  if ( touch ) this[ methodName ]( event, touch );\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  this.pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this.pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this.pointerDown( event, event );\n};\n\n// nodes that have text fields\nconst cursorNodes = [ 'TEXTAREA', 'INPUT', 'SELECT', 'OPTION' ];\n// input types that do not have text fields\nconst clickTypes = [ 'radio', 'checkbox', 'button', 'submit', 'image', 'file' ];\n\n/**\n * any time you set `event, pointer` it refers to:\n * @param {Event} event\n * @param {Event | Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  // dismiss multi-touch taps, right clicks, and clicks on text fields\n  let isCursorNode = cursorNodes.includes( event.target.nodeName );\n  let isClickType = clickTypes.includes( event.target.type );\n  let isOkayElement = !isCursorNode || isClickType;\n  let isOkay = !this.isPointerDown && !event.button && isOkayElement;\n  if ( !isOkay ) return;\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n  // track position for move\n  this.pointerDownPointer = {\n    pageX: pointer.pageX,\n    pageY: pointer.pageY,\n  };\n\n  this.bindActivePointerEvents();\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// ----- move ----- //\n\nproto.onmousemove = function( event ) {\n  this.pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  this.withPointer( 'pointerMove', event );\n};\n\nproto.ontouchmove = function( event ) {\n  this.withTouch( 'pointerMove', event );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  let moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY,\n  };\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  // start drag if pointer has moved far enough to start drag\n  let isDragStarting = !this.isDragging && this.hasDragStarted( moveVector );\n  if ( isDragStarting ) this.dragStart( event, pointer );\n  if ( this.isDragging ) this.dragMove( event, pointer, moveVector );\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- drag ----- //\n\nproto.dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  this.isPreventingClicks = true; // set flag to prevent clicks\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// ----- end ----- //\n\nproto.onmouseup = function( event ) {\n  this.pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  this.withPointer( 'pointerUp', event );\n};\n\nproto.ontouchend = function( event ) {\n  this.withTouch( 'pointerUp', event );\n};\n\nproto.pointerUp = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n\n  if ( this.isDragging ) {\n    this.dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this.staticClick( event, pointer );\n  }\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.isDragging = false; // reset flag\n  // re-enable clicking async\n  setTimeout( () => delete this.isPreventingClicks );\n\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// triggered on pointer up & pointer cancel\nproto.pointerDone = function() {\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n  this.unbindActivePointerEvents();\n  this.emitEvent('pointerDone');\n};\n\n// ----- cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  this.withPointer( 'pointerCancel', event );\n};\n\nproto.ontouchcancel = function( event ) {\n  this.withTouch( 'pointerCancel', event );\n};\n\nproto.pointerCancel = function( event, pointer ) {\n  this.pointerDone();\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// ----- click ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) event.preventDefault();\n};\n\n// triggered after pointer down & up with no/tiny movement\nproto.staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  let isMouseup = event.type === 'mouseup';\n  if ( isMouseup && this.isIgnoringMouseUp ) return;\n\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( isMouseup ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 400ms\n    setTimeout( () => {\n      delete this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\n// -----  ----- //\n\nreturn Unidragger;\n\n} ) );\n","module.exports = window[\"React\"];","module.exports = window[\"wp\"][\"blockEditor\"];","module.exports = window[\"wp\"][\"components\"];","module.exports = window[\"wp\"][\"data\"];","module.exports = window[\"wp\"][\"element\"];","module.exports = window[\"wp\"][\"i18n\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t\"index\": 0,\n\t\"./style-index\": 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkflexiflick\"] = self[\"webpackChunkflexiflick\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [\"./style-index\"], () => (__webpack_require__(\"./src/index.js\")))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n",""],"names":["Flickity","useEffect","useState","useRef","useSelect","InspectorControls","useBlockProps","PanelBody","ToggleControl","TextControl","SelectControl","__","metadata","registerBlockType","wp","blocks","name","title","icon","category","attributes","sliderGroup","type","default","showArrows","showPager","draggable","wrapAround","freeScroll","pauseAutoPlayOnHover","autoPlay","minHeight","edit","setAttributes","blockProps","sliderRef","posts","select","fetchedPosts","getEntityRecords","per_page","_embed","map","post","id","rendered","content","featured_media_url","_embedded","source_url","sliderGroups","setSliderGroups","apiFetch","path","then","groups","group","label","value","length","current","flickityInstance","prevNextButtons","pageDots","destroy","createElement","help","checked","onChange","options","parseInt","className","ref","save"],"sourceRoot":""}
  • flexi-flick/trunk/flexiflick.php

    r3185975 r3202837  
    55 * Requires at least: 6.1
    66 * Requires PHP:      7.0
    7  * Version:           0.1.2
     7 * Version:           0.1.3
    88 * Author:            rashmiwp
    99 * Author URI:        https://profiles.wordpress.org/rashmiwp/
     
    1818    exit; // Exit if accessed directly.
    1919}
     20
     21function flexiflick_register_taxonomy() {
     22    register_taxonomy(
     23        'flexiflick_slider_group',
     24        'flexiflick_slide_cpt', // Your custom post type
     25        array(
     26            'labels' => array(
     27                'name' => 'Slider Groups',
     28                'singular_name' => 'Slider Group',
     29            ),
     30            'public' => true,
     31            'hierarchical' => true,
     32            'show_ui' => true,
     33            'show_in_rest' => true, // Enable Gutenberg support
     34            'has_archive' => false,
     35            'exclude_from_search' => true,
     36        )
     37    );
     38}
     39add_action('init', 'flexiflick_register_taxonomy');
    2040
    2141// Register Custom Post Type for Slides
     
    6383        'render_callback' => 'flexiflick_render_slider',
    6484        'attributes'      => array(
     85            'sliderGroup' => array(
     86                'type' => 'string',
     87            ),
    6588            'showArrows' => array(
    6689                'type'    => 'boolean',
     
    102125// Render the FlexiFlick Slider
    103126function flexiflick_render_slider($attributes) {
     127    $slider_group = isset($attributes['sliderGroup']) ? $attributes['sliderGroup'] : '';
    104128    $args = array(
    105129        'post_type' => 'flexiflick_slide_cpt', // Updated post type slug
    106130        'posts_per_page' => -1,
    107131    );
     132    if ($slider_group) {
     133        $args['tax_query'] = array(
     134            array(
     135                'taxonomy' => 'flexiflick_slider_group',
     136                'field' => 'id',
     137                'terms' => $slider_group,
     138            ),
     139        );
     140    }
    108141
    109142    $slides = new WP_Query($args);
  • flexi-flick/trunk/readme.txt

    r3185980 r3202837  
    33Tags:              slider, flickity, metafizzy, carousel, slideshow
    44Tested up to:      6.7
    5 Stable tag:        0.1.2
     5Stable tag:        0.1.3
    66License:           GPL-3.0-or-later
    77License URI:       https://www.gnu.org/licenses/gpl-3.0.html
    88
    99
    10 FlexiFlick Hero Slider - Customizable WordPress Slider Plugin
     10FlexiFlick Slider: Empower Your WordPress Website with Dynamic, Customizable Sliders with Gutenberg block support.
    1111
    1212== Description ==
    1313
    14 FlexiFlick Slider is a versatile and highly customizable WordPress plugin crafted for creating eye-catching hero banners and dynamic content sliders with minimal setup. Built on the robust [Flickity library](https://flickity.metafizzy.co/options), FlexiFlick Slider enables you to showcase your content—be it images, featured posts, or products—in a professional, sleek design. Easily configured through an intuitive Gutenberg block, it lets you control everything from autoplay, navigation arrows, and pagination to styles and animation speeds, making it perfect for high-impact hero banners or interactive product showcases.
     14**FlexiFlick Slider** is a versatile and highly customizable WordPress plugin crafted for creating eye-catching hero banners and dynamic content sliders with minimal setup. Built on the robust **Flickity library**, FlexiFlick Slider enables you to showcase your content—be it images, featured posts, or products—in a professional, sleek design.
    1515
     16Effortlessly configured through an intuitive **Gutenberg block**, FlexiFlick Slider offers extensive options to control autoplay, navigation arrows, pagination, styles, and animation speeds, making it perfect for high-impact hero banners or interactive product showcases.
     17
     18**Now with Enhanced Slide Selection!**
     19
     20With the latest update, you can now create **multiple sliders** on different pages and choose exactly which slides appear in each slider. This powerful new feature lets you group slides for specific sections of your site, giving you greater flexibility and control over your content presentation. 🎉
     21
     22Originally developed in partnership with [SiteWired.com](https://www.sitewired.com), FlexiFlick Slider is built to meet professional standards while remaining user-friendly. Download it today and take your website's visual impact to the next level!
    1623Features:
    1724
    18 - Hero Banner Ready: Ideal for highlighting important content, featured posts, or product showcases.
     25- 🎯 **New! Slide Group Selection:**
     26  Easily create multiple sliders and assign specific slides to each slider. Perfect for showcasing tailored content on different pages.
    1927
    20 - Advanced Customization Options: Control every aspect of your slider, including navigation, animation speed, autoplay, and pagination, with more features on the way.
     28- **Hero Banner Ready:**
     29  Highlight important content, featured posts, or product showcases with visually stunning hero banners.
    2130
    22 - Seamless Gutenberg Integration: Effortlessly create sliders with a simple block-based interface.
     31- **Advanced Customization Options:**
     32  Control every aspect of your slider, including navigation, animation speed, autoplay, and pagination, with even more features in development.
    2333
    24 - Responsive & Mobile-Friendly: Looks great on any device, from desktops to mobiles.
     34- **Seamless Gutenberg Integration:**
     35  Effortlessly create sliders with a block-based interface that's both intuitive and powerful.
    2536
    26 - Originally developed in partnership with [SiteWired.com](https://www.sitewired.com), FlexiFlick Slider is now available for the WordPress community, built to meet professional standards while staying user-friendly.
    27 
     37- **Responsive & Mobile-Friendly:**
     38  Your sliders will look amazing on desktops, tablets, and mobile devices.
    2839
    2940== Installation ==
    3041
    31421. Upload the flexiflick-slider folder to the /wp-content/plugins/ directory.
     43
    32442. Activate the plugin through the 'Plugins' menu in WordPress.
    33 3. Once you activate the plugin, it will create a new post type in backend with name "flexiflick_slide"
    34 4. Use this post type and add your desired slide content there, featured image will be used as slide image and text and  body will appear as layover text.
    35 5. Add the "FlexiFlick Slider" block to your post or page using the Gutenberg editor.
    36 6. Customize the slider settings in the block inspector.
     45
     463. Once activated, the plugin will create a new post type called **"FlexiFlick Slide"** in the backend.
     47
     484. Use this post type to add your desired slide content:
     49    -The **featured image** will be used as the slide image.
     50    -The **title** and **body** content will appear as overlay text.
     51
     525. Assign slides to specific **slider groups** using the **"Slider Groups" taxonomy**. This allows you to group slides and use different sets of slides for different sliders.
     53
     546. Add the **"FlexiFlick Slider"** block to your post or page using the Gutenberg editor.
     55
     567. In the block settings, choose the **slider group** you want to display.
     57
     588. Customize the slider settings in the block inspector, including autoplay, navigation arrows, animation speed, and more.
    3759
    3860== Screenshots ==
     
    42642. **Flexi Slides** - This screenshot shows the admin section about how to add slides and text there. Slide title and body will appear over slider image on front end.
    4365
    44 2. **Slider Settings Panel** - This screenshot shows the settings available in the FlexiFlick Slider plugin's admin interface.
     663. **Slider Settings Panel** - This screenshot shows the settings available in the FlexiFlick Slider plugin's admin interface.
    4567
    4668== Changelog ==
     
    5981* added new option to set minimum height for each slide
    6082* issue fixing for mobile part
    61 
     83= 0.1.3 =
     84* Added the ability to assign specific slides to individual sliders.
     85* Updated Gutenberg block with options to select slider groups.
     86* Improved performance and compatibility with the latest WordPress version.
     87* Minor UI/UX improvements for block settings.
    6288
    6389== Source Code ==
     
    6793- Flickity CSS: https://github.com/metafizzy/flickity
    6894
    69 == Future Enhancements ==
    70 Adding more style options.
    71 Including additional behavior settings.
    72 Integrating with more custom post types and taxonomies.
  • flexi-flick/trunk/src/index.js

    r3185975 r3202837  
    22import Flickity from 'flickity';
    33import 'flickity/dist/flickity.min.css';
    4 import { useEffect, useRef } from '@wordpress/element';
     4import { useEffect, useState, useRef } from '@wordpress/element';
    55import { useSelect } from '@wordpress/data';
    66import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
    7 import { PanelBody, ToggleControl, TextControl  } from '@wordpress/components';
     7import { PanelBody, ToggleControl, TextControl, SelectControl  } from '@wordpress/components';
    88import { __ } from '@wordpress/i18n';
    99import metadata from './block.json';
     
    1717    category: 'widgets',
    1818    attributes: {
     19        sliderGroup: {
     20            type: 'string',
     21            default: '',
     22        },
    1923        showArrows: {
    2024            type: 'boolean',
     
    7377    }, []);
    7478
     79    const [sliderGroups, setSliderGroups] = useState([]);
     80
     81    // Fetch available slider groups
     82    useEffect(() => {
     83            wp.apiFetch({ path: '/wp/v2/flexiflick_slider_group' }).then((groups) => {
     84                setSliderGroups(groups.map((group) => ({
     85                    label: group.name,
     86                    value: group.id,
     87                })));
     88            });
     89        }, []);
     90
    7591    useEffect(() => {
    7692            // Initialize Flickity only if posts are loaded
     
    97113                            checked={attributes.showArrows}
    98114                            onChange={(value) => setAttributes({ showArrows: value })}
     115                        />
     116                        <SelectControl
     117                            label="Select Slider Group"
     118                            value={attributes.sliderGroup}
     119                            options={[
     120                                { label: 'Select a group', value: '' },
     121                                ...sliderGroups,
     122                            ]}
     123                            onChange={(value) =>
     124                                setAttributes({ sliderGroup: value })
     125                            }
    99126                        />
    100127                        <ToggleControl
     
    149176                            <div className="flickity-placeholder-content">
    150177                                <h3>Flickity Responsive Slider/Carousel</h3>
     178                                {attributes.sliderGroup && (
     179                                    <p>Selected Group ID: {attributes.sliderGroup}</p>
     180                                )}
    151181                                <p>....................................</p>
    152182                                <p>{`{ showArrows: ${attributes.showArrows ? 'True' : 'False'} }`}</p>
Note: See TracChangeset for help on using the changeset viewer.