{"version":3,"sources":["jsdelivr-header.js","/npm/imgcache.js@1.1.1/js/imgcache.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACaA,IAAI,SAAW,CACP,QAAS,QAET,QAAS,CACL,OAAO,EACP,iBAAkB,WAClB,YAAY,EACZ,YAAa,SACb,oBAAoB,EACpB,eAAgB,EAChB,QAAS,CAAC,EACV,iBAAiB,EACjB,iBAAiB,EACjB,sBAAuB,KACvB,QAAS,GAEb,aAAc,CACV,KAAM,SAAU,GAGZ,SAAS,EAAE,EAAE,EAAE,GAAG,KAAM,EAAE,KAAI,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,GAAG,EAAI,IAAK,GAAG,CAAG,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,GAAK,MAAF,IAAa,MAAF,GAAuC,OAAU,OAApC,IAAI,KAAK,IAAI,KAAK,IAAI,MAAuB,GAAO,MAAF,CAAS,CAAC,IAAI,EAAE,mBAAmB,OAAO,SAAS,GAA2B,IAAxB,IAAsB,EAAlB,EAAE,GAAG,EAAW,EAAT,EAAE,OAAmB,EAAE,EAAE,EAAE,EAAE,IAAK,EAAE,EAAE,GAAG,IAAe,GAAT,EAAG,EAAE,GAAO,EAAE,KAAK,EAAE,OAAQ,GAAG,EAAG,IAAK,EAAE,OAAS,GAAF,IAAQ,OAAO,EAAE,KAAK,GAAG,CAAjJ,CAAoJ,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,UAAW,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,WAAW,IAAI,EAAE,EAAE,WAAW,IAAI,EAAE,GAAG,IAAI,KAAO,GAAI,EAAE,GAAK,EAAmB,IAAd,EAAE,IAAK,GAAI,IAAO,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,GAAG,IAAI,EAAE,SAAU,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,GAAK,MAAF,IAAa,MAAF,IAAa,MAAF,IAAa,MAAF,IAAa,MAAF,GAAkE,OAAU,OAA/D,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,MAAuB,GAAO,MAAF,CAAU,CAA5K,CAA8K,EAAE,GAAI,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,GAAK,EAAE,CAAE,CAAnC,CAAqC,EAAE,EAAE,GAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAI,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,EAAI,EAAE,EAAI,EAAE,CAAE,CAAxC,CAA0C,EAAE,EAAE,GAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAxwB,CAA2wB,SAAS,GAA+B,IAA5B,IAAI,EAAE,GAAS,EAAW,EAAT,EAAE,OAAiB,EAAE,EAAE,EAAE,EAAE,GAAG,EAAG,EAAE,GAAG,KAA5C,IAAiD,EAAE,WAAW,EAAE,KAAQ,GAAI,EAAE,GAAK,OAAO,CAAC,CAAnH,CAAqH,GAAI,QAAiB,EAAT,EAAE,QAE/xC,EACA,IAAK,SAAU,EAAK,GACZ,aACI,SAAS,QAAQ,QACb,IAAU,iBAAkB,EAAM,SAAW,GAC7C,IAAU,oBAAqB,EAAM,SAAW,GAChD,IAAU,kBAAmB,EAAM,UAAY,GACnD,QAAQ,IAAI,GAExB,GAEJ,OAAO,EACP,WAAY,CAAC,GAEjB,eAAiB,EACjB,kBAAoB,EACpB,gBAAkB,GAEtB,SAAW,GAEP,aAGA,IAAI,EAAU,CAGd,YAAsB,SAAU,GAC5B,OAAI,SAAS,QAAQ,gBACV,GAEH,EAAI,QAAU,GAAgB,MAAX,EAAI,IAAsC,MAAxB,EAAI,EAAI,OAAS,KACxD,EAAM,EAAI,OAAO,EAAG,EAAI,OAAS,IAElB,UAAU,GASnC,EAGA,IAAc,SAAU,GACf,IAAO,EAAM,IAElB,IACI,EAAS,EAAI,MADJ,8EAEb,KAAK,OAAY,EAAO,IAAM,KAC9B,KAAK,UAAY,EAAO,IAAM,KAC9B,KAAK,KAAY,EAAO,IAAM,KAC9B,KAAK,MAAY,EAAO,IAAM,KAC9B,KAAK,SAAY,EAAO,IAAM,IAClC,EAEA,eAAyB,SAAU,GAC/B,GAAK,EAAL,CAIA,IAAI,EAAM,EAAS,YAAY,KAC/B,GAAK,EAGL,OAAO,EAAS,OAAO,EAAM,GAAG,aANhC,CAOJ,EAGA,WAAqB,SAAU,GAC3B,GAAK,EAIL,OADU,EAAQ,IAAI,GACX,KAAK,aACpB,EAGA,iBAA2B,SAAU,GACjC,IAAK,EACD,MAAO,GAGX,IAAI,GADJ,EAAW,EAAS,MAAM,KAAK,IACZ,MAAM,KAAK,MAE9B,OAAK,GAAO,EAAI,OAAS,EACd,GAEJ,CACX,EAEA,YAAsB,SAAU,EAAO,GAInC,OAHK,IACD,EAAQ,IAEP,GAAmB,KAAV,EAGP,GAAuC,KAA3B,EAAM,EAAM,OAAS,IAAe,EAAM,OAAS,GAAiB,KAAZ,EAAM,GAAc,GAAK,KAAQ,GAFhG,EAAM,OAAS,GAAiB,KAAZ,EAAM,GAAY,GAAK,KAAO,CAGlE,EAEA,sBAAgC,WAC5B,OAAQ,SAAS,QAAU,SAAS,UACxC,EAEA,UAAoB,WAChB,MAA2B,oBAAZ,SAA+C,oBAAb,QACrD,EAEA,iBAA2B,WACvB,OAAQ,EAAQ,aAAe,QAAU,OAAO,UAAY,OAAO,SAAS,cAAc,QAAQ,YAAc,CACpH,EAEA,sBAAgC,WAC5B,OAAQ,EAAQ,aAAe,QAAU,OAAO,WAAc,OAAO,SAAS,cAAc,QAAQ,YAAc,GAAO,OAAO,SAAS,cAAc,QAAQ,YAAc,EACjL,EAEA,aAAuB,WACnB,OAAQ,EAAQ,aAAe,QAAU,OAAO,UAA8C,QAAlC,OAAO,SAAS,aAChF,EAGA,6BAAuC,WACnC,OAAQ,EAAQ,oBAAsB,OAAO,UACR,IAAjC,OAAO,QAAQ,QAAQ,OACW,IAAlC,OAAO,QAAQ,QAAQ,QACW,IAAlC,OAAO,QAAQ,QAAQ,QACW,IAAlC,OAAO,QAAQ,QAAQ,OAE/B,EAGA,2BAAqC,WACjC,OAAQ,EAAQ,oBAAsB,OAAO,UAA6C,IAAjC,OAAO,QAAQ,QAAQ,OAAgD,IAAjC,OAAO,QAAQ,QAAQ,MAC1H,EAGA,WAAqB,SAAU,GAC3B,OAAI,EAAQ,8BAA6D,mBAAtB,EAAM,YAC9C,EAAM,cACyB,mBAAxB,EAAM,cAEb,EAAM,gBAEN,EAAM,OAErB,EAGA,YAAsB,SAAU,GAE5B,MAA+B,mBAAhB,EAAM,MAAuB,EAAQ,WAAW,GAAS,EAAM,OAClF,EAGA,aAAuB,SAAU,GAC7B,OAAI,EAAQ,YAEJ,EAAQ,eACJ,EAAQ,+BACD,EAAM,SAEN,EAAM,UAIU,mBAAhB,EAAM,MAAuB,EAAQ,WAAW,GAAS,EAAM,SAEvE,EAAM,QAErB,EAEA,sBAAgC,SAAU,GAEtC,GAA+B,oBAApB,gBAAiC,CACxC,GAAI,GAAgB,gBAAgB,eAAe,cAC/C,OAAO,gBAAgB,WAE3B,IAAK,GAAgB,gBAAgB,eAAe,aAChD,OAAO,gBAAgB,SAE/B,CACA,OAAQ,EAAe,OAAO,WAAa,OAAO,SACtD,GAKI,EAAa,CAEjB,QAAqB,SAAU,EAAY,GACnC,SAAS,OACT,EAAE,GAAY,QAAQ,KAGlB,EAAQ,yBAA4B,OAAO,cAE3C,OAAO,YAAc,SAAqB,EAAM,GAC5C,IAAI,EACJ,EAAS,GAAU,CAAC,SAAS,EAAO,YAAY,EAAO,YAAQ,GAC/D,KACI,EAAQ,SAAS,YAAY,gBACvB,gBAAgB,EAAM,EAAO,QAAS,EAAO,WAAY,EAAO,OAC1E,CAAE,MAAO,IAEL,EAAQ,SAAS,YAAY,UACvB,UAAU,EAAM,EAAO,QAAS,EAAO,YAC7C,EAAM,OAAS,EAAO,MAC1B,CACA,OAAO,CACX,GAEJ,EAAW,cAAc,IAAI,YAAY,IAEjD,EAEA,gBAA6B,SAAU,EAAS,GACxC,EAAQ,wBACR,EAAQ,WAAW,GAEnB,EAAQ,gBAAgB,EAEhC,EACA,aAA0B,SAAU,EAAS,EAAU,GAC/C,EAAQ,wBACR,EAAQ,KAAK,EAAU,GAEvB,EAAQ,aAAa,EAAU,EAEvC,EACA,aAA0B,SAAU,EAAS,GACzC,OAAI,EAAQ,wBACD,EAAQ,KAAK,GAEb,EAAQ,aAAa,EAEpC,EACA,mBAAgC,SAAU,GACtC,GAAI,EAAQ,wBACR,OAAO,EAAQ,KAAK,uBAAyB,OAAS,EAAQ,KAAK,uBAAyB,IAAM,EAAQ,IAAI,oBAE9G,IAAI,EAAQ,OAAO,iBAAiB,EAAS,MAC7C,OAAK,EAGE,EAAQ,aAAa,uBAAyB,OAAS,EAAQ,aAAa,uBAAyB,IAAM,EAAM,qBAHxH,CAKR,EACA,mBAAgC,SAAU,EAAS,GAC3C,EAAQ,wBACR,EAAQ,IAAI,mBAAoB,GAEhC,EAAQ,MAAM,gBAAkB,CAExC,GAKI,EAAU,CAAE,WAAY,CAAC,EAE7B,iBAA2B,WACvB,SAAK,SAAS,WAAW,aAAe,SAAS,WAAW,YACxD,SAAS,aAAa,IAAI,oEAAqE,oBACxF,EAGf,GAEA,EAAQ,WAAW,iBAAkB,EACrC,EAAQ,gBAAkB,WAEtB,GAAI,EAAQ,WAAW,gBACnB,OAAO,EAAQ,WAAW,gBAE9B,IACI,IAAI,EAAM,SAAS,aAAa,KAAK,iBAIrC,OAHA,aAAa,QAAQ,EAAK,GAC1B,aAAa,WAAW,GACxB,EAAQ,WAAW,iBAAkB,GAC9B,CAEX,CAAE,MAAO,GAGL,OADA,SAAS,aAAa,IAAI,qCAAuC,EAAE,QAAS,iBACrE,CACX,CACJ,EAEA,EAAQ,eAAiB,SAAU,GAC/B,SAAS,aAAa,IAAI,iBAAmB,EAAS,gBAClD,EAAQ,mBACR,aAAa,QAAQ,YAAc,SAAS,QAAQ,iBAAkB,EAE9E,EAEA,EAAQ,kBAAoB,SAAU,GAClC,OAAO,EAAQ,YAAY,SAAS,QAAQ,iBAAkB,EAAQ,kBAAkB,GAC5F,EAGA,EAAQ,sBAAwB,SAAU,GACtC,IAAI,EAAa,EAAQ,aAAa,SAAS,WAAW,UAC1D,OAAO,EAAQ,YAAY,EAAY,EAAQ,kBAAkB,GACrE,EAEA,EAAQ,kBAAoB,SAAU,GAClC,GAAK,EAAL,CAIA,IAAI,EAAO,SAAS,aAAa,KAAK,GAClC,EAAM,EAAQ,iBAAiB,EAAQ,eAAe,IAC1D,OAAO,GAAQ,EAAO,IAAM,EAAO,GAHnC,CAFI,SAAS,aAAa,IAAI,uCAAwC,kBAM1E,EAEA,EAAQ,cAAgB,SAAU,EAAM,EAAS,GAC7C,EAAW,aAAa,EAAM,MAAO,GAErC,EAAW,aAAa,EAAM,EAAc,EAChD,EAEA,EAAQ,eAAiB,SAAU,EAAkB,GACjD,IAAK,SAAS,WAAW,WAGrB,OAFA,SAAS,aAAa,IAAI,0CAA2C,sBACjE,GAAkB,KAI1B,IAAI,EAAQ,SAAU,GAClB,SAAS,aAAa,IAAI,+CAAiD,EAAM,KAAM,iBACnF,GAAkB,GAC1B,EAoCA,SAAS,WAAW,WAAW,KAAK,aAAa,SAAS,QAAQ,iBAAkB,CAAC,QAAQ,EAAM,WAAW,IAnCzF,SAAU,GAK3B,GAJA,SAAS,WAAW,SAAW,EAC/B,SAAS,aAAa,IAAI,8BAAgC,EAAQ,aAAa,GAAW,gBAGtF,EAAQ,mBAAoB,CAO5B,EAAS,QAAQ,WAAY,CAAC,QAAQ,EAAM,WAAW,IALtB,WAC7B,SAAS,aAAa,IAAI,yBAA0B,gBAChD,GAAoB,GAC5B,GAE2F,EAC/F,MAAY,EAAQ,yBAEZ,EAAQ,gBAAkB,EAAS,aACnC,EAAS,aAAY,WAEb,SAAS,aAAa,IAAI,sCAAuC,eACrE,IAAG,WAEC,SAAS,aAAa,IAAI,mDAAoD,kBAClF,GAAG,CAAE,yBAA0B,IAOnC,GAAoB,IAG5B,SAAS,OAAQ,EACjB,EAAW,QAAQ,SAAU,EACjC,GACsI,EAC1I,EAIA,EAAQ,oBAAsB,SAAU,GAChC,EAAQ,cAER,KAAK,aAAe,IAAI,cAE5B,KAAK,WAAa,CACtB,EACA,EAAQ,oBAAoB,UAAU,SAAW,SAAU,EAAK,EAAW,EAAkB,EAAgB,GAEzG,IAAI,EAAU,SAAS,QAAQ,SAAW,CAAC,EACvC,EAAgD,mBAAhB,EAEpC,GAAI,KAAK,aAIL,OAHI,IACA,KAAK,aAAa,WAAa,GAE5B,KAAK,aAAa,SAAS,EAAK,EAAW,EAAkB,GAAgB,EAAO,CAAE,QAAW,IAG5G,IAAI,EAAa,KAAK,WAGlB,EAAQ,SAAU,EAAK,EAAO,GAC9B,SAAS,aAAa,IAAI,EAAK,GAG3B,GACA,EAAe,CAAC,KAAM,EAAG,OAAQ,EAAK,OAAQ,GAEtD,EACI,EAAM,IAAI,eAYd,IAAK,IAAI,KAXT,EAAI,KAAK,MAAO,GAAK,GACjB,IACA,EAAI,WAAa,GAGjB,SAAS,QAAQ,kBACjB,EAAI,iBAAkB,GAG1B,EAAI,QAAU,SAAS,QAAQ,QAC/B,EAAI,aAAe,OACH,EACZ,EAAI,iBAAiB,EAAK,EAAQ,IAEtC,EAAI,OAAS,YACL,EAAI,UAA4B,MAAf,EAAI,QAAiC,IAAf,EAAI,OAS3C,EAAM,SAAW,EAAM,sCAAwC,EAAI,OAAQ,EAAG,GAR9E,EAAW,KAAK,QAAQ,EAAW,CAAE,QAAO,IAAQ,SAAU,GAC1D,EAAU,cAAa,SAAU,GAC7B,EAAO,QAAU,EACjB,EAAO,WAAa,WAAc,EAAiB,EAAa,EAChE,EAAO,MAAM,EAAI,SAAU,EAC/B,GAAG,EACP,GAAG,EAIX,EACA,EAAI,QAAU,WACV,EAAM,qBAAuB,EAAM,sCAAwC,EAAI,OAAQ,EAAG,EAC9F,EACA,EAAI,MACR,EAEA,EAAQ,sBAAwB,SAAU,GACtC,IAAI,EAA0B,EAAW,mBAAmB,GAC5D,GAAK,EAAL,CAKA,MAFa,iBACQ,KAAK,GAAyB,GACpC,QAAQ,UAAW,GAHlC,CAIJ,EAEA,EAAQ,eAAiB,SAAU,EAAU,EAAS,EAAmB,EAAkB,GACvF,GAAK,EAAQ,oBAIR,EAAL,CAIA,IAAI,EAAW,EAAQ,eAAe,GAmDtC,SAAS,WAAW,WAAW,KAAK,QAAQ,EAAQ,kBAAkB,GAAU,CAAC,QAAQ,IAjDrE,SAAU,GAC1B,GAAI,SAAS,QAAQ,WAAY,CAkC7B,EAAM,MAjCK,SAAU,GACjB,IAAI,EAAS,IAAI,WACjB,EAAO,UAAY,SAAU,GAczB,IAAI,EAAgB,EAAE,OAAO,OAC7B,IAAK,EAGD,OAFA,SAAS,aAAa,IAAI,iBAAmB,EAAW,YAAa,wBACjE,GAAkB,EAAe,IAGzC,EAAkB,EAAU,EAAe,GAC3C,SAAS,aAAa,IAAI,QAAU,EAAW,qBAAsB,gBACjE,GAAoB,EAAiB,EAC7C,EACA,EAAO,cAAc,EACzB,IACY,SAAU,GAClB,SAAS,aAAa,IAAI,uBAAyB,EAAM,KAAM,iBAC3D,GAAkB,EAAe,EACzC,GAGJ,KAAO,CAEH,IAAI,EAAU,EAAQ,YAAY,GAClC,EAAkB,EAAU,EAAS,GACrC,SAAS,aAAa,IAAI,QAAU,EAAW,qBAAsB,gBACjE,GAAoB,EAAiB,EAC7C,CACJ,IAEY,WACR,SAAS,aAAa,IAAI,QAAU,EAAW,gBAAiB,gBAC5D,GAAkB,EAAe,EACzC,GApDA,CAsDJ,EAKA,IAAI,EAAe,eACf,EAAsB,sBACtB,EAAiC,gBAErC,SAAS,KAAO,SAAU,EAAkB,GACxC,SAAS,UAAU,OAAO,SAAU,OAAO,OAC3C,SAAS,kBAAwC,IAAnB,OAAO,UAA2B,OAAO,QAAQ,SAE/E,SAAS,WAAW,cAAgB,EAEpC,SAAS,aAAa,IAAI,wBAAyB,gBAEnD,IAYI,EAAS,SAAU,GACnB,SAAS,aAAa,IAAI,yBAA0B,gBAGpD,SAAS,WAAW,WAAa,EAEjC,EAAQ,gBAAe,WAlBV,IAAU,IAmBR,SAAS,WAAW,cAlB/B,SAAS,QAAQ,eAAiB,GACpB,SAAS,iBAC0B,KAAlC,SAAS,QAAQ,eAAwB,KACpD,SAAS,WAAW,EAAU,GAK9B,GAAY,GAWpB,GAAG,EACP,EACI,EAAQ,SAAU,GAClB,SAAS,aAAa,IAAI,wCAA0C,EAAM,KAAM,iBAC5E,GAAkB,GAC1B,EACA,GAAI,EAAQ,aAAe,OAAO,kBAE9B,GAAI,SAAS,QAAQ,sBACjB,IACI,OAAO,0BACH,SAAS,QAAQ,uBACjB,SAAU,GACN,EAAO,CAAE,KAAM,GACnB,GACA,EAER,CAAE,MAAO,GACL,EAAM,CAAE,KAAM,EAAE,SACpB,MAEA,OAAO,kBAAkB,EAAQ,sBAAsB,SAAS,QAAQ,oBAAqB,EAAG,EAAQ,OAEzG,CAEH,IAAI,EAAU,OAAO,mBAAqB,OAAO,wBAEjD,GADA,OAAO,YAAc,OAAO,cAAgB,SAAS,QAAQ,mBAAqB,UAAU,wBAA0B,UAAU,yBAC3H,OAAO,YAGR,OAFA,SAAS,aAAa,IAAI,mDAAoD,wBAC1E,GAAkB,KAI1B,IAAI,EAAa,SAAS,QAAQ,YAClC,OAAO,YAAY,aACf,GACA,WAEI,IAAI,EAAe,SAAS,QAAQ,mBAAqB,OAAO,YAAY,WAAa,OAAO,YAAY,UAC5G,EAAQ,EAAa,EAAY,EAAQ,EAC7C,IACA,SAAU,GAEN,SAAS,aAAa,IAAI,4BAA8B,EAAM,QAAS,iBACnE,GAAkB,GAC1B,GAER,CACJ,EAEA,SAAS,eAAiB,WACtB,GAAI,EAAQ,kBAAmB,CAC3B,IAAI,EAAU,aAAa,QAAQ,YAAc,SAAS,QAAQ,kBAClE,OAAgB,OAAZ,EACO,EAEJ,SAAS,EAAS,GAC7B,CACI,OAAO,CAEf,EAIA,SAAS,UAAY,SAAU,EAAS,EAAkB,EAAgB,GAEtE,GAAK,EAAQ,oBAAuB,EAApC,CAIA,EAAU,EAAQ,YAAY,GAE9B,IAAI,EAAW,EAAQ,sBAAsB,GAE1B,IAAI,EAAQ,oBAAoB,SAAS,WAAW,YAC1D,SACT,EACA,GACA,SAAU,GACN,EAAM,aAAY,SAAU,GACpB,GAAa,SAAU,GACvB,SAAS,aAAa,IAAI,qBAAuB,EAAS,KAAM,gBAChE,EAAQ,eAAe,SAAS,iBAAmB,SAAS,EAAS,KAAM,MAE3E,SAAS,aAAa,IAAI,sCAAuC,eAEzE,IACA,SAAS,aAAa,IAAI,sBAAwB,EAAQ,aAAa,GAAQ,gBAI3E,EAAM,aACN,EAAM,aACF,WAEI,SAAS,aAAa,IAAI,sCAAuC,eACrE,IACA,WAEI,SAAS,aAAa,IAAI,mDAAoD,kBAClF,GACA,CAAE,yBAA0B,IAKhC,GACF,EAAiB,EAAM,QAE7B,IACA,SAAU,GACF,EAAM,QAAU,SAAS,aAAa,IAAI,0BAA4B,EAAM,OAAQ,iBACpF,EAAM,QAAU,SAAS,aAAa,IAAI,0BAA4B,EAAM,OAAQ,iBACxF,SAAS,aAAa,IAAI,wBAA0B,EAAM,KAAM,iBAC5D,GAAkB,GAC1B,GACA,EAhDJ,CAkDJ,EAKA,SAAS,cAAgB,SAAU,EAAS,GAExC,GAAK,EAAQ,oBAAuB,EAApC,CAIA,IAAI,EAAmB,EACvB,EAAU,EAAQ,YAAY,GAE9B,IAAI,EAAO,EAAQ,kBAAkB,GACjC,EAAQ,oBAEwB,IAA5B,EAAK,QAAQ,aAEb,EAAO,EAAK,OAAO,IAM3B,SAAS,WAAW,WAAW,KAAK,QAChC,EACA,CAAE,QAAQ,IACV,SAAU,GAAc,EAAkB,EAAS,EAAa,IAChE,WAAc,EAAkB,EAAkB,KAAO,GApB7D,CAsBJ,EAGA,SAAS,iBAAmB,SAAU,EAAS,EAAkB,GAS7D,SAAS,cAAc,GART,SAAU,EAAS,GACxB,EAGD,EAAiB,EAAS,EAAQ,YAAY,IAF1C,GAAkB,EAAe,EAI7C,GAGJ,EAMA,SAAS,SAAW,SAAU,EAAS,GACnC,SAAS,cAAc,GAAS,SAAU,EAAK,GAC3C,EAAkB,EAAoB,OAAf,EAC3B,GACJ,EAIA,SAAS,cAAgB,SAAU,GAE/B,GAAK,EAAQ,oBAAuB,EAApC,CAIA,IAAI,EAAW,EAAW,aAAa,EAAM,GACzC,GACA,EAAW,aAAa,EAAM,MAAO,GAEzC,EAAW,gBAAgB,EAAM,EANjC,CAOJ,EAKA,SAAS,cAAgB,SAAU,EAAM,EAAkB,GAElD,EAAQ,oBAIb,EAAQ,eAAe,EAAM,EAAW,aAAa,EAAM,OAAQ,EAAQ,cAAe,EAAkB,EAChH,EAGA,SAAS,wBAA0B,SAAU,EAAM,EAAW,EAAkB,GAE5E,GAAK,EAAQ,mBAAb,CAIA,IAAI,EAAU,EAAQ,YAAY,GAElC,EAAQ,eAAe,EAAM,EAAS,EAAQ,cAAe,EAAkB,EAJ/E,CAKJ,EAGA,SAAS,WAAa,SAAU,EAAkB,GAEzC,EAAQ,oBAKb,SAAS,WAAW,SAAS,mBACzB,WACI,SAAS,aAAa,IAAI,sBAAuB,gBACjD,EAAQ,eAAe,GAEvB,EAAQ,eAAe,EAAkB,EAC7C,IACA,SAAU,GACN,SAAS,aAAa,IAAI,+CAAiD,EAAM,KAAM,iBACnF,GAAkB,GAC1B,GAER,EAEA,SAAS,WAAa,SAAU,EAAS,EAAkB,GAEvD,EAAU,EAAQ,YAAY,GAE9B,IAAI,EAAW,EAAQ,kBAAkB,GACrC,EAAQ,SAAU,GAClB,SAAS,aAAa,IAAI,gCAAkC,EAAM,KAAM,iBACpE,GAAkB,GAC1B,EACA,SAAS,WAAW,WAAW,KAAK,QAAQ,EAAU,CAAE,QAAQ,IAAS,SAAU,GAC/E,EAAU,QACN,WACQ,GAAoB,GAC5B,GACA,EAER,GAAG,EACP,EAEA,SAAS,mBAAqB,SAAU,EAAM,GAC1C,IAAI,EAAU,EAAQ,sBAAsB,GAC5C,SAAS,cAAc,GAAS,SAAU,EAAK,GAC3C,EAAkB,EAAoB,OAAf,EAC3B,GACJ,EAEA,SAAS,gBAAkB,SAAU,EAAM,EAAkB,EAAgB,GAEzE,GAAK,EAAQ,mBAAb,CAIA,IAAI,EAAU,EAAQ,sBAAsB,GAC5C,IAAK,EAGD,OAFA,SAAS,aAAa,IAAI,yBAA0B,wBAChD,GAAkB,KAI1B,SAAS,aAAa,IAAI,yBAA2B,EAAS,gBAC9D,SAAS,UAAU,EAAS,EAAkB,EAAgB,EAV9D,CAWJ,EAEA,SAAS,oBAAsB,SAAU,EAAM,EAAkB,GAE7D,GAAK,EAAQ,mBAAb,CAIA,IAAI,EAAU,EAAQ,sBAAsB,GAC5C,IAAK,EAGD,OAFA,SAAS,aAAa,IAAI,yBAA0B,wBAChD,GAAkB,KAU1B,EAAQ,eAAe,EAAM,GANC,SAAU,EAAU,EAAS,GACvD,EAAW,mBAAmB,EAAU,QAAU,EAAU,MAE5D,EAAW,aAAa,EAAU,EAAqB,EAC3D,GAE+D,EAAkB,EAfjF,CAgBJ,EAMA,SAAS,wBAA0B,SAAU,GAEzC,GAAK,EAAL,CAIA,IAAI,EAAW,EAAW,aAAa,EAAM,GACzC,GACA,EAAW,mBAAmB,EAAM,QAAU,EAAW,MAE7D,EAAW,gBAAgB,EAAM,EANjC,CAOJ,EAKA,SAAS,kBAAoB,WAEzB,GAAK,EAAQ,mBAIb,OAAO,EAAQ,YAAY,SAAS,WAAW,SACnD,EAGA,SAAS,QAAU,EACnB,SAAS,WAAa,EACtB,SAAS,QAAU,EAMG,mBAAX,QAAyB,OAAO,IACvC,OAAO,WAAY,IAAI,WACnB,OAAO,QACX,IAEuB,iBAAX,QAAuB,OAAO,QAC1C,OAAO,QAAU,SAGjB,OAAO,SAAW,QAGzB,CA92BD,CA82BG,OAAO,QAAU,OAAO,OAAS,WAAc,KAAM,yBAA2B","file":"/npm/imgcache.js@1.1.1/js/imgcache.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/imgcache.js@1.1.1/js/imgcache.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*! imgcache.js\n   Copyright 2012-2017 Christophe BENOIT\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n*/\n\n/*jslint browser:true*/\n/*global console,LocalFileSystem,device,FileTransfer,define,module*/\n\nvar ImgCache = {\n        version: '1.1.0',\n        // options to override before using the library (but after loading this script!)\n        options: {\n            debug: false,                           /* call the log method ? */\n            localCacheFolder: 'imgcache',           /* name of the cache folder */\n            useDataURI: false,                      /* use src=\"data:..\"? otherwise will use src=\"filesystem:..\" */\n            chromeQuota: 10 * 1024 * 1024,          /* allocated cache space : here 10MB */\n            usePersistentCache: true,               /* false = use temporary cache storage */\n            cacheClearSize: 0,                      /* size in MB that triggers cache clear on init, 0 to disable */\n            headers: {},                            /* HTTP headers for the download requests -- e.g: headers: { 'Accept': 'application/jpg' } */\n            withCredentials: false,                 /* indicates whether or not cross-site Access-Control requests should be made using credentials */\n            skipURIencoding: false,                 /* enable if URIs are already encoded (skips call to sanitizeURI) */\n            cordovaFilesystemRoot: null,            /* if specified, use one of the Cordova File plugin's app directories for storage */\n            timeout: 0                              /* timeout delay in ms for xhr request */\n        },\n        overridables: {\n            hash: function (s) {\n                /* tiny-sha1 r4 (11/2011) - MIT License - http://code.google.com/p/tiny-sha1/ */\n                /* jshint ignore:start */\n                function U(a,b,c){while(0<c--)a.push(b)}function L(a,b){return(a<<b)|(a>>>(32-b))}function P(a,b,c){return a^b^c}function A(a,b){var c=(b&0xFFFF)+(a&0xFFFF),d=(b>>>16)+(a>>>16)+(c>>>16);return((d&0xFFFF)<<16)|(c&0xFFFF)}var B=\"0123456789abcdef\";return(function(a){var c=[],d=a.length*4,e;for(var i=0;i<d;i++){e=a[i>>2]>>((3-(i%4))*8);c.push(B.charAt((e>>4)&0xF)+B.charAt(e&0xF))}return c.join('')}((function(a,b){var c,d,e,f,g,h=a.length,v=0x67452301,w=0xefcdab89,x=0x98badcfe,y=0x10325476,z=0xc3d2e1f0,M=[];U(M,0x5a827999,20);U(M,0x6ed9eba1,20);U(M,0x8f1bbcdc,20);U(M,0xca62c1d6,20);a[b>>5]|=0x80<<(24-(b%32));a[(((b+65)>>9)<<4)+15]=b;for(var i=0;i<h;i+=16){c=v;d=w;e=x;f=y;g=z;for(var j=0,O=[];j<80;j++){O[j]=j<16?a[j+i]:L(O[j-3]^O[j-8]^O[j-14]^O[j-16],1);var k=(function(a,b,c,d,e){var f=(e&0xFFFF)+(a&0xFFFF)+(b&0xFFFF)+(c&0xFFFF)+(d&0xFFFF),g=(e>>>16)+(a>>>16)+(b>>>16)+(c>>>16)+(d>>>16)+(f>>>16);return((g&0xFFFF)<<16)|(f&0xFFFF)})(j<20?(function(t,a,b){return(t&a)^(~t&b)}(d,e,f)):j<40?P(d,e,f):j<60?(function(t,a,b){return(t&a)^(t&b)^(a&b)}(d,e,f)):P(d,e,f),g,M[j],O[j],L(c,5));g=f;f=e;e=L(d,30);d=c;c=k}v=A(v,c);w=A(w,d);x=A(x,e);y=A(y,f);z=A(z,g)}return[v,w,x,y,z]}((function(t){var a=[],b=255,c=t.length*8;for(var i=0;i<c;i+=8){a[i>>5]|=(t.charCodeAt(i/8)&b)<<(24-(i%32))}return a}(s)).slice(),s.length*8))));\n                /* jshint ignore:end */\n            },\n            log: function (str, level) {\n                    'use strict';\n                    if (ImgCache.options.debug) {\n                        if (level === LOG_LEVEL_INFO) { str = 'INFO: ' + str; }\n                        if (level === LOG_LEVEL_WARNING) { str = 'WARN: ' + str; }\n                        if (level === LOG_LEVEL_ERROR) { str = 'ERROR: ' + str; }\n                        console.log(str);\n                    }\n            }\n        },\n        ready: false,\n        attributes: {}\n    },\n    LOG_LEVEL_INFO = 1,\n    LOG_LEVEL_WARNING = 2,\n    LOG_LEVEL_ERROR = 3;\n\n(function ($) {\n\n    'use strict';\n\n    /** Helpers *****************************************************************/\n    var Helpers = {};\n\n    // make sure the url does not contain funny characters like spaces that might make the download fail\n    Helpers.sanitizeURI = function (uri) {\n        if (ImgCache.options.skipURIencoding) {\n            return uri;\n        } else {\n            if (uri.length >= 2 && uri[0] === '\"' && uri[uri.length - 1] === '\"') {\n              uri = uri.substr(1, uri.length - 2);\n            }\n            var encodedURI = encodeURI(uri);\n            /*\n            TODO: The following bit of code will have to be checked first (#30)\n            if (Helpers.isCordova()) {\n                return encodedURI.replace(/%/g, '%25');\n            }\n            */\n            return encodedURI;\n        }\n    };\n\n    // with a little help from http://code.google.com/p/js-uri/\n    Helpers.URI = function (str) {\n        if (!str) { str = ''; }\n        // Based on the regex in RFC2396 Appendix B.\n        var parser = /^(?:([^:\\/?\\#]+):)?(?:\\/\\/([^\\/?\\#]*))?([^?\\#]*)(?:\\?([^\\#]*))?(?:\\#(.*))?/,\n            result = str.match(parser);\n        this.scheme    = result[1] || null;\n        this.authority = result[2] || null;\n        this.path      = result[3] || null;\n        this.query     = result[4] || null;\n        this.fragment  = result[5] || null;\n    };\n    // returns lower cased filename from full URI\n    Helpers.URIGetFileName = function (fullpath) {\n        if (!fullpath) {\n            return;\n        }\n        //TODO: there must be a better way here.. (url encoded strings fail)\n        var idx = fullpath.lastIndexOf('/');\n        if (!idx) {\n            return;\n        }\n        return fullpath.substr(idx + 1).toLowerCase();\n    };\n\n    // returns lower cased path from full URI\n    Helpers.URIGetPath = function (str) {\n        if (!str) {\n            return;\n        }\n        var uri = Helpers.URI(str);\n        return uri.path.toLowerCase();\n    };\n\n    // returns extension from filename (without leading '.')\n    Helpers.fileGetExtension = function (filename) {\n        if (!filename) {\n            return '';\n        }\n        filename = filename.split('?')[0];\n        var ext = filename.split('.').pop();\n        // make sure it's a realistic file extension - for images no more than 4 characters long (.jpeg)\n        if (!ext || ext.length > 4) {\n            return '';\n        }\n        return ext;\n    };\n\n    Helpers.appendPaths = function (path1, path2) {\n        if (!path2) {\n            path2 = '';\n        }\n        if (!path1 || path1 === '') {\n            return (path2.length > 0 && path2[0] == '/' ? '' : '/') + path2;\n        }\n        return path1 + ( ((path1[path1.length - 1] == '/') || (path2.length > 0 && path2[0] == '/')) ? '' : '/' ) + path2;\n    };\n\n    Helpers.hasJqueryOrJqueryLite = function () {\n        return (ImgCache.jQuery || ImgCache.jQueryLite);\n    };\n\n    Helpers.isCordova = function () {\n        return (typeof cordova !== 'undefined' || typeof phonegap !== 'undefined');\n    };\n\n    Helpers.isCordovaAndroid = function () {\n        return (Helpers.isCordova() && device && device.platform && device.platform.toLowerCase().indexOf('android') >= 0);\n    };\n\n    Helpers.isCordovaWindowsPhone = function () {\n        return (Helpers.isCordova() && device && device.platform && ((device.platform.toLowerCase().indexOf('win32nt') >= 0) || (device.platform.toLowerCase().indexOf('windows') >= 0)));\n    };\n\n    Helpers.isCordovaIOS = function () {\n        return (Helpers.isCordova() && device && device.platform && device.platform.toLowerCase() === 'ios');\n    };\n\n    // special case for #93\n    Helpers.isCordovaAndroidOlderThan3_3 = function () {\n        return (Helpers.isCordovaAndroid() && device.version && (\n            device.version.indexOf('2.') === 0 ||\n            device.version.indexOf('3.0') === 0 ||\n            device.version.indexOf('3.1') === 0 ||\n            device.version.indexOf('3.2') === 0\n        ));\n    };\n\n    // special case for #47\n    Helpers.isCordovaAndroidOlderThan4 = function () {\n        return (Helpers.isCordovaAndroid() && device.version && (device.version.indexOf('2.') === 0 || device.version.indexOf('3.') === 0));\n    };\n\n    // Fix for #42 (Cordova versions < 4.0)\n    Helpers.EntryToURL = function (entry) {\n        if (Helpers.isCordovaAndroidOlderThan4() && typeof entry.toNativeURL === 'function') {\n            return entry.toNativeURL();\n        } else if (typeof entry.toInternalURL === 'function') {\n            // Fix for #97\n            return entry.toInternalURL();\n        } else {\n            return entry.toURL();\n        }\n    };\n\n    // Returns a URL that can be used to locate a file\n    Helpers.EntryGetURL = function (entry) {\n        // toURL for html5, toURI for cordova 1.x\n        return (typeof entry.toURL === 'function' ? Helpers.EntryToURL(entry) : entry.toURI());\n    };\n\n    // Returns the full absolute path from the root to the FileEntry\n    Helpers.EntryGetPath = function (entry) {\n        if (Helpers.isCordova()) {\n            // #93\n            if (Helpers.isCordovaIOS()) {\n                if (Helpers.isCordovaAndroidOlderThan3_3()) {\n                    return entry.fullPath;\n                } else {\n                    return entry.nativeURL;\n                }\n            }\n            // From Cordova 3.3 onward toURL() seems to be required instead of fullPath (#38)\n            return (typeof entry.toURL === 'function' ? Helpers.EntryToURL(entry) : entry.fullPath);\n        } else {\n            return entry.fullPath;\n        }\n    };\n\n    Helpers.getCordovaStorageType = function (isPersistent) {\n        // From Cordova 3.1 onward those constants have moved to the window object (#38)\n        if (typeof LocalFileSystem !== 'undefined') {\n            if (isPersistent && LocalFileSystem.hasOwnProperty('PERSISTENT')) {\n                return LocalFileSystem.PERSISTENT;\n            }\n            if (!isPersistent && LocalFileSystem.hasOwnProperty('TEMPORARY')) {\n                return LocalFileSystem.TEMPORARY;\n            }\n        }\n        return (isPersistent ? window.PERSISTENT : window.TEMPORARY);\n    };\n\n    /****************************************************************************/\n\n    /** DomHelpers **************************************************************/\n    var DomHelpers = {};\n\n    DomHelpers.trigger = function (DomElement, eventName) {\n        if (ImgCache.jQuery) {\n            $(DomElement).trigger(eventName);\n        } else {\n            /* CustomEvent polyfill */\n            if (Helpers.isCordovaWindowsPhone() || !window.CustomEvent) {\n                // CustomEvent for browsers which don't natively support the Constructor method\n                window.CustomEvent = function CustomEvent(type, params) {\n                    var event;\n                    params = params || {bubbles: false, cancelable: false, detail: undefined};\n                    try {\n                        event = document.createEvent('CustomEvent');\n                        event.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n                    } catch (error) {\n                        // for browsers that don't support CustomEvent at all, we use a regular event instead\n                        event = document.createEvent('Event');\n                        event.initEvent(type, params.bubbles, params.cancelable);\n                        event.detail = params.detail;\n                    }\n                    return event;\n                };\n            }\n            DomElement.dispatchEvent(new CustomEvent(eventName));\n        }\n    };\n\n    DomHelpers.removeAttribute = function (element, attrName) {\n        if (Helpers.hasJqueryOrJqueryLite()) {\n            element.removeAttr(attrName);\n        } else {\n            element.removeAttribute(attrName);\n        }\n    };\n    DomHelpers.setAttribute = function (element, attrName, value) {\n        if (Helpers.hasJqueryOrJqueryLite()) {\n            element.attr(attrName, value);\n        } else {\n            element.setAttribute(attrName, value);\n        }\n    };\n    DomHelpers.getAttribute = function (element, attrName) {\n        if (Helpers.hasJqueryOrJqueryLite()) {\n            return element.attr(attrName);\n        } else {\n            return element.getAttribute(attrName);\n        }\n    };\n    DomHelpers.getBackgroundImage = function (element) {\n        if (Helpers.hasJqueryOrJqueryLite()) {\n            return element.attr('data-old-background') ? \"url(\" + element.attr('data-old-background') + \")\" : element.css('background-image');\n        } else {\n            var style = window.getComputedStyle(element, null);\n            if (!style) {\n                return;\n            }\n            return element.getAttribute(\"data-old-background\") ? \"url(\" + element.getAttribute(\"data-old-background\") + \")\" : style.backgroundImage;\n        }\n    };\n    DomHelpers.setBackgroundImage = function (element, styleValue) {\n        if (Helpers.hasJqueryOrJqueryLite()) {\n            element.css('background-image', styleValue);\n        } else {\n            element.style.backgroundImage = styleValue;\n        }\n    };\n\n    /****************************************************************************/\n\n    /** Private *****************************************************************/\n    var Private = { attributes: {} };\n\n    Private.isImgCacheLoaded = function () {\n        if (!ImgCache.attributes.filesystem || !ImgCache.attributes.dirEntry) {\n            ImgCache.overridables.log('ImgCache not loaded yet! - Have you called ImgCache.init() first?', LOG_LEVEL_WARNING);\n            return false;\n        }\n        return true;\n    };\n\n    Private.attributes.hasLocalStorage = false;\n    Private.hasLocalStorage = function () {\n        // if already tested, avoid doing the check again\n        if (Private.attributes.hasLocalStorage) {\n            return Private.attributes.hasLocalStorage;\n        }\n        try {\n            var mod = ImgCache.overridables.hash('imgcache_test');\n            localStorage.setItem(mod, mod);\n            localStorage.removeItem(mod);\n            Private.attributes.hasLocalStorage = true;\n            return true;\n\n        } catch (e) {\n            // this is an info, not an error\n            ImgCache.overridables.log('Could not write to local storage: ' + e.message, LOG_LEVEL_INFO);\n            return false;\n        }\n    };\n\n    Private.setCurrentSize = function (curSize) {\n        ImgCache.overridables.log('current size: ' + curSize, LOG_LEVEL_INFO);\n        if (Private.hasLocalStorage()) {\n            localStorage.setItem('imgcache:' + ImgCache.options.localCacheFolder, curSize);\n        }\n    };\n\n    Private.getCachedFilePath = function (img_src) {\n        return Helpers.appendPaths(ImgCache.options.localCacheFolder, Private.getCachedFileName(img_src));\n    };\n\n    // used for FileTransfer.download only\n    Private.getCachedFileFullPath = function (img_src) {\n        var local_root = Helpers.EntryGetPath(ImgCache.attributes.dirEntry);\n        return Helpers.appendPaths(local_root, Private.getCachedFileName(img_src));\n    };\n\n    Private.getCachedFileName = function (img_src) {\n        if (!img_src) {\n            ImgCache.overridables.log('No source given to getCachedFileName', LOG_LEVEL_WARNING);\n            return;\n        }\n        var hash = ImgCache.overridables.hash(img_src);\n        var ext = Helpers.fileGetExtension(Helpers.URIGetFileName(img_src));\n        return hash + (ext ? ('.' + ext) : '');\n    };\n\n    Private.setNewImgPath = function ($img, new_src, old_src) {\n        DomHelpers.setAttribute($img, 'src', new_src);\n        // store previous url in case we need to reload it\n        DomHelpers.setAttribute($img, OLD_SRC_ATTR, old_src);\n    };\n\n    Private.createCacheDir = function (success_callback, error_callback) {\n        if (!ImgCache.attributes.filesystem) {\n            ImgCache.overridables.log('Filesystem instance was not initialised', LOG_LEVEL_ERROR);\n            if (error_callback) { error_callback(); }\n            return;\n        }\n\n        var _fail = function (error) {\n            ImgCache.overridables.log('Failed to get/create local cache directory: ' + error.code, LOG_LEVEL_ERROR);\n            if (error_callback) { error_callback(); }\n        };\n        var _getDirSuccess = function (dirEntry) {\n            ImgCache.attributes.dirEntry = dirEntry;\n            ImgCache.overridables.log('Local cache folder opened: ' + Helpers.EntryGetPath(dirEntry), LOG_LEVEL_INFO);\n\n            //Put .nomedia file in cache directory so Android doesn't index it.\n            if (Helpers.isCordovaAndroid()) {\n\n                var _androidNoMediaFileCreated = function () {\n                    ImgCache.overridables.log('.nomedia file created.', LOG_LEVEL_INFO);\n                    if (success_callback) { success_callback(); }\n                };\n\n                dirEntry.getFile('.nomedia', {create: true, exclusive: false}, _androidNoMediaFileCreated, _fail);\n            } else if (!Helpers.isCordovaWindowsPhone()) {\n                // #73 - iOS: the directory should not be backed up in iCloud\n                if (Helpers.isCordovaIOS() && dirEntry.setMetadata) {\n                    dirEntry.setMetadata(function () {\n                            /* success*/\n                            ImgCache.overridables.log('com.apple.MobileBackup metadata set', LOG_LEVEL_INFO);\n                        }, function () {\n                            /* failure */\n                            ImgCache.overridables.log('com.apple.MobileBackup metadata could not be set', LOG_LEVEL_WARNING);\n                        }, { 'com.apple.MobileBackup': 1 }\n                        // 1=NO backup oddly enough..\n                    );\n                }\n\n                if (success_callback) { success_callback(); }\n            } else {\n                if (success_callback) { success_callback(); }\n            }\n\n            ImgCache.ready = true;\n            DomHelpers.trigger(document, IMGCACHE_READY_TRIGGERED_EVENT);\n        };\n        ImgCache.attributes.filesystem.root.getDirectory(ImgCache.options.localCacheFolder, {create: true, exclusive: false}, _getDirSuccess, _fail);\n    };\n\n    // This is a wrapper for phonegap's FileTransfer object in order to implement the same feature\n    // in Chrome (and possibly extra browsers in the future)\n    Private.FileTransferWrapper = function (filesystem) {\n        if (Helpers.isCordova()) {\n            // PHONEGAP\n            this.fileTransfer = new FileTransfer();\n        }\n        this.filesystem = filesystem;    // only useful for CHROME\n    };\n    Private.FileTransferWrapper.prototype.download = function (uri, localPath, success_callback, error_callback, on_progress) {\n\n        var headers = ImgCache.options.headers || {};\n        var isOnProgressAvailable = (typeof on_progress === 'function');\n\n        if (this.fileTransfer) {\n            if (isOnProgressAvailable) {\n                this.fileTransfer.onprogress = on_progress;\n            }\n            return this.fileTransfer.download(uri, localPath, success_callback, error_callback, false, { 'headers': headers });\n        }\n\n        var filesystem = this.filesystem;\n\n        // CHROME - browsers\n        var _fail = function (str, level, error_callback) {\n            ImgCache.overridables.log(str, level);\n            // mock up FileTransferError, so at least caller knows there was a problem.\n            // Normally, the error.code in the callback is a FileWriter error, we return 0 if the error was an XHR error\n            if (error_callback) {\n                error_callback({code: 0, source: uri, target: localPath});\n            }\n        };\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', uri, true);\n        if (isOnProgressAvailable) {\n            xhr.onprogress = on_progress;\n        }\n\n        if (ImgCache.options.withCredentials) {\n            xhr.withCredentials = true;\n        }\n\n        xhr.timeout = ImgCache.options.timeout\n        xhr.responseType = 'blob';\n        for (var key in headers) {\n            xhr.setRequestHeader(key, headers[key]);\n        }\n        xhr.onload = function () {\n            if (xhr.response && (xhr.status === 200 || xhr.status === 0)) {\n                filesystem.root.getFile(localPath, { create:true }, function (fileEntry) {\n                    fileEntry.createWriter(function (writer) {\n                        writer.onerror = error_callback;\n                        writer.onwriteend = function () { success_callback(fileEntry);  };\n                        writer.write(xhr.response, error_callback);\n                    }, error_callback);\n                }, error_callback);\n            } else {\n                _fail('Image ' + uri + ' could not be downloaded - status: ' + xhr.status, 3, error_callback);\n            }\n        };\n        xhr.onerror = function () {\n            _fail('XHR error - Image ' + uri + ' could not be downloaded - status: ' + xhr.status, 3, error_callback);\n        };\n        xhr.send();\n    };\n\n    Private.getBackgroundImageURL = function ($div) {\n        var backgroundImageProperty = DomHelpers.getBackgroundImage($div);\n        if (!backgroundImageProperty) {\n            return;\n        }\n        var regexp = /url\\s?\\((.+)\\)/;\n        var img_src = regexp.exec(backgroundImageProperty)[1];\n        return img_src.replace(/(['\"])/g, '');\n    };\n\n    Private.loadCachedFile = function ($element, img_src, set_path_callback, success_callback, error_callback) {\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        if (!$element) {\n            return;\n        }\n\n        var filename = Helpers.URIGetFileName(img_src);\n\n        var _gotFileEntry = function (entry) {\n            if (ImgCache.options.useDataURI) {\n                var _win = function (file) {\n                    var reader = new FileReader();\n                    reader.onloadend = function (e) {\n                        // prefix with : 'data:' + mime_type + ';base64;' + .. ?\n                        /* var mime_type = '';\n                        if (filename && filename.length > 4) {\n                            //TODO: of course relying on extension is wrong.. but we trust our data here\n                            var ext = filename.substr(filename.length - 4).toLowerCase();\n                            if (ext == '.jpg' || ext == 'jpeg') {\n                                mime_type = 'image/jpeg';\n                            } else if (ext == '.png') {\n                                mime_type = 'image/png';\n                            } else if (ext == '.gif') {\n                                mime_type = 'image/gif';\n                            }\n                        } */\n                        var base64content = e.target.result;\n                        if (!base64content) {\n                            ImgCache.overridables.log('File in cache ' + filename + ' is empty', LOG_LEVEL_WARNING);\n                            if (error_callback) { error_callback($element); }\n                            return;\n                        }\n                        set_path_callback($element, base64content, img_src);\n                        ImgCache.overridables.log('File ' + filename + ' loaded from cache', LOG_LEVEL_INFO);\n                        if (success_callback) { success_callback($element); }\n                    };\n                    reader.readAsDataURL(file);\n                };\n                var _fail = function (error) {\n                    ImgCache.overridables.log('Failed to read file ' + error.code, LOG_LEVEL_ERROR);\n                    if (error_callback) { error_callback($element); }\n                };\n\n                entry.file(_win, _fail);\n            } else {\n                // using src=\"filesystem:\" kind of url\n                var new_url = Helpers.EntryGetURL(entry);\n                set_path_callback($element, new_url, img_src);\n                ImgCache.overridables.log('File ' + filename + ' loaded from cache', LOG_LEVEL_INFO);\n                if (success_callback) { success_callback($element); }\n            }\n        };\n        // if file does not exist in cache, cache it now!\n        var _fail = function () {\n            ImgCache.overridables.log('File ' + filename + ' not in cache', LOG_LEVEL_INFO);\n            if (error_callback) { error_callback($element); }\n        };\n        ImgCache.attributes.filesystem.root.getFile(Private.getCachedFilePath(img_src), {create: false}, _gotFileEntry, _fail);\n    };\n\n    /****************************************************************************/\n\n\n    var OLD_SRC_ATTR = 'data-old-src',\n        OLD_BACKGROUND_ATTR = 'data-old-background',\n        IMGCACHE_READY_TRIGGERED_EVENT = 'ImgCacheReady';\n\n    ImgCache.init = function (success_callback, error_callback) {\n        ImgCache.jQuery = (window.jQuery || window.Zepto) ? true : false;        /* using jQuery if it's available otherwise the DOM API */\n        ImgCache.jQueryLite = (typeof window.angular !== 'undefined' && window.angular.element) ? true : false;    /* is AngularJS jQueryLite available */\n\n        ImgCache.attributes.init_callback = success_callback;\n\n        ImgCache.overridables.log('ImgCache initialising', LOG_LEVEL_INFO);\n\n        var _checkSize = function (callback) {\n            if (ImgCache.options.cacheClearSize > 0) {\n                var curSize = ImgCache.getCurrentSize();\n                if (curSize > (ImgCache.options.cacheClearSize * 1024 * 1024)) {\n                    ImgCache.clearCache(callback, callback);\n                } else {\n                    if (callback) { callback(); }\n                }\n            } else {\n                if (callback) { callback(); }\n            }\n        };\n        var _gotFS = function (filesystem) {\n            ImgCache.overridables.log('LocalFileSystem opened', LOG_LEVEL_INFO);\n\n            // store filesystem handle\n            ImgCache.attributes.filesystem = filesystem;\n\n            Private.createCacheDir(function () {\n                _checkSize(ImgCache.attributes.init_callback);\n            }, error_callback);\n        };\n        var _fail = function (error) {\n            ImgCache.overridables.log('Failed to initialise LocalFileSystem ' + error.code, LOG_LEVEL_ERROR);\n            if (error_callback) { error_callback(); }\n        };\n        if (Helpers.isCordova() && window.requestFileSystem) {\n            // PHONEGAP\n            if (ImgCache.options.cordovaFilesystemRoot) {\n                try {\n                    window.resolveLocalFileSystemURL(\n                        ImgCache.options.cordovaFilesystemRoot,\n                        function (dirEntry) {\n                            _gotFS({ root: dirEntry });\n                        },\n                        _fail\n                    );\n                } catch (e) {\n                    _fail({ code: e.message })\n                }\n            } else {\n                window.requestFileSystem(Helpers.getCordovaStorageType(ImgCache.options.usePersistentCache), 0, _gotFS, _fail);\n            }\n        } else {\n            //CHROME\n            var savedFS = window.requestFileSystem || window.webkitRequestFileSystem;\n            window.storageInfo = window.storageInfo || (ImgCache.options.usePersistentCache ? navigator.webkitPersistentStorage : navigator.webkitTemporaryStorage);\n            if (!window.storageInfo) {\n                ImgCache.overridables.log('Your browser does not support the html5 File API', LOG_LEVEL_WARNING);\n                if (error_callback) { error_callback(); }\n                return;\n            }\n            // request space for storage\n            var quota_size = ImgCache.options.chromeQuota;\n            window.storageInfo.requestQuota(\n                quota_size,\n                function () {\n                    /* success*/\n                    var persistence = (ImgCache.options.usePersistentCache ? window.storageInfo.PERSISTENT : window.storageInfo.TEMPORARY);\n                    savedFS(persistence, quota_size, _gotFS, _fail);\n                },\n                function (error) {\n                    /* error*/\n                    ImgCache.overridables.log('Failed to request quota: ' + error.message, LOG_LEVEL_ERROR);\n                    if (error_callback) { error_callback(); }\n                }\n            );\n        }\n    };\n\n    ImgCache.getCurrentSize = function () {\n        if (Private.hasLocalStorage()) {\n            var curSize = localStorage.getItem('imgcache:' + ImgCache.options.localCacheFolder);\n            if (curSize === null) {\n                return 0;\n            }\n            return parseInt(curSize, 10);\n        } else {\n            return 0;\n        }\n    };\n\n    // this function will not check if the image is already cached or not => it will overwrite existing data\n    // on_progress callback follows this spec: http://www.w3.org/TR/2014/REC-progress-events-20140211/ -- see #54\n    ImgCache.cacheFile = function (img_src, success_callback, error_callback, on_progress) {\n\n        if (!Private.isImgCacheLoaded() || !img_src) {\n            return;\n        }\n\n        img_src = Helpers.sanitizeURI(img_src);\n\n        var filePath = Private.getCachedFileFullPath(img_src);\n\n        var fileTransfer = new Private.FileTransferWrapper(ImgCache.attributes.filesystem);\n        fileTransfer.download(\n            img_src,\n            filePath,\n            function (entry) {\n                entry.getMetadata(function (metadata) {\n                    if (metadata && ('size' in metadata)) {\n                        ImgCache.overridables.log('Cached file size: ' + metadata.size, LOG_LEVEL_INFO);\n                        Private.setCurrentSize(ImgCache.getCurrentSize() + parseInt(metadata.size, 10));\n                    } else {\n                        ImgCache.overridables.log('No metadata size property available', LOG_LEVEL_INFO);\n                    }\n                });\n                ImgCache.overridables.log('Download complete: ' + Helpers.EntryGetPath(entry), LOG_LEVEL_INFO);\n\n                // iOS: the file should not be backed up in iCloud\n                // new from cordova 1.8 only\n                if (entry.setMetadata) {\n                    entry.setMetadata(\n                        function () {\n                        /* success*/\n                            ImgCache.overridables.log('com.apple.MobileBackup metadata set', LOG_LEVEL_INFO);\n                        },\n                        function () {\n                        /* failure */\n                            ImgCache.overridables.log('com.apple.MobileBackup metadata could not be set', LOG_LEVEL_WARNING);\n                        },\n                        { 'com.apple.MobileBackup': 1 }\n                        // 1=NO backup oddly enough..\n                    );\n                }\n\n                if (success_callback) {\n                  success_callback(entry.toURL());\n                }\n            },\n            function (error) {\n                if (error.source) { ImgCache.overridables.log('Download error source: ' + error.source, LOG_LEVEL_ERROR); }\n                if (error.target) { ImgCache.overridables.log('Download error target: ' + error.target, LOG_LEVEL_ERROR); }\n                ImgCache.overridables.log('Download error code: ' + error.code, LOG_LEVEL_ERROR);\n                if (error_callback) { error_callback(); }\n            },\n            on_progress\n        );\n    };\n\n    // Returns the file already available in the cached\n    // Reminder: this is an asynchronous method!\n    // Answer to the question comes in response_callback as the second argument (first being the path)\n    ImgCache.getCachedFile = function (img_src, response_callback) {\n        // sanity check\n        if (!Private.isImgCacheLoaded() || !response_callback) {\n            return;\n        }\n\n        var original_img_src = img_src;\n        img_src = Helpers.sanitizeURI(img_src);\n\n        var path = Private.getCachedFilePath(img_src);\n        if (Helpers.isCordovaAndroid()) {\n            // This hack is probably only used for older versions of Cordova\n            if (path.indexOf('file://') === 0) {\n                // issue #4 -- android cordova specific\n                path = path.substr(7);\n            }\n        }\n\n        // try to get the file entry: if it fails, there's no such file in the cache\n        // if it fails, we send the original path, not the sanitized one.\n        ImgCache.attributes.filesystem.root.getFile(\n            path,\n            { create: false },\n            function (file_entry) { response_callback(img_src, file_entry); },\n            function () { response_callback(original_img_src, null); }\n        );\n    };\n\n    // Returns the local url of a file already available in the cache\n    ImgCache.getCachedFileURL = function (img_src, success_callback, error_callback) {\n        var _getURL = function (img_src, entry) {\n            if (!entry) {\n                if (error_callback) { error_callback(img_src); }\n            } else {\n                success_callback(img_src, Helpers.EntryGetURL(entry));\n            }\n        };\n\n        ImgCache.getCachedFile(img_src, _getURL);\n    };\n\n\n    // checks if a copy of the file has already been cached\n    // Reminder: this is an asynchronous method!\n    // Answer to the question comes in response_callback as the second argument (first being the path)\n    ImgCache.isCached = function (img_src, response_callback) {\n        ImgCache.getCachedFile(img_src, function (src, file_entry) {\n            response_callback(src, file_entry !== null);\n        });\n    };\n\n    // $img: jQuery object of an <img/> element\n    // Synchronous method\n    ImgCache.useOnlineFile = function ($img) {\n\n        if (!Private.isImgCacheLoaded() || !$img) {\n            return;\n        }\n\n        var prev_src = DomHelpers.getAttribute($img, OLD_SRC_ATTR);\n        if (prev_src) {\n            DomHelpers.setAttribute($img, 'src', prev_src);\n        }\n        DomHelpers.removeAttribute($img, OLD_SRC_ATTR);\n    };\n\n\n\n    // $img: jQuery object of an <img/> element\n    ImgCache.useCachedFile = function ($img, success_callback, error_callback) {\n\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        Private.loadCachedFile($img, DomHelpers.getAttribute($img, 'src'), Private.setNewImgPath, success_callback, error_callback);\n    };\n\n    // When the source url is not the 'src' attribute of the given img element\n    ImgCache.useCachedFileWithSource = function ($img, image_url, success_callback, error_callback) {\n\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        var img_url = Helpers.sanitizeURI(image_url);\n\n        Private.loadCachedFile($img, img_url, Private.setNewImgPath, success_callback, error_callback);\n    };\n\n    // clears the cache\n    ImgCache.clearCache = function (success_callback, error_callback) {\n\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        // delete cache dir completely\n        ImgCache.attributes.dirEntry.removeRecursively(\n            function () {\n                ImgCache.overridables.log('Local cache cleared', LOG_LEVEL_INFO);\n                Private.setCurrentSize(0);\n                // recreate the cache dir now\n                Private.createCacheDir(success_callback, error_callback);\n            },\n            function (error) {\n                ImgCache.overridables.log('Failed to remove directory or its contents: ' + error.code, LOG_LEVEL_ERROR);\n                if (error_callback) { error_callback(); }\n            }\n        );\n    };\n\n    ImgCache.removeFile = function (img_src, success_callback, error_callback) {\n\n        img_src = Helpers.sanitizeURI(img_src);\n\n        var filePath = Private.getCachedFilePath(img_src);\n        var _fail = function (error) {\n            ImgCache.overridables.log('Failed to remove file due to ' + error.code, LOG_LEVEL_ERROR);\n            if (error_callback) { error_callback(); }\n        };\n        ImgCache.attributes.filesystem.root.getFile(filePath, { create: false }, function (fileEntry) {\n            fileEntry.remove(\n                function () {\n                    if (success_callback) { success_callback(); }\n                },\n                _fail\n            );\n        }, _fail);\n    };\n\n    ImgCache.isBackgroundCached = function ($div, response_callback) {\n        var img_src = Private.getBackgroundImageURL($div);\n        ImgCache.getCachedFile(img_src, function (src, file_entry) {\n            response_callback(src, file_entry !== null);\n        });\n    };\n\n    ImgCache.cacheBackground = function ($div, success_callback, error_callback, on_progress) {\n\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        var img_src = Private.getBackgroundImageURL($div);\n        if (!img_src) {\n            ImgCache.overridables.log('No background to cache', LOG_LEVEL_WARNING);\n            if (error_callback) { error_callback(); }\n            return;\n        }\n\n        ImgCache.overridables.log('Background image URL: ' + img_src, LOG_LEVEL_INFO);\n        ImgCache.cacheFile(img_src, success_callback, error_callback, on_progress);\n    };\n\n    ImgCache.useCachedBackground = function ($div, success_callback, error_callback) {\n\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        var img_src = Private.getBackgroundImageURL($div);\n        if (!img_src) {\n            ImgCache.overridables.log('No background to cache', LOG_LEVEL_WARNING);\n            if (error_callback) { error_callback(); }\n            return;\n        }\n\n        var _setBackgroundImagePath = function ($element, new_src, old_src) {\n            DomHelpers.setBackgroundImage($element, 'url(\"' + new_src + '\")');\n            // store previous url in case we need to reload it\n            DomHelpers.setAttribute($element, OLD_BACKGROUND_ATTR, old_src);\n        };\n\n        Private.loadCachedFile($div, img_src, _setBackgroundImagePath, success_callback, error_callback);\n    };\n\n\n    // $div: jQuery object of an element\n    // Synchronous method\n    // Method used to revert call to useCachedBackground\n    ImgCache.useBackgroundOnlineFile = function ($div) {\n\n        if (!$div) {\n            return;\n        }\n\n        var prev_src = DomHelpers.getAttribute($div, OLD_BACKGROUND_ATTR);\n        if (prev_src) {\n            DomHelpers.setBackgroundImage($div, 'url(\"' + prev_src + '\")');\n        }\n        DomHelpers.removeAttribute($div, OLD_BACKGROUND_ATTR);\n    };\n\n    // returns the URI of the local cache folder (filesystem:)\n    // this function is more useful for the examples than for anything else..\n    // Synchronous method\n    ImgCache.getCacheFolderURI = function () {\n\n        if (!Private.isImgCacheLoaded()) {\n            return;\n        }\n\n        return Helpers.EntryGetURL(ImgCache.attributes.dirEntry);\n    };\n\n    // private methods can now be used publicly\n    ImgCache.helpers = Helpers;\n    ImgCache.domHelpers = DomHelpers;\n    ImgCache.private = Private;\n\n    /****************************************************************************/\n\n\n    // Expose the class either via AMD, CommonJS or the global object\n    if (typeof define === 'function' && define.amd) {\n        define('imgcache', [], function () {\n            return ImgCache;\n        });\n    }\n    else if (typeof module === 'object' && module.exports){\n        module.exports = ImgCache;\n    }\n    else {\n        window.ImgCache = ImgCache;\n    }\n\n})(window.jQuery || window.Zepto || function () { throw \"jQuery is not available\"; } );\n"]}