standalone backoffice
authorKilian Saffran <ksaffran@dks.lu>
Thu, 30 May 2019 12:48:28 +0000 (14:48 +0200)
committerKilian Saffran <ksaffran@dks.lu>
Thu, 30 May 2019 12:48:28 +0000 (14:48 +0200)
658 files changed:
backoffice/api/auth.cgi [moved from api/auth.cgi with 100% similarity]
backoffice/api/dks_1000.png [moved from api/dks_1000.png with 100% similarity]
backoffice/api/download.cgi [moved from api/download.cgi with 100% similarity]
backoffice/api/image.cgi [moved from api/image.cgi with 100% similarity]
backoffice/api/index.cgi [moved from api/index.cgi with 100% similarity]
backoffice/api/lib/CGI.pm [moved from lib/CGI.pm with 100% similarity]
backoffice/api/lib/CGI/Carp.pm [moved from lib/CGI/Carp.pm with 100% similarity]
backoffice/api/lib/CGI/Cookie.pm [moved from lib/CGI/Cookie.pm with 100% similarity]
backoffice/api/lib/CGI/File/Temp.pm [moved from lib/CGI/File/Temp.pm with 100% similarity]
backoffice/api/lib/CGI/Util.pm [moved from lib/CGI/Util.pm with 100% similarity]
backoffice/api/lib/DBD/DBM.pm [moved from lib/DBD/DBM.pm with 100% similarity]
backoffice/api/lib/DBD/ExampleP.pm [moved from lib/DBD/ExampleP.pm with 100% similarity]
backoffice/api/lib/DBD/File.pm [moved from lib/DBD/File.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer.pm [moved from lib/DBD/Gofer.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Policy/Base.pm [moved from lib/DBD/Gofer/Policy/Base.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Policy/classic.pm [moved from lib/DBD/Gofer/Policy/classic.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Policy/pedantic.pm [moved from lib/DBD/Gofer/Policy/pedantic.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Policy/rush.pm [moved from lib/DBD/Gofer/Policy/rush.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Transport/Base.pm [moved from lib/DBD/Gofer/Transport/Base.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Transport/corostream.pm [moved from lib/DBD/Gofer/Transport/corostream.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Transport/null.pm [moved from lib/DBD/Gofer/Transport/null.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Transport/pipeone.pm [moved from lib/DBD/Gofer/Transport/pipeone.pm with 100% similarity]
backoffice/api/lib/DBD/Gofer/Transport/stream.pm [moved from lib/DBD/Gofer/Transport/stream.pm with 100% similarity]
backoffice/api/lib/DBD/NullP.pm [moved from lib/DBD/NullP.pm with 100% similarity]
backoffice/api/lib/DBD/PgPP.pm [moved from lib/DBD/PgPP.pm with 100% similarity]
backoffice/api/lib/DBD/SQLite.pm [moved from lib/DBD/SQLite.pm with 100% similarity]
backoffice/api/lib/DBD/SQLite/Constants.pm [moved from lib/DBD/SQLite/Constants.pm with 100% similarity]
backoffice/api/lib/DBD/SQLite/GetInfo.pm [moved from lib/DBD/SQLite/GetInfo.pm with 100% similarity]
backoffice/api/lib/DBD/SQLite/VirtualTable.pm [moved from lib/DBD/SQLite/VirtualTable.pm with 100% similarity]
backoffice/api/lib/DBD/SQLite/VirtualTable/FileContent.pm [moved from lib/DBD/SQLite/VirtualTable/FileContent.pm with 100% similarity]
backoffice/api/lib/DBD/SQLite/VirtualTable/PerlData.pm [moved from lib/DBD/SQLite/VirtualTable/PerlData.pm with 100% similarity]
backoffice/api/lib/DBD/Sponge.pm [moved from lib/DBD/Sponge.pm with 100% similarity]
backoffice/api/lib/DBD/mysql.pm [moved from lib/DBD/mysql.pm with 100% similarity]
backoffice/api/lib/DBD/mysql/GetInfo.pm [moved from lib/DBD/mysql/GetInfo.pm with 100% similarity]
backoffice/api/lib/DBI.pm [moved from lib/DBI.pm with 100% similarity]
backoffice/api/lib/DBI/Const/GetInfo/ANSI.pm [moved from lib/DBI/Const/GetInfo/ANSI.pm with 100% similarity]
backoffice/api/lib/DBI/Const/GetInfo/ODBC.pm [moved from lib/DBI/Const/GetInfo/ODBC.pm with 100% similarity]
backoffice/api/lib/DBI/Const/GetInfoType.pm [moved from lib/DBI/Const/GetInfoType.pm with 100% similarity]
backoffice/api/lib/DBI/DBD/SqlEngine.pm [moved from lib/DBI/DBD/SqlEngine.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Execute.pm [moved from lib/DBI/Gofer/Execute.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Request.pm [moved from lib/DBI/Gofer/Request.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Response.pm [moved from lib/DBI/Gofer/Response.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Serializer/Base.pm [moved from lib/DBI/Gofer/Serializer/Base.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Serializer/DataDumper.pm [moved from lib/DBI/Gofer/Serializer/DataDumper.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Serializer/Storable.pm [moved from lib/DBI/Gofer/Serializer/Storable.pm with 100% similarity]
backoffice/api/lib/DBI/Gofer/Transport/Base.pm [moved from lib/DBI/Gofer/Transport/Base.pm with 100% similarity]
backoffice/api/lib/DBI/PurePerl.pm [moved from lib/DBI/PurePerl.pm with 100% similarity]
backoffice/api/lib/DBI/SQL/Nano.pm [moved from lib/DBI/SQL/Nano.pm with 100% similarity]
backoffice/api/lib/DBI/Util/_accessor.pm [moved from lib/DBI/Util/_accessor.pm with 100% similarity]
backoffice/api/lib/Digest/SHA/PurePerl.pm [moved from lib/Digest/SHA/PurePerl.pm with 100% similarity]
backoffice/api/lib/Fh.pm [moved from lib/Fh.pm with 100% similarity]
backoffice/api/lib/Font/TTF/Font.pm [moved from lib/Font/TTF/Font.pm with 100% similarity]
backoffice/api/lib/Font/TTF/Table.pm [moved from lib/Font/TTF/Table.pm with 100% similarity]
backoffice/api/lib/Font/TTF/Utils.pm [moved from lib/Font/TTF/Utils.pm with 100% similarity]
backoffice/api/lib/Font/TTF/Woff.pm [moved from lib/Font/TTF/Woff.pm with 100% similarity]
backoffice/api/lib/Font/TTF/Woff/MetaData.pm [moved from lib/Font/TTF/Woff/MetaData.pm with 100% similarity]
backoffice/api/lib/Font/TTF/Woff/PrivateData.pm [moved from lib/Font/TTF/Woff/PrivateData.pm with 100% similarity]
backoffice/api/lib/HTML/Entities.pm [moved from lib/HTML/Entities.pm with 100% similarity]
backoffice/api/lib/HTML/Parser.pm [moved from lib/HTML/Parser.pm with 100% similarity]
backoffice/api/lib/IO/String.pm [moved from lib/IO/String.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool.pm [moved from lib/Image/ExifTool.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool.pod [moved from lib/Image/ExifTool.pod with 100% similarity]
backoffice/api/lib/Image/ExifTool/AES.pm [moved from lib/Image/ExifTool/AES.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/AFCP.pm [moved from lib/Image/ExifTool/AFCP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/AIFF.pm [moved from lib/Image/ExifTool/AIFF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/APE.pm [moved from lib/Image/ExifTool/APE.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/APP12.pm [moved from lib/Image/ExifTool/APP12.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/ASF.pm [moved from lib/Image/ExifTool/ASF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Apple.pm [moved from lib/Image/ExifTool/Apple.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Audible.pm [moved from lib/Image/ExifTool/Audible.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/BMP.pm [moved from lib/Image/ExifTool/BMP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/BPG.pm [moved from lib/Image/ExifTool/BPG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/BZZ.pm [moved from lib/Image/ExifTool/BZZ.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/BigTIFF.pm [moved from lib/Image/ExifTool/BigTIFF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/BuildTagLookup.pm [moved from lib/Image/ExifTool/BuildTagLookup.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Canon.pm [moved from lib/Image/ExifTool/Canon.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/CanonCustom.pm [moved from lib/Image/ExifTool/CanonCustom.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/CanonRaw.pm [moved from lib/Image/ExifTool/CanonRaw.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/CanonVRD.pm [moved from lib/Image/ExifTool/CanonVRD.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/CaptureOne.pm [moved from lib/Image/ExifTool/CaptureOne.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Casio.pm [moved from lib/Image/ExifTool/Casio.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset.pm [moved from lib/Image/ExifTool/Charset.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Arabic.pm [moved from lib/Image/ExifTool/Charset/Arabic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Baltic.pm [moved from lib/Image/ExifTool/Charset/Baltic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Cyrillic.pm [moved from lib/Image/ExifTool/Charset/Cyrillic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/DOSLatin1.pm [moved from lib/Image/ExifTool/Charset/DOSLatin1.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/DOSLatinUS.pm [moved from lib/Image/ExifTool/Charset/DOSLatinUS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Greek.pm [moved from lib/Image/ExifTool/Charset/Greek.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Hebrew.pm [moved from lib/Image/ExifTool/Charset/Hebrew.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/JIS.pm [moved from lib/Image/ExifTool/Charset/JIS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Latin.pm [moved from lib/Image/ExifTool/Charset/Latin.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Latin2.pm [moved from lib/Image/ExifTool/Charset/Latin2.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacArabic.pm [moved from lib/Image/ExifTool/Charset/MacArabic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacChineseCN.pm [moved from lib/Image/ExifTool/Charset/MacChineseCN.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacChineseTW.pm [moved from lib/Image/ExifTool/Charset/MacChineseTW.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacCroatian.pm [moved from lib/Image/ExifTool/Charset/MacCroatian.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacCyrillic.pm [moved from lib/Image/ExifTool/Charset/MacCyrillic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacGreek.pm [moved from lib/Image/ExifTool/Charset/MacGreek.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacHebrew.pm [moved from lib/Image/ExifTool/Charset/MacHebrew.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacIceland.pm [moved from lib/Image/ExifTool/Charset/MacIceland.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacJapanese.pm [moved from lib/Image/ExifTool/Charset/MacJapanese.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacKorean.pm [moved from lib/Image/ExifTool/Charset/MacKorean.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacLatin2.pm [moved from lib/Image/ExifTool/Charset/MacLatin2.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacRSymbol.pm [moved from lib/Image/ExifTool/Charset/MacRSymbol.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacRoman.pm [moved from lib/Image/ExifTool/Charset/MacRoman.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacRomanian.pm [moved from lib/Image/ExifTool/Charset/MacRomanian.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacThai.pm [moved from lib/Image/ExifTool/Charset/MacThai.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/MacTurkish.pm [moved from lib/Image/ExifTool/Charset/MacTurkish.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/PDFDoc.pm [moved from lib/Image/ExifTool/Charset/PDFDoc.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/ShiftJIS.pm [moved from lib/Image/ExifTool/Charset/ShiftJIS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Symbol.pm [moved from lib/Image/ExifTool/Charset/Symbol.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Thai.pm [moved from lib/Image/ExifTool/Charset/Thai.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Turkish.pm [moved from lib/Image/ExifTool/Charset/Turkish.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Charset/Vietnam.pm [moved from lib/Image/ExifTool/Charset/Vietnam.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DICOM.pm [moved from lib/Image/ExifTool/DICOM.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DJI.pm [moved from lib/Image/ExifTool/DJI.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DNG.pm [moved from lib/Image/ExifTool/DNG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DPX.pm [moved from lib/Image/ExifTool/DPX.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DV.pm [moved from lib/Image/ExifTool/DV.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DarwinCore.pm [moved from lib/Image/ExifTool/DarwinCore.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/DjVu.pm [moved from lib/Image/ExifTool/DjVu.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/EXE.pm [moved from lib/Image/ExifTool/EXE.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Exif.pm [moved from lib/Image/ExifTool/Exif.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/FLAC.pm [moved from lib/Image/ExifTool/FLAC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/FLIF.pm [moved from lib/Image/ExifTool/FLIF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/FLIR.pm [moved from lib/Image/ExifTool/FLIR.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Fixup.pm [moved from lib/Image/ExifTool/Fixup.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Flash.pm [moved from lib/Image/ExifTool/Flash.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/FlashPix.pm [moved from lib/Image/ExifTool/FlashPix.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Font.pm [moved from lib/Image/ExifTool/Font.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/FotoStation.pm [moved from lib/Image/ExifTool/FotoStation.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/FujiFilm.pm [moved from lib/Image/ExifTool/FujiFilm.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/GE.pm [moved from lib/Image/ExifTool/GE.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/GIF.pm [moved from lib/Image/ExifTool/GIF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/GIMP.pm [moved from lib/Image/ExifTool/GIMP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/GPS.pm [moved from lib/Image/ExifTool/GPS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/GeoTiff.pm [moved from lib/Image/ExifTool/GeoTiff.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Geotag.pm [moved from lib/Image/ExifTool/Geotag.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/GoPro.pm [moved from lib/Image/ExifTool/GoPro.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/H264.pm [moved from lib/Image/ExifTool/H264.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/HP.pm [moved from lib/Image/ExifTool/HP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/HTML.pm [moved from lib/Image/ExifTool/HTML.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/HtmlDump.pm [moved from lib/Image/ExifTool/HtmlDump.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/ICC_Profile.pm [moved from lib/Image/ExifTool/ICC_Profile.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/ID3.pm [moved from lib/Image/ExifTool/ID3.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/IPTC.pm [moved from lib/Image/ExifTool/IPTC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/ISO.pm [moved from lib/Image/ExifTool/ISO.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/ITC.pm [moved from lib/Image/ExifTool/ITC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Import.pm [moved from lib/Image/ExifTool/Import.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/InDesign.pm [moved from lib/Image/ExifTool/InDesign.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/JPEG.pm [moved from lib/Image/ExifTool/JPEG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/JPEGDigest.pm [moved from lib/Image/ExifTool/JPEGDigest.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/JSON.pm [moved from lib/Image/ExifTool/JSON.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/JVC.pm [moved from lib/Image/ExifTool/JVC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Jpeg2000.pm [moved from lib/Image/ExifTool/Jpeg2000.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Kodak.pm [moved from lib/Image/ExifTool/Kodak.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/KyoceraRaw.pm [moved from lib/Image/ExifTool/KyoceraRaw.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/LNK.pm [moved from lib/Image/ExifTool/LNK.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/cs.pm [moved from lib/Image/ExifTool/Lang/cs.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/de.pm [moved from lib/Image/ExifTool/Lang/de.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/en_ca.pm [moved from lib/Image/ExifTool/Lang/en_ca.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/en_gb.pm [moved from lib/Image/ExifTool/Lang/en_gb.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/es.pm [moved from lib/Image/ExifTool/Lang/es.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/fi.pm [moved from lib/Image/ExifTool/Lang/fi.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/fr.pm [moved from lib/Image/ExifTool/Lang/fr.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/it.pm [moved from lib/Image/ExifTool/Lang/it.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/ja.pm [moved from lib/Image/ExifTool/Lang/ja.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/ko.pm [moved from lib/Image/ExifTool/Lang/ko.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/nl.pm [moved from lib/Image/ExifTool/Lang/nl.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/pl.pm [moved from lib/Image/ExifTool/Lang/pl.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/ru.pm [moved from lib/Image/ExifTool/Lang/ru.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/sv.pm [moved from lib/Image/ExifTool/Lang/sv.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/tr.pm [moved from lib/Image/ExifTool/Lang/tr.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/zh_cn.pm [moved from lib/Image/ExifTool/Lang/zh_cn.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lang/zh_tw.pm [moved from lib/Image/ExifTool/Lang/zh_tw.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Leaf.pm [moved from lib/Image/ExifTool/Leaf.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Lytro.pm [moved from lib/Image/ExifTool/Lytro.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/M2TS.pm [moved from lib/Image/ExifTool/M2TS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MIE.pm [moved from lib/Image/ExifTool/MIE.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MIEUnits.pod [moved from lib/Image/ExifTool/MIEUnits.pod with 100% similarity]
backoffice/api/lib/Image/ExifTool/MIFF.pm [moved from lib/Image/ExifTool/MIFF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MNG.pm [moved from lib/Image/ExifTool/MNG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MOI.pm [moved from lib/Image/ExifTool/MOI.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MPC.pm [moved from lib/Image/ExifTool/MPC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MPEG.pm [moved from lib/Image/ExifTool/MPEG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MPF.pm [moved from lib/Image/ExifTool/MPF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MWG.pm [moved from lib/Image/ExifTool/MWG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MXF.pm [moved from lib/Image/ExifTool/MXF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MacOS.pm [moved from lib/Image/ExifTool/MacOS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MakerNotes.pm [moved from lib/Image/ExifTool/MakerNotes.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Matroska.pm [moved from lib/Image/ExifTool/Matroska.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Microsoft.pm [moved from lib/Image/ExifTool/Microsoft.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Minolta.pm [moved from lib/Image/ExifTool/Minolta.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/MinoltaRaw.pm [moved from lib/Image/ExifTool/MinoltaRaw.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Motorola.pm [moved from lib/Image/ExifTool/Motorola.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Nikon.pm [moved from lib/Image/ExifTool/Nikon.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/NikonCapture.pm [moved from lib/Image/ExifTool/NikonCapture.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/NikonCustom.pm [moved from lib/Image/ExifTool/NikonCustom.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Nintendo.pm [moved from lib/Image/ExifTool/Nintendo.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/OOXML.pm [moved from lib/Image/ExifTool/OOXML.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Ogg.pm [moved from lib/Image/ExifTool/Ogg.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Olympus.pm [moved from lib/Image/ExifTool/Olympus.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/OpenEXR.pm [moved from lib/Image/ExifTool/OpenEXR.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Opus.pm [moved from lib/Image/ExifTool/Opus.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PCX.pm [moved from lib/Image/ExifTool/PCX.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PDF.pm [moved from lib/Image/ExifTool/PDF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PGF.pm [moved from lib/Image/ExifTool/PGF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PICT.pm [moved from lib/Image/ExifTool/PICT.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PLIST.pm [moved from lib/Image/ExifTool/PLIST.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PLUS.pm [moved from lib/Image/ExifTool/PLUS.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PNG.pm [moved from lib/Image/ExifTool/PNG.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PPM.pm [moved from lib/Image/ExifTool/PPM.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PSP.pm [moved from lib/Image/ExifTool/PSP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Palm.pm [moved from lib/Image/ExifTool/Palm.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Panasonic.pm [moved from lib/Image/ExifTool/Panasonic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PanasonicRaw.pm [moved from lib/Image/ExifTool/PanasonicRaw.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Pentax.pm [moved from lib/Image/ExifTool/Pentax.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PhaseOne.pm [moved from lib/Image/ExifTool/PhaseOne.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PhotoCD.pm [moved from lib/Image/ExifTool/PhotoCD.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PhotoMechanic.pm [moved from lib/Image/ExifTool/PhotoMechanic.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Photoshop.pm [moved from lib/Image/ExifTool/Photoshop.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PostScript.pm [moved from lib/Image/ExifTool/PostScript.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/PrintIM.pm [moved from lib/Image/ExifTool/PrintIM.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Qualcomm.pm [moved from lib/Image/ExifTool/Qualcomm.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/QuickTime.pm [moved from lib/Image/ExifTool/QuickTime.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/QuickTimeStream.pl [moved from lib/Image/ExifTool/QuickTimeStream.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/README [moved from lib/Image/ExifTool/README with 100% similarity]
backoffice/api/lib/Image/ExifTool/RIFF.pm [moved from lib/Image/ExifTool/RIFF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/RSRC.pm [moved from lib/Image/ExifTool/RSRC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/RTF.pm [moved from lib/Image/ExifTool/RTF.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Radiance.pm [moved from lib/Image/ExifTool/Radiance.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Rawzor.pm [moved from lib/Image/ExifTool/Rawzor.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Real.pm [moved from lib/Image/ExifTool/Real.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Reconyx.pm [moved from lib/Image/ExifTool/Reconyx.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Red.pm [moved from lib/Image/ExifTool/Red.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Ricoh.pm [moved from lib/Image/ExifTool/Ricoh.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Samsung.pm [moved from lib/Image/ExifTool/Samsung.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Sanyo.pm [moved from lib/Image/ExifTool/Sanyo.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Scalado.pm [moved from lib/Image/ExifTool/Scalado.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Shift.pl [moved from lib/Image/ExifTool/Shift.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/Shortcuts.pm [moved from lib/Image/ExifTool/Shortcuts.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Sigma.pm [moved from lib/Image/ExifTool/Sigma.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/SigmaRaw.pm [moved from lib/Image/ExifTool/SigmaRaw.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Sony.pm [moved from lib/Image/ExifTool/Sony.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/SonyIDC.pm [moved from lib/Image/ExifTool/SonyIDC.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Stim.pm [moved from lib/Image/ExifTool/Stim.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/TagInfoXML.pm [moved from lib/Image/ExifTool/TagInfoXML.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/TagLookup.pm [moved from lib/Image/ExifTool/TagLookup.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/TagNames.pod [moved from lib/Image/ExifTool/TagNames.pod with 100% similarity]
backoffice/api/lib/Image/ExifTool/Theora.pm [moved from lib/Image/ExifTool/Theora.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Torrent.pm [moved from lib/Image/ExifTool/Torrent.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Unknown.pm [moved from lib/Image/ExifTool/Unknown.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/VCard.pm [moved from lib/Image/ExifTool/VCard.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Validate.pm [moved from lib/Image/ExifTool/Validate.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/Vorbis.pm [moved from lib/Image/ExifTool/Vorbis.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/WTV.pm [moved from lib/Image/ExifTool/WTV.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/WriteCanonRaw.pl [moved from lib/Image/ExifTool/WriteCanonRaw.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WriteExif.pl [moved from lib/Image/ExifTool/WriteExif.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WriteIPTC.pl [moved from lib/Image/ExifTool/WriteIPTC.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WritePDF.pl [moved from lib/Image/ExifTool/WritePDF.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WritePNG.pl [moved from lib/Image/ExifTool/WritePNG.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WritePhotoshop.pl [moved from lib/Image/ExifTool/WritePhotoshop.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WritePostScript.pl [moved from lib/Image/ExifTool/WritePostScript.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WriteQuickTime.pl [moved from lib/Image/ExifTool/WriteQuickTime.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/WriteXMP.pl [moved from lib/Image/ExifTool/WriteXMP.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/Writer.pl [moved from lib/Image/ExifTool/Writer.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/XMP.pm [moved from lib/Image/ExifTool/XMP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/XMP2.pl [moved from lib/Image/ExifTool/XMP2.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/XMPStruct.pl [moved from lib/Image/ExifTool/XMPStruct.pl with 100% similarity]
backoffice/api/lib/Image/ExifTool/ZIP.pm [moved from lib/Image/ExifTool/ZIP.pm with 100% similarity]
backoffice/api/lib/Image/ExifTool/iWork.pm [moved from lib/Image/ExifTool/iWork.pm with 100% similarity]
backoffice/api/lib/Image/Size.pm [moved from lib/Image/Size.pm with 100% similarity]
backoffice/api/lib/JSON/PP.pm [moved from lib/JSON/PP.pm with 100% similarity]
backoffice/api/lib/JSON/PP/Boolean.pm [moved from lib/JSON/PP/Boolean.pm with 100% similarity]
backoffice/api/lib/PDF/API2.pm [moved from lib/PDF/API2.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Annotation.pm [moved from lib/PDF/API2/Annotation.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Array.pm [moved from lib/PDF/API2/Basic/PDF/Array.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Bool.pm [moved from lib/PDF/API2/Basic/PDF/Bool.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Dict.pm [moved from lib/PDF/API2/Basic/PDF/Dict.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/File.pm [moved from lib/PDF/API2/Basic/PDF/File.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Filter.pm [moved from lib/PDF/API2/Basic/PDF/Filter.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Filter/ASCII85Decode.pm [moved from lib/PDF/API2/Basic/PDF/Filter/ASCII85Decode.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Filter/ASCIIHexDecode.pm [moved from lib/PDF/API2/Basic/PDF/Filter/ASCIIHexDecode.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Filter/FlateDecode.pm [moved from lib/PDF/API2/Basic/PDF/Filter/FlateDecode.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Filter/LZWDecode.pm [moved from lib/PDF/API2/Basic/PDF/Filter/LZWDecode.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Filter/RunLengthDecode.pm [moved from lib/PDF/API2/Basic/PDF/Filter/RunLengthDecode.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Literal.pm [moved from lib/PDF/API2/Basic/PDF/Literal.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Name.pm [moved from lib/PDF/API2/Basic/PDF/Name.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Null.pm [moved from lib/PDF/API2/Basic/PDF/Null.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Number.pm [moved from lib/PDF/API2/Basic/PDF/Number.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Objind.pm [moved from lib/PDF/API2/Basic/PDF/Objind.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Page.pm [moved from lib/PDF/API2/Basic/PDF/Page.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Pages.pm [moved from lib/PDF/API2/Basic/PDF/Pages.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/String.pm [moved from lib/PDF/API2/Basic/PDF/String.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Basic/PDF/Utils.pm [moved from lib/PDF/API2/Basic/PDF/Utils.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Content.pm [moved from lib/PDF/API2/Content.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Content/Text.pm [moved from lib/PDF/API2/Content/Text.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Matrix.pm [moved from lib/PDF/API2/Matrix.pm with 100% similarity]
backoffice/api/lib/PDF/API2/NamedDestination.pm [moved from lib/PDF/API2/NamedDestination.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Outline.pm [moved from lib/PDF/API2/Outline.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Outlines.pm [moved from lib/PDF/API2/Outlines.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Page.pm [moved from lib/PDF/API2/Page.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource.pm [moved from lib/PDF/API2/Resource.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/BaseFont.pm [moved from lib/PDF/API2/Resource/BaseFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/CIDFont.pm [moved from lib/PDF/API2/Resource/CIDFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/CIDFont/CJKFont.pm [moved from lib/PDF/API2/Resource/CIDFont/CJKFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/CIDFont/TrueType.pm [moved from lib/PDF/API2/Resource/CIDFont/TrueType.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/CIDFont/TrueType/FontFile.pm [moved from lib/PDF/API2/Resource/CIDFont/TrueType/FontFile.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace.pm [moved from lib/PDF/API2/Resource/ColorSpace.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace/DeviceN.pm [moved from lib/PDF/API2/Resource/ColorSpace/DeviceN.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace/Indexed.pm [moved from lib/PDF/API2/Resource/ColorSpace/Indexed.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace/Indexed/ACTFile.pm [moved from lib/PDF/API2/Resource/ColorSpace/Indexed/ACTFile.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace/Indexed/Hue.pm [moved from lib/PDF/API2/Resource/ColorSpace/Indexed/Hue.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace/Indexed/WebColor.pm [moved from lib/PDF/API2/Resource/ColorSpace/Indexed/WebColor.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ColorSpace/Separation.pm [moved from lib/PDF/API2/Resource/ColorSpace/Separation.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Colors.pm [moved from lib/PDF/API2/Resource/Colors.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/ExtGState.pm [moved from lib/PDF/API2/Resource/ExtGState.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font.pm [moved from lib/PDF/API2/Resource/Font.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/BdFont.pm [moved from lib/PDF/API2/Resource/Font/BdFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont.pm [moved from lib/PDF/API2/Resource/Font/CoreFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/bankgothic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/bankgothic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/courier.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/courier.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/courierbold.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/courierbold.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/courierboldoblique.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/courierboldoblique.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/courieroblique.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/courieroblique.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/georgia.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/georgia.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/georgiabold.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/georgiabold.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/georgiabolditalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/georgiabolditalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/georgiaitalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/georgiaitalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/helvetica.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/helvetica.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/helveticabold.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/helveticabold.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/helveticaboldoblique.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/helveticaboldoblique.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/helveticaoblique.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/helveticaoblique.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/symbol.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/symbol.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/timesbold.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/timesbold.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/timesbolditalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/timesbolditalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/timesitalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/timesitalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/timesroman.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/timesroman.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/trebuchet.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/trebuchet.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/trebuchetbold.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/trebuchetbold.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/trebuchetbolditalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/trebuchetbolditalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/trebuchetitalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/trebuchetitalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/verdana.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/verdana.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/verdanabold.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/verdanabold.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/verdanabolditalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/verdanabolditalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/verdanaitalic.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/verdanaitalic.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/webdings.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/webdings.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/wingdings.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/wingdings.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/CoreFont/zapfdingbats.pm [moved from lib/PDF/API2/Resource/Font/CoreFont/zapfdingbats.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/Postscript.pm [moved from lib/PDF/API2/Resource/Font/Postscript.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Font/SynFont.pm [moved from lib/PDF/API2/Resource/Font/SynFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Glyphs.pm [moved from lib/PDF/API2/Resource/Glyphs.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/PaperSizes.pm [moved from lib/PDF/API2/Resource/PaperSizes.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Pattern.pm [moved from lib/PDF/API2/Resource/Pattern.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/Shading.pm [moved from lib/PDF/API2/Resource/Shading.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/UniFont.pm [moved from lib/PDF/API2/Resource/UniFont.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject.pm [moved from lib/PDF/API2/Resource/XObject.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form.pm [moved from lib/PDF/API2/Resource/XObject/Form.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/BarCode.pm [moved from lib/PDF/API2/Resource/XObject/Form/BarCode.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/BarCode/codabar.pm [moved from lib/PDF/API2/Resource/XObject/Form/BarCode/codabar.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/BarCode/code128.pm [moved from lib/PDF/API2/Resource/XObject/Form/BarCode/code128.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/BarCode/code3of9.pm [moved from lib/PDF/API2/Resource/XObject/Form/BarCode/code3of9.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/BarCode/ean13.pm [moved from lib/PDF/API2/Resource/XObject/Form/BarCode/ean13.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/BarCode/int2of5.pm [moved from lib/PDF/API2/Resource/XObject/Form/BarCode/int2of5.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Form/Hybrid.pm [moved from lib/PDF/API2/Resource/XObject/Form/Hybrid.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image.pm [moved from lib/PDF/API2/Resource/XObject/Image.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/GD.pm [moved from lib/PDF/API2/Resource/XObject/Image/GD.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/GIF.pm [moved from lib/PDF/API2/Resource/XObject/Image/GIF.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/JPEG.pm [moved from lib/PDF/API2/Resource/XObject/Image/JPEG.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/PNG.pm [moved from lib/PDF/API2/Resource/XObject/Image/PNG.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/PNM.pm [moved from lib/PDF/API2/Resource/XObject/Image/PNM.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/TIFF.pm [moved from lib/PDF/API2/Resource/XObject/Image/TIFF.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Resource/XObject/Image/TIFF/File.pm [moved from lib/PDF/API2/Resource/XObject/Image/TIFF/File.pm with 100% similarity]
backoffice/api/lib/PDF/API2/Util.pm [moved from lib/PDF/API2/Util.pm with 100% similarity]
backoffice/api/lib/PDF/Table.pm [moved from lib/PDF/Table.pm with 100% similarity]
backoffice/api/lib/Template.pm [moved from lib/Template.pm with 100% similarity]
backoffice/api/lib/Template/Base.pm [moved from lib/Template/Base.pm with 100% similarity]
backoffice/api/lib/Template/Config.pm [moved from lib/Template/Config.pm with 100% similarity]
backoffice/api/lib/Template/Constants.pm [moved from lib/Template/Constants.pm with 100% similarity]
backoffice/api/lib/Template/Context.pm [moved from lib/Template/Context.pm with 100% similarity]
backoffice/api/lib/Template/Directive.pm [moved from lib/Template/Directive.pm with 100% similarity]
backoffice/api/lib/Template/Document.pm [moved from lib/Template/Document.pm with 100% similarity]
backoffice/api/lib/Template/Exception.pm [moved from lib/Template/Exception.pm with 100% similarity]
backoffice/api/lib/Template/Filters.pm [moved from lib/Template/Filters.pm with 100% similarity]
backoffice/api/lib/Template/Grammar.pm [moved from lib/Template/Grammar.pm with 100% similarity]
backoffice/api/lib/Template/Iterator.pm [moved from lib/Template/Iterator.pm with 100% similarity]
backoffice/api/lib/Template/Namespace/Constants.pm [moved from lib/Template/Namespace/Constants.pm with 100% similarity]
backoffice/api/lib/Template/Parser.pm [moved from lib/Template/Parser.pm with 100% similarity]
backoffice/api/lib/Template/Plugin.pm [moved from lib/Template/Plugin.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Assert.pm [moved from lib/Template/Plugin/Assert.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/CGI.pm [moved from lib/Template/Plugin/CGI.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/DBI.pm [moved from lib/Template/Plugin/DBI.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Datafile.pm [moved from lib/Template/Plugin/Datafile.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Date.pm [moved from lib/Template/Plugin/Date.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Directory.pm [moved from lib/Template/Plugin/Directory.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Dumper.pm [moved from lib/Template/Plugin/Dumper.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/File.pm [moved from lib/Template/Plugin/File.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Filter.pm [moved from lib/Template/Plugin/Filter.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Format.pm [moved from lib/Template/Plugin/Format.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/HTML.pm [moved from lib/Template/Plugin/HTML.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Image.pm [moved from lib/Template/Plugin/Image.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Iterator.pm [moved from lib/Template/Plugin/Iterator.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Math.pm [moved from lib/Template/Plugin/Math.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Pod.pm [moved from lib/Template/Plugin/Pod.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Procedural.pm [moved from lib/Template/Plugin/Procedural.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Scalar.pm [moved from lib/Template/Plugin/Scalar.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/String.pm [moved from lib/Template/Plugin/String.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Table.pm [moved from lib/Template/Plugin/Table.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/URL.pm [moved from lib/Template/Plugin/URL.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/View.pm [moved from lib/Template/Plugin/View.pm with 100% similarity]
backoffice/api/lib/Template/Plugin/Wrap.pm [moved from lib/Template/Plugin/Wrap.pm with 100% similarity]
backoffice/api/lib/Template/Plugins.pm [moved from lib/Template/Plugins.pm with 100% similarity]
backoffice/api/lib/Template/Provider.pm [moved from lib/Template/Provider.pm with 100% similarity]
backoffice/api/lib/Template/Service.pm [moved from lib/Template/Service.pm with 100% similarity]
backoffice/api/lib/Template/Stash.pm [moved from lib/Template/Stash.pm with 100% similarity]
backoffice/api/lib/Template/Stash/Context.pm [moved from lib/Template/Stash/Context.pm with 100% similarity]
backoffice/api/lib/Template/Stash/XS.pm [moved from lib/Template/Stash/XS.pm with 100% similarity]
backoffice/api/lib/Template/Test.pm [moved from lib/Template/Test.pm with 100% similarity]
backoffice/api/lib/Template/Toolkit.pm [moved from lib/Template/Toolkit.pm with 100% similarity]
backoffice/api/lib/Template/VMethods.pm [moved from lib/Template/VMethods.pm with 100% similarity]
backoffice/api/lib/Template/View.pm [moved from lib/Template/View.pm with 100% similarity]
backoffice/api/lib/URI/Encode.pm [moved from lib/URI/Encode.pm with 100% similarity]
backoffice/api/lib/auto/DBD/SQLite/SQLite.so [moved from lib/auto/DBD/SQLite/SQLite.so with 100% similarity]
backoffice/api/lib/auto/DBD/mysql/mysql.so [moved from lib/auto/DBD/mysql/mysql.so with 100% similarity]
backoffice/api/lib/auto/DBI/DBI.so [moved from lib/auto/DBI/DBI.so with 100% similarity]
backoffice/api/lib/auto/DBI/DBIXS.h [moved from lib/auto/DBI/DBIXS.h with 100% similarity]
backoffice/api/lib/auto/DBI/Driver.xst [moved from lib/auto/DBI/Driver.xst with 100% similarity]
backoffice/api/lib/auto/DBI/Driver_xst.h [moved from lib/auto/DBI/Driver_xst.h with 100% similarity]
backoffice/api/lib/auto/DBI/dbd_xsh.h [moved from lib/auto/DBI/dbd_xsh.h with 100% similarity]
backoffice/api/lib/auto/DBI/dbi_sql.h [moved from lib/auto/DBI/dbi_sql.h with 100% similarity]
backoffice/api/lib/auto/DBI/dbipport.h [moved from lib/auto/DBI/dbipport.h with 100% similarity]
backoffice/api/lib/auto/DBI/dbivport.h [moved from lib/auto/DBI/dbivport.h with 100% similarity]
backoffice/api/lib/auto/DBI/dbixs_rev.h [moved from lib/auto/DBI/dbixs_rev.h with 100% similarity]
backoffice/api/lib/auto/HTML/Parser/Parser.so [moved from lib/auto/HTML/Parser/Parser.so with 100% similarity]
backoffice/api/lib/auto/Template/Stash/XS/XS.so [moved from lib/auto/Template/Stash/XS/XS.so with 100% similarity]
backoffice/api/lib/auto/share/dist/DBD-SQLite/sqlite3.c [moved from lib/auto/share/dist/DBD-SQLite/sqlite3.c with 100% similarity]
backoffice/api/lib/auto/share/dist/DBD-SQLite/sqlite3.h [moved from lib/auto/share/dist/DBD-SQLite/sqlite3.h with 100% similarity]
backoffice/api/lib/auto/share/dist/DBD-SQLite/sqlite3ext.h [moved from lib/auto/share/dist/DBD-SQLite/sqlite3ext.h with 100% similarity]
backoffice/api/lib/pgsql.pm [moved from api/lib/pgsql.pm with 99% similarity]
backoffice/api/lib/report.pm [moved from api/lib/report.pm with 100% similarity]
backoffice/api/lib/sendemail.pm [moved from api/lib/sendemail.pm with 100% similarity]
backoffice/api/lib/session.pm [moved from api/lib/session.pm with 99% similarity]
backoffice/api/pgsql.cgi [moved from api/pgsql.cgi with 100% similarity]
backoffice/api/prefs.cgi [moved from api/prefs.cgi with 100% similarity]
backoffice/api/process.cgi [moved from api/process.cgi with 77% similarity]
backoffice/api/reports/DKS_JD190517-000002.pdf [moved from api/reports/DKS_JD190517-000002.pdf with 100% similarity]
backoffice/api/reports/DKS_JD201905-000020.pdf [moved from api/reports/DKS_JD201905-000020.pdf with 100% similarity]
backoffice/api/sendEmail [moved from api/sendEmail with 100% similarity]
backoffice/api/sql.log [moved from api/sql.log with 66% similarity]
backoffice/api/sqlite.cgi [moved from api/sqlite.cgi with 100% similarity]
backoffice/api/upload.cgi [moved from api/upload.cgi with 100% similarity]
backoffice/index.cgi
backoffice/js/modules_global.js
backoffice/lib.old/createpdfA4invoice [moved from backoffice/lib/createpdfA4invoice with 100% similarity]
backoffice/lib.old/pgsql.pm [moved from backoffice/lib/pgsql.pm with 100% similarity]
backoffice/lib.old/sendEmail [moved from backoffice/lib/sendEmail with 100% similarity]
backoffice/lib.old/session.pm [moved from backoffice/lib/session.pm with 100% similarity]
backoffice/sql.log
backoffice/tmpl/block/sidebar.tt
backoffice/tmpl/block/topbar.tt
backoffice/tmpl/module/rendezvous/calendar.js [deleted file]
backoffice/tmpl/module/rendezvous/calendar.tt [deleted file]
backoffice/tmpl/module/rendezvous/css.tt
backoffice/tmpl/module/rendezvous/index.js [new file with mode: 0644]
backoffice/tmpl/module/rendezvous/index.tt
backoffice/tmpl/module/rendezvous/javascript.tt
backoffice/tmpl/module/rendezvous/old_clientlist.tt [moved from backoffice/tmpl/module/rendezvous/clientlist.tt with 100% similarity]
backoffice/tmpl/module/rendezvous/old_index.tt [new file with mode: 0644]
backoffice/tmpl/module/rendezvous/old_oldrdvlist.tt [moved from backoffice/tmpl/module/rendezvous/oldrdvlist.tt with 100% similarity]
backoffice/tmpl/module/rendezvous/old_timesheet.tt [moved from backoffice/tmpl/module/rendezvous/timesheet.tt with 100% similarity]
backoffice/tmpl/module/rendezvous/old_timesheetlist.tt [moved from backoffice/tmpl/module/rendezvous/timesheetlist.tt with 100% similarity]
backoffice/tmpl/module/rendezvous/old_weekcalendar.tt [moved from backoffice/tmpl/module/rendezvous/weekcalendar.tt with 100% similarity]
backoffice/tmpl/skeleton/index.tt
backoffice/tmpl/skeleton/module.tt
backoffice/vendors/fullcalendar/bootstrap/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/bootstrap/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales-all.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales-all.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/af.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar-dz.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar-kw.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar-ly.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar-ma.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar-sa.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar-tn.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ar.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/bg.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/bs.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ca.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/cs.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/da.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/de.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/el.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/en-au.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/en-gb.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/en-nz.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/es-us.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/es.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/et.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/eu.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/fa.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/fi.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/fr-ca.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/fr-ch.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/fr.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/gl.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/he.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/hi.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/hr.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/hu.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/id.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/is.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/it.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ja.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ka.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/kk.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ko.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/lb.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/lt.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/lv.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/mk.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ms.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/nb.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/nl.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/nn.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/pl.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/pt-br.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/pt.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ro.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/ru.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/sk.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/sl.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/sq.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/sr-cyrl.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/sr.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/sv.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/th.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/tr.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/uk.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/vi.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/zh-cn.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/locales/zh-tw.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/core/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/daygrid/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/fullcalendar.css [deleted file]
backoffice/vendors/fullcalendar/fullcalendar.d.ts [deleted file]
backoffice/vendors/fullcalendar/fullcalendar.js [deleted file]
backoffice/vendors/fullcalendar/fullcalendar.min.css [deleted file]
backoffice/vendors/fullcalendar/fullcalendar.min.js [deleted file]
backoffice/vendors/fullcalendar/fullcalendar.print.css [deleted file]
backoffice/vendors/fullcalendar/fullcalendar.print.min.css [deleted file]
backoffice/vendors/fullcalendar/gcal.js [deleted file]
backoffice/vendors/fullcalendar/gcal.min.js [deleted file]
backoffice/vendors/fullcalendar/interaction/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/interaction/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/interaction/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/interaction/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/interaction/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/interaction/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/list/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/locale-all.js [deleted file]
backoffice/vendors/fullcalendar/locale/de.js [deleted file]
backoffice/vendors/fullcalendar/locale/en-gb.js [deleted file]
backoffice/vendors/fullcalendar/locale/fr.js [deleted file]
backoffice/vendors/fullcalendar/luxon/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/luxon/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/luxon/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/luxon/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/luxon/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/luxon/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment-timezone/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment-timezone/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment-timezone/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment-timezone/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment-timezone/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment-timezone/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/moment/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-common/LICENSE.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-common/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-common/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-common/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-common/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-common/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-daygrid/LICENSE.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-daygrid/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-daygrid/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-daygrid/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-daygrid/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-daygrid/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timegrid/LICENSE.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timegrid/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timegrid/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timegrid/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timegrid/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timegrid/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/LICENSE.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/resource-timeline/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/rrule/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/rrule/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/rrule/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/rrule/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/rrule/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/rrule/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/LICENSE.txt [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/timegrid/package.json [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/LICENSE.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/README.md [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/main.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/main.d.ts [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/main.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/main.min.css [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/main.min.js [new file with mode: 0644]
backoffice/vendors/fullcalendar/timeline/package.json [new file with mode: 0644]
index.cgi

similarity index 100%
rename from api/auth.cgi
rename to backoffice/api/auth.cgi
similarity index 100%
rename from api/dks_1000.png
rename to backoffice/api/dks_1000.png
similarity index 100%
rename from api/download.cgi
rename to backoffice/api/download.cgi
similarity index 100%
rename from api/image.cgi
rename to backoffice/api/image.cgi
similarity index 100%
rename from api/index.cgi
rename to backoffice/api/index.cgi
similarity index 100%
rename from lib/CGI.pm
rename to backoffice/api/lib/CGI.pm
similarity index 100%
rename from lib/DBD/DBM.pm
rename to backoffice/api/lib/DBD/DBM.pm
similarity index 100%
rename from lib/DBI.pm
rename to backoffice/api/lib/DBI.pm
similarity index 100%
rename from lib/Fh.pm
rename to backoffice/api/lib/Fh.pm
similarity index 100%
rename from lib/JSON/PP.pm
rename to backoffice/api/lib/JSON/PP.pm
similarity index 99%
rename from api/lib/pgsql.pm
rename to backoffice/api/lib/pgsql.pm
index a326419..a0ad75e 100644 (file)
@@ -1,5 +1,7 @@
 package pgsql;
 use strict;
+use lib ('.');
+use lib ('./api/lib');
 use DBI;
 use File::Basename;
 #use DBD::mysql;
@@ -7,8 +9,7 @@ use Data::Dumper;
 use Digest::SHA::PurePerl qw(sha256_hex);
 
 # use lib (dirname($0).'/../lib');
-use lib ('.');
-use lib ('./lib');
+
 use DBD::PgPP;
 use URI::Encode qw(uri_encode uri_decode);
 #use DBD::SQLite;
similarity index 99%
rename from api/lib/session.pm
rename to backoffice/api/lib/session.pm
index 861b463..1c763f1 100644 (file)
@@ -1,11 +1,11 @@
 package session;
 
 use strict;
-use File::Basename;
-use Digest::SHA qw(sha256_hex);
 use lib ('.');
-use lib ('./lib');
 use lib ('./api/lib');
+use File::Basename;
+use Digest::SHA qw(sha256_hex);
+
 use pgsql;
 use sendemail;
 use Data::Dumper;
similarity index 100%
rename from api/pgsql.cgi
rename to backoffice/api/pgsql.cgi
similarity index 100%
rename from api/prefs.cgi
rename to backoffice/api/prefs.cgi
similarity index 77%
rename from api/process.cgi
rename to backoffice/api/process.cgi
index 591cc5c..5518bc8 100644 (file)
@@ -95,6 +95,41 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
       $html->{result}->{id} = $retid->{0};
       #$p->{table},#$p->{field},$p->{value},$p->{id},$p->{type}
     }
+    elsif ($p->{fn} eq "saveform"){
+      # $html->{p} = $p;
+      $html->{result}->{ident} = $p->{ident};
+      delete $p->{ident};
+      delete $p->{fn};
+      delete $p->{sid};
+      my $retid=undef;
+      my $type = "upd";
+      foreach my $px (keys(%{$p})){
+        $html->{result}->{datafield} = $px;
+        #$p->{$px} = $db->securetext($p->{$px});
+        if (($px =~ /\_id$/) && ($p->{$px} eq "")){
+          $type = "ins";
+          
+        }
+      }
+      my @sql = ();
+      if ($type eq "ins"){
+        @sql = $db->create_ddl_insert($p);
+      } 
+      else {
+        @sql = $db->create_ddl_update($p);
+      } 
+      # $html->{sql} = \@sql;
+      foreach my $s (@sql){
+        #if ($type eq "ins"){
+          $retid= $db->dbquerysorted($s);
+        #}else {
+          
+        #}
+        
+      }
+      $html->{result}->{id} = $retid->{0};
+      #$p->{table},#$p->{field},$p->{value},$p->{id},$p->{type}
+    }
     elsif ($p->{fn} eq "paypal_payement"){
       # open (FF,">>paypalpayement.txt");
       # print FF Dumper($p);
@@ -131,6 +166,12 @@ if (($cgi->request_method() eq "GET") || ($cgi->request_method() eq "POST")){
       my $rep = report->new();
       $rep->generatepdf($invid,'invoices','invoicedata','pdfname','invoice_dks','fr',dirname($ENV{"SCRIPT_FILENAME"}).'/reports');
     }
+    elsif($p->{fn} eq "getevents"){
+      my $sql = "select * from geteventsbydisponibility(".$sess->{id}.",date('".$p->{startdate}."'),date('".$p->{enddate}."')) order by startdate,starttime;";
+      my $res = $db->dbquerysorted($sql);
+      $html->{result}->{sql} = $sql;
+      $html->{result}->{events} = $res;
+    }
   }
   
 }
similarity index 100%
rename from api/sendEmail
rename to backoffice/api/sendEmail
similarity index 66%
rename from api/sql.log
rename to backoffice/api/sql.log
index 8d124b5..184cd11 100644 (file)
@@ -1199,3 +1199,572 @@ and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
 ==
 UPDATE lawyercategories SET id_catalog='102',selection=null,id_category='15' WHERE id='201';
 ==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-01'),date('2019-06-01')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-01'),date('2019-06-01')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-01'),date('2019-06-01')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-04-01'),date('2019-04-08')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-04-01'),date('2019-05-01')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-05-27'),date('2019-06-03')) order by startdate,starttime;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select * from geteventsbydisponibility(4,date('2019-06-01'),date('2019-07-01')) order by startdate,starttime;
+==
similarity index 100%
rename from api/sqlite.cgi
rename to backoffice/api/sqlite.cgi
similarity index 100%
rename from api/upload.cgi
rename to backoffice/api/upload.cgi
index 82313e8..b412459 100644 (file)
@@ -2,8 +2,7 @@
 
 use strict;
 use File::Basename qw/dirname basename/;
-use lib ('../api/lib');
-use lib ('../lib');
+use lib ('./api/lib');
 use Template;
 # use Template::Constants qw( :debug );
 use CGI;
index 83ee899..6be2989 100644 (file)
@@ -1,4 +1,4 @@
- var apiurl = "http://localhost/juridig_lu/api/";
+ var apiurl = "http://localhost/juridig_lu/backoffice/";
  function process_data(data,callback){
    
   //  console.log("process data");
index 41a0ca0..750becc 100644 (file)
@@ -7134,3 +7134,4348 @@ left join appaccess ac on (us.id=ac.id_user)
 where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
 and se.remote_addr='::1'
 and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='B37784F8ogItGd7706fQ533P0t0DaI065s82a62528P37w20r0'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+
+==
+select id from users where username='kilian@juridig.lu' and userpassword='0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec' and confirmkey is null and blocked is null;
+==
+
+==
+DELETE FROM sessions where id_user='4' and remote_addr='::1' and user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36';
+==
+
+==
+INSERT INTO sessions (id_user, idsession, remote_addr, user_agent) VALUES('4', 'a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh', '::1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='a75Na1oWBJrONV0WHq3lns4c77NtB4dIOlIH3r4XQmkD3Sxrgh'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select id from users where username='kilian@juridig.lu' and userpassword='0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec' and confirmkey is null and blocked is null;
+==
+
+==
+DELETE FROM sessions where id_user='4' and remote_addr='::1' and user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36';
+==
+
+==
+INSERT INTO sessions (id_user, idsession, remote_addr, user_agent) VALUES('4', '70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D', '::1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+DELETE FROM sessions WHERE idsession='70B6k0F6d0bo874S7830OC3d33N407b7c6aDhOpPxNXL05DH0D';
+==
+
+==
+select id from users where username='kilian@juridig.lu' and userpassword='0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec' and confirmkey is null and blocked is null;
+==
+
+==
+DELETE FROM sessions where id_user='4' and remote_addr='::1' and user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36';
+==
+
+==
+INSERT INTO sessions (id_user, idsession, remote_addr, user_agent) VALUES('4', '4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61', '::1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4TN2DI122115p51cSAfTMDARseL5upTmnHNU2812jWJ7V2Qt61'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select id from users where username='kilian@juridig.lu' and userpassword='0ecf731e2426a8a469f06e9f4a3bcbed6f8071d9d3e3ef7ef5fd9165021e27ec' and confirmkey is null and blocked is null;
+==
+
+==
+DELETE FROM sessions where id_user='4' and remote_addr='::1' and user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36';
+==
+
+==
+INSERT INTO sessions (id_user, idsession, remote_addr, user_agent) VALUES('4', '4E8GhJOx3X4J3XeutbrJoP874obO6KH3KIb3CiIL7qdMsH5B0F', '::1', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36');
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4E8GhJOx3X4J3XeutbrJoP874obO6KH3KIb3CiIL7qdMsH5B0F'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4E8GhJOx3X4J3XeutbrJoP874obO6KH3KIb3CiIL7qdMsH5B0F'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4E8GhJOx3X4J3XeutbrJoP874obO6KH3KIb3CiIL7qdMsH5B0F'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
+
+==
+select se.idsession,us.id,us.username,us.email,us.prename,us.surname from sessions se 
+join users us on (us.id=se.id_user) 
+left join appaccess ac on (us.id=ac.id_user)
+where se.idsession='4E8GhJOx3X4J3XeutbrJoP874obO6KH3KIb3CiIL7qdMsH5B0F'
+and se.remote_addr='::1'
+and se.user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' and us.confirmkey is null and blocked is null;
+==
index 4602687..a2a8638 100644 (file)
@@ -1,4 +1,4 @@
-[% viewapps = pgdb.prepare("select getactivated_apps as appname from getactivated_apps(?) order by appname;") %]
+[% viewapps = pgdb.prepare("select * from getactivated_apps2(?) order by name;") %]
 <nav class="sidebar sidebar-offcanvas" id="sidebar">
         <ul class="nav">
           <!-- <li class="nav-item">
             </a>
           </li>
           [% FOREACH myapps = viewapps.execute(session.id) %]
-          [% IF myapps.appname == 'annuaire' %]
           <li class="nav-item">
-            <a class="nav-link" href="javascript:backoffice.loadpage('module/annuaire/index.html');">
-              <i class="mdi mdi-contact-mail menu-icon"></i>
-              <span class="menu-title">Annuaire</span>
+            <a class="nav-link" href="javascript:backoffice.loadpage('module/[% myapps.app %]/index.html');">
+              <span class="menu-title">[% myapps.name %]</span>
             </a>
           </li>
           [% END %]
-          [% IF myapps.appname == 'rendezvous' %]
-          <li class="nav-item">
-            <a class="nav-link" data-toggle="collapse" href="#ui-basic" aria-expanded="false" aria-controls="ui-basic">
-              <i class="mdi mdi-circle-outline menu-icon"></i>
-              <span class="menu-title">Rendez-Vous</span>
-              <i class="menu-arrow"></i>
-            </a>
-            <div class="collapse" id="ui-basic">
-              <ul class="nav flex-column sub-menu">
-                <li class="nav-item"> <a class="nav-link" href="javascript:backoffice.loadpage('module/rendezvous/calendar.html');">Calendrier</a></li>
-                <li class="nav-item"> <a class="nav-link" href="javascript:backoffice.loadpage('module/rendezvous/index.html');">Mes Rendez-Vous</a></li>
-                <li class="nav-item"> <a class="nav-link" href="javascript:backoffice.loadpage('module/rendezvous/oldrdvlist.html');">Anciens Rendez-Vous</a></li>
-                <li class="nav-item"> <a class="nav-link" href="javascript:backoffice.loadpage('module/rendezvous/clientlist.html');">List de clients</a></li>
-                
-                <li class="nav-item"> <a class="nav-link" href="javascript:backoffice.loadpage('module/rendezvous/timesheetlist.html');">Mes Horaires</a></li>
-                <li class="nav-item"> <a class="nav-link" href="javascript:backoffice.loadpage('module/rendezvous/weekcalendar.html');">Calendrier/Horaires</a></li>
-              </ul>
-            </div>
-          </li>
-          [% END %]
-          [% END %]
         </ul>
         
       </nav>
\ No newline at end of file
index f670981..24dccd7 100644 (file)
@@ -25,7 +25,7 @@
               <span class="nav-profile-name"><i class="mdi mdi-account"></i> [% session.prename %] [% session.surname %]</span>
             </a>
             <div class="dropdown-menu dropdown-menu-right navbar-dropdown" aria-labelledby="profileDropdown">
-              <a class="dropdown-item" href="javascript:backoffice.loadpage('module/profile.html');">
+              <a class="dropdown-item" href="javascript:backoffice.loadpage('module/profile/index.html');">
                 <i class="mdi mdi-settings"></i>
                 Profile
               </a>
diff --git a/backoffice/tmpl/module/rendezvous/calendar.js b/backoffice/tmpl/module/rendezvous/calendar.js
deleted file mode 100644 (file)
index e69de29..0000000
diff --git a/backoffice/tmpl/module/rendezvous/calendar.tt b/backoffice/tmpl/module/rendezvous/calendar.tt
deleted file mode 100644 (file)
index 5366b01..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<h1>[% pagename %] [% module %]</h1>
\ No newline at end of file
index e555bff..f163763 100644 (file)
@@ -1,4 +1,23 @@
-[% IF pagename == 'calendar' %]
-  <link rel="stylesheet" href="[% abspath %]vendors/fontawesome/css/all.min.css" >
-  <link rel="stylesheet" href="../../vendors/fullcalendar/fullcalendar.min.css" >
-[% END%]
\ No newline at end of file
+<link rel="stylesheet" href="[% abspath %]vendors/fontawesome/css/all.min.css" >
+    <link rel="stylesheet" href="[% abspath %]vendors/fullcalendar/core/main.min.css">
+    <link rel="stylesheet" href="n[% abspath %]vendors/fullcalendar/daygrid/main.min.css">
+    <link rel="stylesheet" href="[% abspath %]vendors/fullcalendar/timegrid/main.min.css">
+    <link rel="stylesheet" href="[% abspath %]vendors/fullcalendar/list/main.min.css">
+    <link rel="stylesheet" href="[% abspath %]vendors/fullcalendar/bootstrap/main.min.css">
+    <style>
+      .event-free {
+        color: #686868;
+      }
+      .event-confirmed {
+        color: #71c016;
+      }
+      .event-notconfirmed {
+        color: #ffc100;
+      }
+      .event-canceled {
+        color: #7859df;
+      }
+      .event-exception {
+        color: #ff4747;
+      }
+    </style>
diff --git a/backoffice/tmpl/module/rendezvous/index.js b/backoffice/tmpl/module/rendezvous/index.js
new file mode 100644 (file)
index 0000000..ae10d65
--- /dev/null
@@ -0,0 +1,162 @@
+var calendar = null;
+
+document.addEventListener('DOMContentLoaded', function() {
+  var calendarEl = document.getElementById('calendar');
+  
+  calendar = new FullCalendar.Calendar(calendarEl, {
+    customButtons: {
+      addEventButton: {
+        text: 'Nouveau RDV',
+        click: function() {
+          var dateStr = prompt('Enter a date in YYYY-MM-DD format');
+          var date = new Date(dateStr + 'T00:00:00'); // will be in local time
+
+          if (!isNaN(date.valueOf())) { // valid?
+            calendar.addEvent({
+              title: 'dynamic event',
+              start: date,
+              allDay: true
+            });
+            alert('Great. Now, update your database...');
+          } else {
+            alert('Invalid date.');
+          }
+        }
+      }
+    },
+    plugins: [ 'bootstrap','interaction', 'dayGrid', 'timeGrid','list' ],
+    defaultView: 'timeGridWeek',
+    themeSystem: 'bootstrap',
+    defaultDate: new Date().toISOString().substring(0,10),
+    allDaySlot: false,
+    weekNumbers: true,
+    header: {
+      left: 'prev,next today addEventButton',
+      center: 'title',
+      right: 'dayGridMonth,timeGridWeek,listMonth'
+    },
+    firstDay: 1,
+    dateClick: function() {
+      alert('a day has been clicked!');
+    },
+    eventClick: function(info) {
+      var eventObj = info.event;
+      alert('Clicked ' + eventObj.title);
+    },
+    viewSkeletonRender: function(info){
+      console.log("SKEL Render");
+      console.log(info);
+      getevents();
+    },
+    viewSkeletonDestroy: function(info){
+      console.log("SKEL Destroy");
+      removeEvents();
+    },
+    businessHours: {
+      daysOfWeek: [ 1, 2, 3, 4 , 5 ], // Monday - Thursday
+      startTime: '10:00', // a start time (10am in this example)
+      endTime: '18:00', // an end time (6pm in this example)
+    },
+    viewRender: function(view, element){
+      console.log("View Changed!");
+    },
+    eventTimeFormat: { // like '14:30:00'
+      hour: '2-digit',
+      minute: '2-digit'
+    },
+    selectable: true,
+    locale: 'fr'
+    
+  });
+
+  calendar.render();
+  //getevents();
+});
+
+function getevents(){
+  
+  var rdvtypes = [];
+  $('input[type=checkbox]').each(function(){
+    if ($(this).prop("checked")){
+      rdvtypes.push($(this).val()); 
+    }  
+  });
+  console.log(calendar);
+  var pdata = {"fn":"getevents","types":rdvtypes,startdate:calendar.view.props.dateProfile.currentRange.start.toISOString().substring(0,10),enddate:calendar.view.props.dateProfile.currentRange.end.toISOString().substring(0,10)};
+  //console.log(pdata);
+  process_data(pdata,events_callback);
+}
+
+function removeEvents(){
+  var ev = calendar.getEvents();
+  for (var e in ev){
+    var rev = calendar.getEventById(ev[e].id);
+    rev.remove();
+  }
+}
+
+function events_callback(data){
+  //console.log(data);
+  for (var i in data.events){
+    //console.log(i);
+    calendar.addEvent({
+      id: data.events[i].id_event,
+      title: data.events[i].eventname,
+      start: data.events[i].startdate + "T" + data.events[i].starttime,
+      end: data.events[i].enddate + "T" + data.events[i].endtime,
+      color: $('#lbl' + data.events[i].eventcolor).css('color')
+    });
+  }
+
+}
+
+
+// events: [
+//   {
+//     title: 'Prename1 Surname2',
+//     start: '2019-05-01T08:00',
+//     color: '#ff00ff'
+//   },
+//   {
+//     title: 'Long Event',
+//     start: '2019-05-07T',
+//     end: '2019-05-07'
+//   },
+//   {
+//     groupId: '999',
+//     title: 'Repeating Event',
+//     start: '2019-05-09T16:00:00'
+//   },
+//   {
+//     groupId: '999',
+//     title: 'Repeating Event',
+//     start: '2019-05-16T16:00:00'
+//   },
+//   {
+//     title: 'Conference',
+//     start: '2019-05-11',
+//     end: '2019-05-13'
+//   },
+//   {
+//     title: 'Meeting',
+//     start: '2019-05-12T10:30:00',
+//     end: '2019-05-12T12:30:00'
+//   },
+//   {
+//     title: 'Lunch',
+//     start: '2019-05-12T12:00:00'
+//   },
+//   {
+//     title: 'Meeting',
+//     start: '2019-05-12T14:30:00'
+//   },
+//   {
+//     title: 'Birthday Party',
+//     start: '2019-05-13T07:00:00'
+//   },
+//   {
+//     title: 'Click for Google',
+//     start: '2019-05-28'
+//   }
+// ]
\ No newline at end of file
index 5eb0b2f..2bbad8c 100644 (file)
@@ -1,83 +1,26 @@
-[% IF session.group == 'avocat' %]
-[% rdvlist = pgdb.prepare("select ev.id,DATE_FORMAT(ev.eventdate,'%d/%m/%Y') as eventdate,ev.eventhour,ev.eventoptions,usr.userprename,usr.usersurname,ev.user_status,ev.client_status,ev.clientuuid,ev.useruuid from events ev LEFT JOIN users usr on (ev.id_client=usr.id) where ev.id_user=? and ev.eventdate >= CURRENT_DATE order by eventdate DESC,eventhour ASC;"); %]
-[% ELSE %]
-[% rdvlist =pgdb.prepare("select ev.id,DATE_FORMAT(ev.eventdate,'%d/%m/%Y') as eventdate,ev.eventoptions,ev.eventhour,usr.userprename,usr.usersurname,ev.user_status,ev.client_status,ev.clientuuid,ev.useruuid from events ev LEFT JOIN users usr on (ev.id_user=usr.id) where ev.id_client=? and ev.eventdate >= CURRENT_DATE order by eventdate DESC,eventhour ASC;") %]
-[% END %]
-<h5>Mes Rendez-Vous</h5>
-<table class="table table-striped table-bordered"  data-toggle="table">
-<thead class="thead-dark"><tr>
-<th data-sortable="true">Date</th>
-        <th data-sortable="true">Heure</th>
-        <th data-sortable="true">
-          [% IF session.group == 'client'%]
-            Avocat
-          [% ELSE %]
-            Client
-          [% END %]
-        <th data-sortable="true">Options</th>
-        <th data-sortable="true">Mon status</th>
-        <th data-sortable="true">
-        [% IF session.group == 'client'%]
-           Status  Avocat
-          [% ELSE %]
-           Status  Client
-          [% END %]
-        </th>
-        <th>Action</th>
-        </tr></thead>
-        <tbody>
-        [% FOREACH rdv = rdvlist.execute(session.id) %]
-        <tr data-id="[% rdv.id %]">
-                <td>[% rdv.eventdate %]</td>
-                <td>[% rdv.eventhour %]</td>
-                <td>[% rdv.usersurname'].' '.$row['userprename %]</td>
-                <td>[% rdv.eventoptions %]</td>
-                [% IF $user['usergroup'] == 'client' %]
-                    <td>[% IFrdv.client_status == 'unconfirmed' %]
-                      <span class="text-warning">PAS CONFIRMÉ</span>
-                    [% ELSIF  rdv.client_status == 'canceled' %]
-                      <span class="text-danger">ANNULÉ</span>
-                    [% ELSIF  rdv.client_status == 'confirmed' %]
-                      <span class="text-success">CONFIRMÉ</span>
-                    [% ELSE %]
-                      <span class="text-warning">INCONNUE</span>
-                    [% END %]</td>
-                    <td>[% IF rdv.user_status == 'unconfirmed' %]
-                      <span class="text-warning">PAS CONFIRMÉ</span>
-                    [% ELSIF  rdv.user_status == 'canceled' %]
-                      <span class="text-danger">ANNULÉ</span>
-                    [% ELSIF  rdv.user_status == 'confirmed' %]
-                      <span class="text-success">CONFIRMÉ</span>
-                    [% ELSE %]
-                      <span class="text-warning">INCONNUE</span>
-                    [% END %]</td>
-                [% ELSE %]
-                    <td>[% IF rdv.user_status == 'unconfirmed' %]
-                      <span class="text-warning">PAS CONFIRMÉ</span>
-                    [% ELSIF  rdv.user_status == 'canceled' %]
-                      <span class="text-danger">ANNULÉ</span>
-                    [% ELSIF  rdv.user_status == 'confirmed' %]
-                      <span class="text-success">CONFIRMÉ</span>
-                    [% ELSE %]
-                      <span class="text-warning">INCONNUE</span>
-                    [% END %]</td>
-                    <td>[% IF rdv.client_status == 'unconfirmed' %]
-                      <span class="text-warning">PAS CONFIRMÉ</span>
-                    [% ELSIF  rdv.client_status == 'canceled' %]
-                      <span class="text-danger">ANNULÉ</span>
-                    [% ELSIF  rdv.client_status == 'confirmed' %]
-                      <span class="text-success">CONFIRMÉ</span>
-                    [% ELSE %]
-                      <span class="text-warning">INCONNUE</span>
-                    [% END %]</td>
-                [% END %]
-                [% IF session.group == 'client' AND rdv.client_status == 'unconfirmed' %]
-                  <td><button class="btn btn-success" onclick="setstatus('confirm','[% rdv.rdvuuid %]');"><i class="fas fa-check"></i></button>
-                  <button class="btn btn-danger" onclick="setstatus('cancel','[% rdv.rdvuuid %]');"><i class="fas fa-times"></i></button></td>
-                [% ELSE %]
-                <td><button class="btn btn-info" onclick="openrdv('[% rdv.rdvuuid %]');"><i class="fas fa-edit"></i></button></td>
-                [% END %]
-        </tr>
-        [% END %]
-        </tbody>
-</table>
+<h1>Calendrier des Rendez-Vous</h1>
+<div class="row" id="eventcats">
+  <div class="form-inline">
+    <div class="custom-control custom-checkbox" style="margin-left: 20px; ">
+      <input type="checkbox" class="custom-control-input"  value="free" id="cal_free" name="cal_free" checked>
+      <label class="custom-control-label event-free" id="lblfree" for="cal_free">libre</label>
+    </div>
+      <div class="custom-control custom-checkbox"  style="margin-left: 20px; ">
+        <input type="checkbox" class="custom-control-input"  value="confirmed" id="cal_confirmed" name="cal_confirmed"  checked>
+        <label class="custom-control-label event-confirmed" id="lblconfirmed" for="cal_confirmed">confirmé</label>
+      </div>
+        <div class="custom-control custom-checkbox" style="margin-left: 20px; ">
+          <input type="checkbox" class="custom-control-input"  value="notconfirmed" id="cal_notconfirmed" name="cal_notconfirmed"  checked>
+          <label class="custom-control-label event-notconfirmed" id="lblnotconfirmed" for="cal_notconfirmed">pas confirmé</label>
+        </div>
+          <div class="custom-control custom-checkbox" style="margin-left: 20px; ">
+            <input type="checkbox" class="custom-control-input"  value="exception" id="cal_exception" name="cal_exception"  checked>
+            <label class="custom-control-label event-exception" id="lblexception" for="cal_exception">non disponible</label>
+          </div>
+            <div class="custom-control custom-checkbox" style="margin-left: 20px; ">
+              <input type="checkbox" class="custom-control-input"  value="canceled" id="cal_canceled" name="cal_canceled"  checked>
+              <label class="custom-control-label event-canceled" id="lblcanceled" for="cal_canceled">annulé</label>
+            </div>
+          </div>
+</div>
+<div id="calendar"></div>
\ No newline at end of file
index a5de4fb..72df63d 100644 (file)
@@ -1,5 +1,9 @@
-[% IF pagename == 'calendar' %]
-<script src="../../vendors/fullcalendar/fullcalendar.min.js"></script>
-<script src="../../vendors/fullcalendar/locale-all.js"></script>
-[% END %]
+
+<script src="[% abspath %]vendors/moment/moment-with-locales.min.js"></script>
+<script src="[% abspath %]vendors/fullcalendar/core/main.min.js"></script>
+<script src="[% abspath %]vendors/fullcalendar/interaction/main.min.js"></script>
+<script src="[% abspath %]vendors/fullcalendar/daygrid/main.min.js"></script>
+<script src="[% abspath %]vendors/fullcalendar/timegrid/main.min.js"></script>
+<script src="[% abspath %]vendors/fullcalendar/list/main.min.js"></script>
+<script src="[% abspath %]vendors/fullcalendar/bootstrap/main.min.js"></script>
 <script src="[% pagename %].js"></script>
\ No newline at end of file
diff --git a/backoffice/tmpl/module/rendezvous/old_index.tt b/backoffice/tmpl/module/rendezvous/old_index.tt
new file mode 100644 (file)
index 0000000..5eb0b2f
--- /dev/null
@@ -0,0 +1,83 @@
+[% IF session.group == 'avocat' %]
+[% rdvlist = pgdb.prepare("select ev.id,DATE_FORMAT(ev.eventdate,'%d/%m/%Y') as eventdate,ev.eventhour,ev.eventoptions,usr.userprename,usr.usersurname,ev.user_status,ev.client_status,ev.clientuuid,ev.useruuid from events ev LEFT JOIN users usr on (ev.id_client=usr.id) where ev.id_user=? and ev.eventdate >= CURRENT_DATE order by eventdate DESC,eventhour ASC;"); %]
+[% ELSE %]
+[% rdvlist =pgdb.prepare("select ev.id,DATE_FORMAT(ev.eventdate,'%d/%m/%Y') as eventdate,ev.eventoptions,ev.eventhour,usr.userprename,usr.usersurname,ev.user_status,ev.client_status,ev.clientuuid,ev.useruuid from events ev LEFT JOIN users usr on (ev.id_user=usr.id) where ev.id_client=? and ev.eventdate >= CURRENT_DATE order by eventdate DESC,eventhour ASC;") %]
+[% END %]
+<h5>Mes Rendez-Vous</h5>
+<table class="table table-striped table-bordered"  data-toggle="table">
+<thead class="thead-dark"><tr>
+<th data-sortable="true">Date</th>
+        <th data-sortable="true">Heure</th>
+        <th data-sortable="true">
+          [% IF session.group == 'client'%]
+            Avocat
+          [% ELSE %]
+            Client
+          [% END %]
+        <th data-sortable="true">Options</th>
+        <th data-sortable="true">Mon status</th>
+        <th data-sortable="true">
+        [% IF session.group == 'client'%]
+           Status  Avocat
+          [% ELSE %]
+           Status  Client
+          [% END %]
+        </th>
+        <th>Action</th>
+        </tr></thead>
+        <tbody>
+        [% FOREACH rdv = rdvlist.execute(session.id) %]
+        <tr data-id="[% rdv.id %]">
+                <td>[% rdv.eventdate %]</td>
+                <td>[% rdv.eventhour %]</td>
+                <td>[% rdv.usersurname'].' '.$row['userprename %]</td>
+                <td>[% rdv.eventoptions %]</td>
+                [% IF $user['usergroup'] == 'client' %]
+                    <td>[% IFrdv.client_status == 'unconfirmed' %]
+                      <span class="text-warning">PAS CONFIRMÉ</span>
+                    [% ELSIF  rdv.client_status == 'canceled' %]
+                      <span class="text-danger">ANNULÉ</span>
+                    [% ELSIF  rdv.client_status == 'confirmed' %]
+                      <span class="text-success">CONFIRMÉ</span>
+                    [% ELSE %]
+                      <span class="text-warning">INCONNUE</span>
+                    [% END %]</td>
+                    <td>[% IF rdv.user_status == 'unconfirmed' %]
+                      <span class="text-warning">PAS CONFIRMÉ</span>
+                    [% ELSIF  rdv.user_status == 'canceled' %]
+                      <span class="text-danger">ANNULÉ</span>
+                    [% ELSIF  rdv.user_status == 'confirmed' %]
+                      <span class="text-success">CONFIRMÉ</span>
+                    [% ELSE %]
+                      <span class="text-warning">INCONNUE</span>
+                    [% END %]</td>
+                [% ELSE %]
+                    <td>[% IF rdv.user_status == 'unconfirmed' %]
+                      <span class="text-warning">PAS CONFIRMÉ</span>
+                    [% ELSIF  rdv.user_status == 'canceled' %]
+                      <span class="text-danger">ANNULÉ</span>
+                    [% ELSIF  rdv.user_status == 'confirmed' %]
+                      <span class="text-success">CONFIRMÉ</span>
+                    [% ELSE %]
+                      <span class="text-warning">INCONNUE</span>
+                    [% END %]</td>
+                    <td>[% IF rdv.client_status == 'unconfirmed' %]
+                      <span class="text-warning">PAS CONFIRMÉ</span>
+                    [% ELSIF  rdv.client_status == 'canceled' %]
+                      <span class="text-danger">ANNULÉ</span>
+                    [% ELSIF  rdv.client_status == 'confirmed' %]
+                      <span class="text-success">CONFIRMÉ</span>
+                    [% ELSE %]
+                      <span class="text-warning">INCONNUE</span>
+                    [% END %]</td>
+                [% END %]
+                [% IF session.group == 'client' AND rdv.client_status == 'unconfirmed' %]
+                  <td><button class="btn btn-success" onclick="setstatus('confirm','[% rdv.rdvuuid %]');"><i class="fas fa-check"></i></button>
+                  <button class="btn btn-danger" onclick="setstatus('cancel','[% rdv.rdvuuid %]');"><i class="fas fa-times"></i></button></td>
+                [% ELSE %]
+                <td><button class="btn btn-info" onclick="openrdv('[% rdv.rdvuuid %]');"><i class="fas fa-edit"></i></button></td>
+                [% END %]
+        </tr>
+        [% END %]
+        </tbody>
+</table>
index df5c32b..7bb6449 100644 (file)
@@ -9,7 +9,7 @@
       [% INCLUDE block/sidebar.tt %]
       <div class="main-panel">
         <div class="content-wrapper" style="margin: 0px; padding: 0px;">
-         <iframe id="moduleframe" src="module/applications.html" style="bottom: 0px;border: 0px;height: 88vh;width: 100%; overflow-y: scroll;"></iframe>
+         <iframe id="moduleframe" src="module/applications.html" style="bottom: 0px;border: 0px;height: 92vh;width: 100%; overflow-y: scroll;"></iframe>
         </div>
       </div>
     </div>
index 4cadfd0..7d8ec5a 100644 (file)
@@ -15,7 +15,7 @@
   <!-- <link rel="stylesheet" href="[% abspath %]vendors/bootstrap/css/bootstrap.min.css"> -->
 
   <link rel="stylesheet" href="[% abspath %]css/style.css">
-  [% INCLUDE module/$module/css.tt %]
+  [% INCLUDE "module/$module/css.tt" %]
 </head>
 
 <body>
@@ -25,7 +25,7 @@
   <script src="[% abspath %]vendors/jquery/jquery.min.js"></script>
   <script src="[% abspath %]vendors/bootstrap/js/bootstrap.bundle.min.js"></script>
   <script src="[% abspath %]js/modules_global.js"></script> 
-  [% INCLUDE module/$module/javascript.tt %]
+  [% INCLUDE "module/$module/javascript.tt" %]
   
 </body>
 
diff --git a/backoffice/vendors/fullcalendar/bootstrap/LICENSE.txt b/backoffice/vendors/fullcalendar/bootstrap/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/bootstrap/README.md b/backoffice/vendors/fullcalendar/bootstrap/README.md
new file mode 100644 (file)
index 0000000..1da7990
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Bootstrap Plugin
+
+Bootstrap 4 theming for your calendar
+
+[View the docs &raquo;](https://fullcalendar.io/docs/bootstrap-theme)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/bootstrap/main.css b/backoffice/vendors/fullcalendar/bootstrap/main.css
new file mode 100644 (file)
index 0000000..5bf2802
--- /dev/null
@@ -0,0 +1,33 @@
+/*!
+FullCalendar Bootstrap Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+.fc.fc-bootstrap a {
+  text-decoration: none; }
+
+.fc.fc-bootstrap a[data-goto]:hover {
+  text-decoration: underline; }
+
+.fc-bootstrap hr.fc-divider {
+  border-color: inherit; }
+
+.fc-bootstrap .fc-today.alert {
+  border-radius: 0; }
+
+.fc-bootstrap a.fc-event:not([href]):not([tabindex]) {
+  color: #fff; }
+
+.fc-bootstrap .fc-popover.card {
+  position: absolute; }
+
+/* Popover
+--------------------------------------------------------------------------------------------------*/
+.fc-bootstrap .fc-popover .card-body {
+  padding: 0; }
+
+/* TimeGrid Slats (lines that run horizontally)
+--------------------------------------------------------------------------------------------------*/
+.fc-bootstrap .fc-time-grid .fc-slats table {
+  /* some themes have background color. see through to slats */
+  background: none; }
diff --git a/backoffice/vendors/fullcalendar/bootstrap/main.d.ts b/backoffice/vendors/fullcalendar/bootstrap/main.d.ts
new file mode 100644 (file)
index 0000000..6d2d681
--- /dev/null
@@ -0,0 +1,7 @@
+declare module "@fullcalendar/bootstrap" {
+    import { Theme } from "@fullcalendar/core";
+    export class BootstrapTheme extends Theme {
+    }
+    const _default_5: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_5;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/bootstrap/main.js b/backoffice/vendors/fullcalendar/bootstrap/main.js
new file mode 100644 (file)
index 0000000..d0a13f6
--- /dev/null
@@ -0,0 +1,90 @@
+/*!
+FullCalendar Bootstrap Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarBootstrap = {}, global.FullCalendar));
+}(this, function (exports, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var BootstrapTheme = /** @class */ (function (_super) {
+        __extends(BootstrapTheme, _super);
+        function BootstrapTheme() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        return BootstrapTheme;
+    }(core.Theme));
+    BootstrapTheme.prototype.classes = {
+        widget: 'fc-bootstrap',
+        tableGrid: 'table-bordered',
+        tableList: 'table',
+        tableListHeading: 'table-active',
+        buttonGroup: 'btn-group',
+        button: 'btn btn-primary',
+        buttonActive: 'active',
+        today: 'alert alert-info',
+        popover: 'card card-primary',
+        popoverHeader: 'card-header',
+        popoverContent: 'card-body',
+        // day grid
+        // for left/right border color when border is inset from edges (all-day in timeGrid view)
+        // avoid `table` class b/c don't want margins/padding/structure. only border color.
+        headerRow: 'table-bordered',
+        dayRow: 'table-bordered',
+        // list view
+        listView: 'card card-primary'
+    };
+    BootstrapTheme.prototype.baseIconClass = 'fa';
+    BootstrapTheme.prototype.iconClasses = {
+        close: 'fa-times',
+        prev: 'fa-chevron-left',
+        next: 'fa-chevron-right',
+        prevYear: 'fa-angle-double-left',
+        nextYear: 'fa-angle-double-right'
+    };
+    BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome';
+    BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
+    BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
+    var main = core.createPlugin({
+        themeClasses: {
+            bootstrap: BootstrapTheme
+        }
+    });
+
+    exports.BootstrapTheme = BootstrapTheme;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/bootstrap/main.min.css b/backoffice/vendors/fullcalendar/bootstrap/main.min.css
new file mode 100644 (file)
index 0000000..42c22ac
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar Bootstrap Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/.fc.fc-bootstrap a{text-decoration:none}.fc.fc-bootstrap a[data-goto]:hover{text-decoration:underline}.fc-bootstrap hr.fc-divider{border-color:inherit}.fc-bootstrap .fc-today.alert{border-radius:0}.fc-bootstrap a.fc-event:not([href]):not([tabindex]){color:#fff}.fc-bootstrap .fc-popover.card{position:absolute}.fc-bootstrap .fc-popover .card-body{padding:0}.fc-bootstrap .fc-time-grid .fc-slats table{background:0 0}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/bootstrap/main.min.js b/backoffice/vendors/fullcalendar/bootstrap/main.min.js
new file mode 100644 (file)
index 0000000..57dcacb
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Bootstrap Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarBootstrap={},e.FullCalendar))}(this,function(e,t){"use strict";function o(e,t){function o(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)},a=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return o(t,e),t}(t.Theme);a.prototype.classes={widget:"fc-bootstrap",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},a.prototype.baseIconClass="fa",a.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},a.prototype.iconOverrideOption="bootstrapFontAwesome",a.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",a.prototype.iconOverridePrefix="fa-";var n=t.createPlugin({themeClasses:{bootstrap:a}});e.BootstrapTheme=a,e.default=n,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/bootstrap/package.json b/backoffice/vendors/fullcalendar/bootstrap/package.json
new file mode 100644 (file)
index 0000000..50fcbe1
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "@fullcalendar/bootstrap",
+  "_id": "@fullcalendar/bootstrap@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-mfgs8hg2Uo+P+fQQ/de3r9/VTezgiPH0KO01dM2sqN7Bi7jetyBxI97bl1EEF2fhkoDRMMv28pfsoY3saUP64Q==",
+  "_location": "/@fullcalendar/bootstrap",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/bootstrap",
+    "name": "@fullcalendar/bootstrap",
+    "escapedName": "@fullcalendar%2fbootstrap",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/bootstrap/-/bootstrap-4.1.0.tgz",
+  "_shasum": "489aabfddd4b82d72616f5acbdf109df27bc95be",
+  "_spec": "@fullcalendar/bootstrap",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "Bootstrap 4 theming for your calendar",
+  "docs": "https://fullcalendar.io/docs/bootstrap-theme",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/bootstrap",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Bootstrap Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/core/LICENSE.txt b/backoffice/vendors/fullcalendar/core/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/core/README.md b/backoffice/vendors/fullcalendar/core/README.md
new file mode 100644 (file)
index 0000000..7ed36f4
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Core Package
+
+Provides core functionality, including the Calendar class
+
+[View the docs &raquo;](https://fullcalendar.io/docs/initialize-es6)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/core/locales-all.js b/backoffice/vendors/fullcalendar/core/locales-all.js
new file mode 100644 (file)
index 0000000..132590e
--- /dev/null
@@ -0,0 +1,1353 @@
+/*!
+FullCalendar Core Package v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, global.FullCalendarLocalesAll = factory());
+}(this, function () { 'use strict';
+
+    var _m0 = {
+        code: "af",
+        week: {
+            dow: 1,
+            doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+        },
+        buttonText: {
+            prev: "Vorige",
+            next: "Volgende",
+            today: "Vandag",
+            year: "Jaar",
+            month: "Maand",
+            week: "Week",
+            day: "Dag",
+            list: "Agenda"
+        },
+        allDayHtml: "Heeldag",
+        eventLimitText: "Addisionele",
+        noEventsMessage: "Daar is geen gebeurtenisse nie"
+    };
+
+    var _m1 = {
+        code: "ar-dz",
+        week: {
+            dow: 0,
+            doy: 4 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m2 = {
+        code: "ar-kw",
+        week: {
+            dow: 0,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m3 = {
+        code: "ar-ly",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m4 = {
+        code: "ar-ma",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m5 = {
+        code: "ar-sa",
+        week: {
+            dow: 0,
+            doy: 6 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m6 = {
+        code: "ar-tn",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m7 = {
+        code: "ar",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    var _m8 = {
+        code: "bg",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "назад",
+            next: "напред",
+            today: "днес",
+            month: "Месец",
+            week: "Седмица",
+            day: "Ден",
+            list: "График"
+        },
+        allDayText: "Цял ден",
+        eventLimitText: function (n) {
+            return "+още " + n;
+        },
+        noEventsMessage: "Няма събития за показване"
+    };
+
+    var _m9 = {
+        code: "bs",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prošli",
+            next: "Sljedeći",
+            today: "Danas",
+            month: "Mjesec",
+            week: "Sedmica",
+            day: "Dan",
+            list: "Raspored"
+        },
+        weekLabel: "Sed",
+        allDayText: "Cijeli dan",
+        eventLimitText: function (n) {
+            return "+ još " + n;
+        },
+        noEventsMessage: "Nema događaja za prikazivanje"
+    };
+
+    var _m10 = {
+        code: "ca",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Anterior",
+            next: "Següent",
+            today: "Avui",
+            month: "Mes",
+            week: "Setmana",
+            day: "Dia",
+            list: "Agenda"
+        },
+        weekLabel: "Set",
+        allDayText: "Tot el dia",
+        eventLimitText: "més",
+        noEventsMessage: "No hi ha esdeveniments per mostrar"
+    };
+
+    var _m11 = {
+        code: "cs",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Dříve",
+            next: "Později",
+            today: "Nyní",
+            month: "Měsíc",
+            week: "Týden",
+            day: "Den",
+            list: "Agenda"
+        },
+        weekLabel: "Týd",
+        allDayText: "Celý den",
+        eventLimitText: function (n) {
+            return "+další: " + n;
+        },
+        noEventsMessage: "Žádné akce k zobrazení"
+    };
+
+    var _m12 = {
+        code: "da",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Forrige",
+            next: "Næste",
+            today: "Idag",
+            month: "Måned",
+            week: "Uge",
+            day: "Dag",
+            list: "Agenda"
+        },
+        weekLabel: "Uge",
+        allDayText: "Hele dagen",
+        eventLimitText: "flere",
+        noEventsMessage: "Ingen arrangementer at vise"
+    };
+
+    var _m13 = {
+        code: "de",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Zurück",
+            next: "Vor",
+            today: "Heute",
+            year: "Jahr",
+            month: "Monat",
+            week: "Woche",
+            day: "Tag",
+            list: "Terminübersicht"
+        },
+        weekLabel: "KW",
+        allDayText: "Ganztägig",
+        eventLimitText: function (n) {
+            return "+ weitere " + n;
+        },
+        noEventsMessage: "Keine Ereignisse anzuzeigen"
+    };
+
+    var _m14 = {
+        code: "el",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Προηγούμενος",
+            next: "Επόμενος",
+            today: "Σήμερα",
+            month: "Μήνας",
+            week: "Εβδομάδα",
+            day: "Ημέρα",
+            list: "Ατζέντα"
+        },
+        weekLabel: "Εβδ",
+        allDayText: "Ολοήμερο",
+        eventLimitText: "περισσότερα",
+        noEventsMessage: "Δεν υπάρχουν γεγονότα για να εμφανιστεί"
+    };
+
+    var _m15 = {
+        code: "en-au",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    };
+
+    var _m16 = {
+        code: "en-gb",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    };
+
+    var _m17 = {
+        code: "en-nz",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    };
+
+    var _m18 = {
+        code: "es",
+        week: {
+            dow: 0,
+            doy: 6 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Ant",
+            next: "Sig",
+            today: "Hoy",
+            month: "Mes",
+            week: "Semana",
+            day: "Día",
+            list: "Agenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Todo<br/>el día",
+        eventLimitText: "más",
+        noEventsMessage: "No hay eventos para mostrar"
+    };
+
+    var _m19 = {
+        code: "es",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Ant",
+            next: "Sig",
+            today: "Hoy",
+            month: "Mes",
+            week: "Semana",
+            day: "Día",
+            list: "Agenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Todo<br/>el día",
+        eventLimitText: "más",
+        noEventsMessage: "No hay eventos para mostrar"
+    };
+
+    var _m20 = {
+        code: "et",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Eelnev",
+            next: "Järgnev",
+            today: "Täna",
+            month: "Kuu",
+            week: "Nädal",
+            day: "Päev",
+            list: "Päevakord"
+        },
+        weekLabel: "näd",
+        allDayText: "Kogu päev",
+        eventLimitText: function (n) {
+            return "+ veel " + n;
+        },
+        noEventsMessage: "Kuvamiseks puuduvad sündmused"
+    };
+
+    var _m21 = {
+        code: "eu",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Aur",
+            next: "Hur",
+            today: "Gaur",
+            month: "Hilabetea",
+            week: "Astea",
+            day: "Eguna",
+            list: "Agenda"
+        },
+        weekLabel: "As",
+        allDayHtml: "Egun<br/>osoa",
+        eventLimitText: "gehiago",
+        noEventsMessage: "Ez dago ekitaldirik erakusteko"
+    };
+
+    var _m22 = {
+        code: "fa",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "قبلی",
+            next: "بعدی",
+            today: "امروز",
+            month: "ماه",
+            week: "هفته",
+            day: "روز",
+            list: "برنامه"
+        },
+        weekLabel: "هف",
+        allDayText: "تمام روز",
+        eventLimitText: function (n) {
+            return "بیش از " + n;
+        },
+        noEventsMessage: "هیچ رویدادی به نمایش"
+    };
+
+    var _m23 = {
+        code: "fi",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Edellinen",
+            next: "Seuraava",
+            today: "Tänään",
+            month: "Kuukausi",
+            week: "Viikko",
+            day: "Päivä",
+            list: "Tapahtumat"
+        },
+        weekLabel: "Vk",
+        allDayText: "Koko päivä",
+        eventLimitText: "lisää",
+        noEventsMessage: "Ei näytettäviä tapahtumia"
+    };
+
+    var _m24 = {
+        code: "fr",
+        buttonText: {
+            prev: "Précédent",
+            next: "Suivant",
+            today: "Aujourd'hui",
+            year: "Année",
+            month: "Mois",
+            week: "Semaine",
+            day: "Jour",
+            list: "Mon planning"
+        },
+        weekLabel: "Sem.",
+        allDayHtml: "Toute la<br/>journée",
+        eventLimitText: "en plus",
+        noEventsMessage: "Aucun événement à afficher"
+    };
+
+    var _m25 = {
+        code: "fr-ch",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Précédent",
+            next: "Suivant",
+            today: "Courant",
+            year: "Année",
+            month: "Mois",
+            week: "Semaine",
+            day: "Jour",
+            list: "Mon planning"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Toute la<br/>journée",
+        eventLimitText: "en plus",
+        noEventsMessage: "Aucun événement à afficher"
+    };
+
+    var _m26 = {
+        code: "fr",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Précédent",
+            next: "Suivant",
+            today: "Aujourd'hui",
+            year: "Année",
+            month: "Mois",
+            week: "Semaine",
+            day: "Jour",
+            list: "Mon planning"
+        },
+        weekLabel: "Sem.",
+        allDayHtml: "Toute la<br/>journée",
+        eventLimitText: "en plus",
+        noEventsMessage: "Aucun événement à afficher"
+    };
+
+    var _m27 = {
+        code: "gl",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Ant",
+            next: "Seg",
+            today: "Hoxe",
+            month: "Mes",
+            week: "Semana",
+            day: "Día",
+            list: "Axenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Todo<br/>o día",
+        eventLimitText: "máis",
+        noEventsMessage: "Non hai eventos para amosar"
+    };
+
+    var _m28 = {
+        code: "he",
+        dir: 'rtl',
+        buttonText: {
+            prev: "הקודם",
+            next: "הבא",
+            today: "היום",
+            month: "חודש",
+            week: "שבוע",
+            day: "יום",
+            list: "סדר יום"
+        },
+        allDayText: "כל היום",
+        eventLimitText: "אחר",
+        noEventsMessage: "אין אירועים להצגה",
+        weekLabel: "שבוע"
+    };
+
+    var _m29 = {
+        code: "hi",
+        week: {
+            dow: 0,
+            doy: 6 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "पिछला",
+            next: "अगला",
+            today: "आज",
+            month: "महीना",
+            week: "सप्ताह",
+            day: "दिन",
+            list: "कार्यसूची"
+        },
+        weekLabel: "हफ्ता",
+        allDayText: "सभी दिन",
+        eventLimitText: function (n) {
+            return "+अधिक " + n;
+        },
+        noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
+    };
+
+    var _m30 = {
+        code: "hr",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prijašnji",
+            next: "Sljedeći",
+            today: "Danas",
+            month: "Mjesec",
+            week: "Tjedan",
+            day: "Dan",
+            list: "Raspored"
+        },
+        weekLabel: "Tje",
+        allDayText: "Cijeli dan",
+        eventLimitText: function (n) {
+            return "+ još " + n;
+        },
+        noEventsMessage: "Nema događaja za prikaz"
+    };
+
+    var _m31 = {
+        code: "hu",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "vissza",
+            next: "előre",
+            today: "ma",
+            month: "Hónap",
+            week: "Hét",
+            day: "Nap",
+            list: "Napló"
+        },
+        weekLabel: "Hét",
+        allDayText: "Egész nap",
+        eventLimitText: "további",
+        noEventsMessage: "Nincs megjeleníthető esemény"
+    };
+
+    var _m32 = {
+        code: "id",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "mundur",
+            next: "maju",
+            today: "hari ini",
+            month: "Bulan",
+            week: "Minggu",
+            day: "Hari",
+            list: "Agenda"
+        },
+        weekLabel: "Mg",
+        allDayHtml: "Sehari<br/>penuh",
+        eventLimitText: "lebih",
+        noEventsMessage: "Tidak ada acara untuk ditampilkan"
+    };
+
+    var _m33 = {
+        code: "is",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Fyrri",
+            next: "Næsti",
+            today: "Í dag",
+            month: "Mánuður",
+            week: "Vika",
+            day: "Dagur",
+            list: "Dagskrá"
+        },
+        weekLabel: "Vika",
+        allDayHtml: "Allan<br/>daginn",
+        eventLimitText: "meira",
+        noEventsMessage: "Engir viðburðir til að sýna"
+    };
+
+    var _m34 = {
+        code: "it",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prec",
+            next: "Succ",
+            today: "Oggi",
+            month: "Mese",
+            week: "Settimana",
+            day: "Giorno",
+            list: "Agenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Tutto il<br/>giorno",
+        eventLimitText: function (n) {
+            return "+altri " + n;
+        },
+        noEventsMessage: "Non ci sono eventi da visualizzare"
+    };
+
+    var _m35 = {
+        code: "ja",
+        buttonText: {
+            prev: "前",
+            next: "次",
+            today: "今日",
+            month: "月",
+            week: "週",
+            day: "日",
+            list: "予定リスト"
+        },
+        weekLabel: "週",
+        allDayText: "終日",
+        eventLimitText: function (n) {
+            return "他 " + n + " 件";
+        },
+        noEventsMessage: "表示する予定はありません"
+    };
+
+    var _m36 = {
+        code: "ka",
+        week: {
+            dow: 1,
+            doy: 7
+        },
+        buttonText: {
+            prev: "წინა",
+            next: "შემდეგი",
+            today: "დღეს",
+            month: "თვე",
+            week: "კვირა",
+            day: "დღე",
+            list: "დღის წესრიგი"
+        },
+        weekLabel: "კვ",
+        allDayText: "მთელი დღე",
+        eventLimitText: function (n) {
+            return "+ კიდევ " + n;
+        },
+        noEventsMessage: "ღონისძიებები არ არის"
+    };
+
+    var _m37 = {
+        code: "kk",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Алдыңғы",
+            next: "Келесі",
+            today: "Бүгін",
+            month: "Ай",
+            week: "Апта",
+            day: "Күн",
+            list: "Күн тәртібі"
+        },
+        weekLabel: "Не",
+        allDayText: "Күні бойы",
+        eventLimitText: function (n) {
+            return "+ тағы " + n;
+        },
+        noEventsMessage: "Көрсету үшін оқиғалар жоқ"
+    };
+
+    var _m38 = {
+        code: "ko",
+        buttonText: {
+            prev: "이전달",
+            next: "다음달",
+            today: "오늘",
+            month: "월",
+            week: "주",
+            day: "일",
+            list: "일정목록"
+        },
+        weekLabel: "주",
+        allDayText: "종일",
+        eventLimitText: "개",
+        noEventsMessage: "일정이 없습니다"
+    };
+
+    var _m39 = {
+        code: "lb",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Zréck",
+            next: "Weider",
+            today: "Haut",
+            month: "Mount",
+            week: "Woch",
+            day: "Dag",
+            list: "Terminiwwersiicht"
+        },
+        weekLabel: "W",
+        allDayText: "Ganzen Dag",
+        eventLimitText: "méi",
+        noEventsMessage: "Nee Evenementer ze affichéieren"
+    };
+
+    var _m40 = {
+        code: "lt",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Atgal",
+            next: "Pirmyn",
+            today: "Šiandien",
+            month: "Mėnuo",
+            week: "Savaitė",
+            day: "Diena",
+            list: "Darbotvarkė"
+        },
+        weekLabel: "SAV",
+        allDayText: "Visą dieną",
+        eventLimitText: "daugiau",
+        noEventsMessage: "Nėra įvykių rodyti"
+    };
+
+    var _m41 = {
+        code: "lv",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Iepr.",
+            next: "Nāk.",
+            today: "Šodien",
+            month: "Mēnesis",
+            week: "Nedēļa",
+            day: "Diena",
+            list: "Dienas kārtība"
+        },
+        weekLabel: "Ned.",
+        allDayText: "Visu dienu",
+        eventLimitText: function (n) {
+            return "+vēl " + n;
+        },
+        noEventsMessage: "Nav notikumu"
+    };
+
+    var _m42 = {
+        code: "mk",
+        buttonText: {
+            prev: "претходно",
+            next: "следно",
+            today: "Денес",
+            month: "Месец",
+            week: "Недела",
+            day: "Ден",
+            list: "График"
+        },
+        weekLabel: "Сед",
+        allDayText: "Цел ден",
+        eventLimitText: function (n) {
+            return "+повеќе " + n;
+        },
+        noEventsMessage: "Нема настани за прикажување"
+    };
+
+    var _m43 = {
+        code: "ms",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Sebelum",
+            next: "Selepas",
+            today: "hari ini",
+            month: "Bulan",
+            week: "Minggu",
+            day: "Hari",
+            list: "Agenda"
+        },
+        weekLabel: "Mg",
+        allDayText: "Sepanjang hari",
+        eventLimitText: function (n) {
+            return "masih ada " + n + " acara";
+        },
+        noEventsMessage: "Tiada peristiwa untuk dipaparkan"
+    };
+
+    var _m44 = {
+        code: "nb",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Forrige",
+            next: "Neste",
+            today: "I dag",
+            month: "Måned",
+            week: "Uke",
+            day: "Dag",
+            list: "Agenda"
+        },
+        weekLabel: "Uke",
+        allDayText: "Hele dagen",
+        eventLimitText: "til",
+        noEventsMessage: "Ingen hendelser å vise"
+    };
+
+    var _m45 = {
+        code: "nl",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Voorgaand",
+            next: "Volgende",
+            today: "Vandaag",
+            year: "Jaar",
+            month: "Maand",
+            week: "Week",
+            day: "Dag",
+            list: "Agenda"
+        },
+        allDayText: "Hele dag",
+        eventLimitText: "extra",
+        noEventsMessage: "Geen evenementen om te laten zien"
+    };
+
+    var _m46 = {
+        code: "nn",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Førre",
+            next: "Neste",
+            today: "I dag",
+            month: "Månad",
+            week: "Veke",
+            day: "Dag",
+            list: "Agenda"
+        },
+        weekLabel: "Veke",
+        allDayText: "Heile dagen",
+        eventLimitText: "til",
+        noEventsMessage: "Ingen hendelser å vise"
+    };
+
+    var _m47 = {
+        code: "pl",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Poprzedni",
+            next: "Następny",
+            today: "Dziś",
+            month: "Miesiąc",
+            week: "Tydzień",
+            day: "Dzień",
+            list: "Plan dnia"
+        },
+        weekLabel: "Tydz",
+        allDayText: "Cały dzień",
+        eventLimitText: "więcej",
+        noEventsMessage: "Brak wydarzeń do wyświetlenia"
+    };
+
+    var _m48 = {
+        code: "pt-br",
+        buttonText: {
+            prev: "Anterior",
+            next: "Próximo",
+            today: "Hoje",
+            month: "Mês",
+            week: "Semana",
+            day: "Dia",
+            list: "Compromissos"
+        },
+        weekLabel: "Sm",
+        allDayText: "dia inteiro",
+        eventLimitText: function (n) {
+            return "mais +" + n;
+        },
+        noEventsMessage: "Não há eventos para mostrar"
+    };
+
+    var _m49 = {
+        code: "pt",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Anterior",
+            next: "Seguinte",
+            today: "Hoje",
+            month: "Mês",
+            week: "Semana",
+            day: "Dia",
+            list: "Agenda"
+        },
+        weekLabel: "Sem",
+        allDayText: "Todo o dia",
+        eventLimitText: "mais",
+        noEventsMessage: "Não há eventos para mostrar"
+    };
+
+    var _m50 = {
+        code: "ro",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "precedentă",
+            next: "următoare",
+            today: "Azi",
+            month: "Lună",
+            week: "Săptămână",
+            day: "Zi",
+            list: "Agendă"
+        },
+        weekLabel: "Săpt",
+        allDayText: "Toată ziua",
+        eventLimitText: function (n) {
+            return "+alte " + n;
+        },
+        noEventsMessage: "Nu există evenimente de afișat"
+    };
+
+    var _m51 = {
+        code: "ru",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Пред",
+            next: "След",
+            today: "Сегодня",
+            month: "Месяц",
+            week: "Неделя",
+            day: "День",
+            list: "Повестка дня"
+        },
+        weekLabel: "Нед",
+        allDayText: "Весь день",
+        eventLimitText: function (n) {
+            return "+ ещё " + n;
+        },
+        noEventsMessage: "Нет событий для отображения"
+    };
+
+    var _m52 = {
+        code: "sk",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Predchádzajúci",
+            next: "Nasledujúci",
+            today: "Dnes",
+            month: "Mesiac",
+            week: "Týždeň",
+            day: "Deň",
+            list: "Rozvrh"
+        },
+        weekLabel: "Ty",
+        allDayText: "Celý deň",
+        eventLimitText: function (n) {
+            return "+ďalšie: " + n;
+        },
+        noEventsMessage: "Žiadne akcie na zobrazenie"
+    };
+
+    var _m53 = {
+        code: "sl",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prejšnji",
+            next: "Naslednji",
+            today: "Trenutni",
+            month: "Mesec",
+            week: "Teden",
+            day: "Dan",
+            list: "Dnevni red"
+        },
+        weekLabel: "Teden",
+        allDayText: "Ves dan",
+        eventLimitText: "več",
+        noEventsMessage: "Ni dogodkov za prikaz"
+    };
+
+    var _m54 = {
+        code: "sq",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "mbrapa",
+            next: "Përpara",
+            today: "sot",
+            month: "Muaj",
+            week: "Javë",
+            day: "Ditë",
+            list: "Listë"
+        },
+        weekLabel: "Ja",
+        allDayHtml: "Gjithë<br/>ditën",
+        eventLimitText: function (n) {
+            return "+më tepër " + n;
+        },
+        noEventsMessage: "Nuk ka evente për të shfaqur"
+    };
+
+    var _m55 = {
+        code: "sr-cyrl",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Претходна",
+            next: "следећи",
+            today: "Данас",
+            month: "Месец",
+            week: "Недеља",
+            day: "Дан",
+            list: "Планер"
+        },
+        weekLabel: "Сед",
+        allDayText: "Цео дан",
+        eventLimitText: function (n) {
+            return "+ још " + n;
+        },
+        noEventsMessage: "Нема догађаја за приказ"
+    };
+
+    var _m56 = {
+        code: "sr",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prethodna",
+            next: "Sledeći",
+            today: "Danas",
+            month: "Mеsеc",
+            week: "Nеdеlja",
+            day: "Dan",
+            list: "Planеr"
+        },
+        weekLabel: "Sed",
+        allDayText: "Cеo dan",
+        eventLimitText: function (n) {
+            return "+ još " + n;
+        },
+        noEventsMessage: "Nеma događaja za prikaz"
+    };
+
+    var _m57 = {
+        code: "sv",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Förra",
+            next: "Nästa",
+            today: "Idag",
+            month: "Månad",
+            week: "Vecka",
+            day: "Dag",
+            list: "Program"
+        },
+        weekLabel: "v.",
+        allDayText: "Heldag",
+        eventLimitText: "till",
+        noEventsMessage: "Inga händelser att visa"
+    };
+
+    var _m58 = {
+        code: "th",
+        buttonText: {
+            prev: "ย้อน",
+            next: "ถัดไป",
+            today: "วันนี้",
+            month: "เดือน",
+            week: "สัปดาห์",
+            day: "วัน",
+            list: "แผนงาน"
+        },
+        allDayText: "ตลอดวัน",
+        eventLimitText: "เพิ่มเติม",
+        noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
+    };
+
+    var _m59 = {
+        code: "tr",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "geri",
+            next: "ileri",
+            today: "bugün",
+            month: "Ay",
+            week: "Hafta",
+            day: "Gün",
+            list: "Ajanda"
+        },
+        weekLabel: "Hf",
+        allDayText: "Tüm gün",
+        eventLimitText: "daha fazla",
+        noEventsMessage: "Gösterilecek etkinlik yok"
+    };
+
+    var _m60 = {
+        code: "uk",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Попередній",
+            next: "далі",
+            today: "Сьогодні",
+            month: "Місяць",
+            week: "Тиждень",
+            day: "День",
+            list: "Порядок денний"
+        },
+        weekLabel: "Тиж",
+        allDayText: "Увесь день",
+        eventLimitText: function (n) {
+            return "+ще " + n + "...";
+        },
+        noEventsMessage: "Немає подій для відображення"
+    };
+
+    var _m61 = {
+        code: "vi",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Trước",
+            next: "Tiếp",
+            today: "Hôm nay",
+            month: "Tháng",
+            week: "Tuần",
+            day: "Ngày",
+            list: "Lịch biểu"
+        },
+        weekLabel: "Tu",
+        allDayText: "Cả ngày",
+        eventLimitText: function (n) {
+            return "+ thêm " + n;
+        },
+        noEventsMessage: "Không có sự kiện để hiển thị"
+    };
+
+    var _m62 = {
+        code: "zh-cn",
+        week: {
+            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "上月",
+            next: "下月",
+            today: "今天",
+            month: "月",
+            week: "周",
+            day: "日",
+            list: "日程"
+        },
+        weekLabel: "周",
+        allDayText: "全天",
+        eventLimitText: function (n) {
+            return "另外 " + n + " 个";
+        },
+        noEventsMessage: "没有事件显示"
+    };
+
+    var _m63 = {
+        code: "zh-tw",
+        buttonText: {
+            prev: "上月",
+            next: "下月",
+            today: "今天",
+            month: "月",
+            week: "週",
+            day: "天",
+            list: "活動列表"
+        },
+        weekLabel: "周",
+        allDayText: "整天",
+        eventLimitText: '顯示更多',
+        noEventsMessage: "没有任何活動"
+    };
+
+    var _arrayEntry = [
+    _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m12, _m13, _m14, _m15, _m16, _m17, _m18, _m19, _m20, _m21, _m22, _m23, _m24, _m25, _m26, _m27, _m28, _m29, _m30, _m31, _m32, _m33, _m34, _m35, _m36, _m37, _m38, _m39, _m40, _m41, _m42, _m43, _m44, _m45, _m46, _m47, _m48, _m49, _m50, _m51, _m52, _m53, _m54, _m55, _m56, _m57, _m58, _m59, _m60, _m61, _m62, _m63
+    ];
+
+    return _arrayEntry;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales-all.min.js b/backoffice/vendors/fullcalendar/core/locales-all.min.js
new file mode 100644 (file)
index 0000000..95a668d
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Core Package v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self,e.FullCalendarLocalesAll=t())}(this,function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"Idag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα για να εμφανιστεί"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"},{code:"he",dir:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekLabel:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekLabel:"हफ्ता",allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekLabel:"Tje",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekLabel:"Hét",allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë<br/>ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"},{code:"th",buttonText:{prev:"ย้อน",next:"ถัดไป",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Gösterilecek etkinlik yok"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"}]});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/core/locales/af.js b/backoffice/vendors/fullcalendar/core/locales/af.js
new file mode 100644 (file)
index 0000000..ee9f9f7
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.af = factory()));
+}(this, function () { 'use strict';
+
+    var af = {
+        code: "af",
+        week: {
+            dow: 1,
+            doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+        },
+        buttonText: {
+            prev: "Vorige",
+            next: "Volgende",
+            today: "Vandag",
+            year: "Jaar",
+            month: "Maand",
+            week: "Week",
+            day: "Dag",
+            list: "Agenda"
+        },
+        allDayHtml: "Heeldag",
+        eventLimitText: "Addisionele",
+        noEventsMessage: "Daar is geen gebeurtenisse nie"
+    };
+
+    return af;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar-dz.js b/backoffice/vendors/fullcalendar/core/locales/ar-dz.js
new file mode 100644 (file)
index 0000000..201eb17
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-dz'] = factory()));
+}(this, function () { 'use strict';
+
+    var arDz = {
+        code: "ar-dz",
+        week: {
+            dow: 0,
+            doy: 4 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return arDz;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar-kw.js b/backoffice/vendors/fullcalendar/core/locales/ar-kw.js
new file mode 100644 (file)
index 0000000..94c6900
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-kw'] = factory()));
+}(this, function () { 'use strict';
+
+    var arKw = {
+        code: "ar-kw",
+        week: {
+            dow: 0,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return arKw;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar-ly.js b/backoffice/vendors/fullcalendar/core/locales/ar-ly.js
new file mode 100644 (file)
index 0000000..e1c8aeb
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ly'] = factory()));
+}(this, function () { 'use strict';
+
+    var arLy = {
+        code: "ar-ly",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return arLy;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar-ma.js b/backoffice/vendors/fullcalendar/core/locales/ar-ma.js
new file mode 100644 (file)
index 0000000..00cc7c6
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ma'] = factory()));
+}(this, function () { 'use strict';
+
+    var arMa = {
+        code: "ar-ma",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return arMa;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar-sa.js b/backoffice/vendors/fullcalendar/core/locales/ar-sa.js
new file mode 100644 (file)
index 0000000..0361f6d
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-sa'] = factory()));
+}(this, function () { 'use strict';
+
+    var arSa = {
+        code: "ar-sa",
+        week: {
+            dow: 0,
+            doy: 6 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return arSa;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar-tn.js b/backoffice/vendors/fullcalendar/core/locales/ar-tn.js
new file mode 100644 (file)
index 0000000..57a07f8
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-tn'] = factory()));
+}(this, function () { 'use strict';
+
+    var arTn = {
+        code: "ar-tn",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return arTn;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ar.js b/backoffice/vendors/fullcalendar/core/locales/ar.js
new file mode 100644 (file)
index 0000000..f789afd
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ar = factory()));
+}(this, function () { 'use strict';
+
+    var ar = {
+        code: "ar",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "السابق",
+            next: "التالي",
+            today: "اليوم",
+            month: "شهر",
+            week: "أسبوع",
+            day: "يوم",
+            list: "أجندة"
+        },
+        weekLabel: "أسبوع",
+        allDayText: "اليوم كله",
+        eventLimitText: "أخرى",
+        noEventsMessage: "أي أحداث لعرض"
+    };
+
+    return ar;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/bg.js b/backoffice/vendors/fullcalendar/core/locales/bg.js
new file mode 100644 (file)
index 0000000..e7343a6
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bg = factory()));
+}(this, function () { 'use strict';
+
+    var bg = {
+        code: "bg",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "назад",
+            next: "напред",
+            today: "днес",
+            month: "Месец",
+            week: "Седмица",
+            day: "Ден",
+            list: "График"
+        },
+        allDayText: "Цял ден",
+        eventLimitText: function (n) {
+            return "+още " + n;
+        },
+        noEventsMessage: "Няма събития за показване"
+    };
+
+    return bg;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/bs.js b/backoffice/vendors/fullcalendar/core/locales/bs.js
new file mode 100644 (file)
index 0000000..d96b8ad
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bs = factory()));
+}(this, function () { 'use strict';
+
+    var bs = {
+        code: "bs",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prošli",
+            next: "Sljedeći",
+            today: "Danas",
+            month: "Mjesec",
+            week: "Sedmica",
+            day: "Dan",
+            list: "Raspored"
+        },
+        weekLabel: "Sed",
+        allDayText: "Cijeli dan",
+        eventLimitText: function (n) {
+            return "+ još " + n;
+        },
+        noEventsMessage: "Nema događaja za prikazivanje"
+    };
+
+    return bs;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ca.js b/backoffice/vendors/fullcalendar/core/locales/ca.js
new file mode 100644 (file)
index 0000000..d2d3e2a
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ca = factory()));
+}(this, function () { 'use strict';
+
+    var ca = {
+        code: "ca",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Anterior",
+            next: "Següent",
+            today: "Avui",
+            month: "Mes",
+            week: "Setmana",
+            day: "Dia",
+            list: "Agenda"
+        },
+        weekLabel: "Set",
+        allDayText: "Tot el dia",
+        eventLimitText: "més",
+        noEventsMessage: "No hi ha esdeveniments per mostrar"
+    };
+
+    return ca;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/cs.js b/backoffice/vendors/fullcalendar/core/locales/cs.js
new file mode 100644 (file)
index 0000000..2624e36
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.cs = factory()));
+}(this, function () { 'use strict';
+
+    var cs = {
+        code: "cs",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Dříve",
+            next: "Později",
+            today: "Nyní",
+            month: "Měsíc",
+            week: "Týden",
+            day: "Den",
+            list: "Agenda"
+        },
+        weekLabel: "Týd",
+        allDayText: "Celý den",
+        eventLimitText: function (n) {
+            return "+další: " + n;
+        },
+        noEventsMessage: "Žádné akce k zobrazení"
+    };
+
+    return cs;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/da.js b/backoffice/vendors/fullcalendar/core/locales/da.js
new file mode 100644 (file)
index 0000000..2388d2e
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.da = factory()));
+}(this, function () { 'use strict';
+
+    var da = {
+        code: "da",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Forrige",
+            next: "Næste",
+            today: "Idag",
+            month: "Måned",
+            week: "Uge",
+            day: "Dag",
+            list: "Agenda"
+        },
+        weekLabel: "Uge",
+        allDayText: "Hele dagen",
+        eventLimitText: "flere",
+        noEventsMessage: "Ingen arrangementer at vise"
+    };
+
+    return da;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/de.js b/backoffice/vendors/fullcalendar/core/locales/de.js
new file mode 100644 (file)
index 0000000..ab5a815
--- /dev/null
@@ -0,0 +1,33 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.de = factory()));
+}(this, function () { 'use strict';
+
+    var de = {
+        code: "de",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Zurück",
+            next: "Vor",
+            today: "Heute",
+            year: "Jahr",
+            month: "Monat",
+            week: "Woche",
+            day: "Tag",
+            list: "Terminübersicht"
+        },
+        weekLabel: "KW",
+        allDayText: "Ganztägig",
+        eventLimitText: function (n) {
+            return "+ weitere " + n;
+        },
+        noEventsMessage: "Keine Ereignisse anzuzeigen"
+    };
+
+    return de;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/el.js b/backoffice/vendors/fullcalendar/core/locales/el.js
new file mode 100644 (file)
index 0000000..9f59e36
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.el = factory()));
+}(this, function () { 'use strict';
+
+    var el = {
+        code: "el",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Προηγούμενος",
+            next: "Επόμενος",
+            today: "Σήμερα",
+            month: "Μήνας",
+            week: "Εβδομάδα",
+            day: "Ημέρα",
+            list: "Ατζέντα"
+        },
+        weekLabel: "Εβδ",
+        allDayText: "Ολοήμερο",
+        eventLimitText: "περισσότερα",
+        noEventsMessage: "Δεν υπάρχουν γεγονότα για να εμφανιστεί"
+    };
+
+    return el;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/en-au.js b/backoffice/vendors/fullcalendar/core/locales/en-au.js
new file mode 100644 (file)
index 0000000..be10bfb
--- /dev/null
@@ -0,0 +1,17 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-au'] = factory()));
+}(this, function () { 'use strict';
+
+    var enAu = {
+        code: "en-au",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    };
+
+    return enAu;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/en-gb.js b/backoffice/vendors/fullcalendar/core/locales/en-gb.js
new file mode 100644 (file)
index 0000000..8a4a84e
--- /dev/null
@@ -0,0 +1,17 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-gb'] = factory()));
+}(this, function () { 'use strict';
+
+    var enGb = {
+        code: "en-gb",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    };
+
+    return enGb;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/en-nz.js b/backoffice/vendors/fullcalendar/core/locales/en-nz.js
new file mode 100644 (file)
index 0000000..df56c14
--- /dev/null
@@ -0,0 +1,17 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-nz'] = factory()));
+}(this, function () { 'use strict';
+
+    var enNz = {
+        code: "en-nz",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        }
+    };
+
+    return enNz;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/es-us.js b/backoffice/vendors/fullcalendar/core/locales/es-us.js
new file mode 100644 (file)
index 0000000..1efa89a
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['es-us'] = factory()));
+}(this, function () { 'use strict';
+
+    var esUs = {
+        code: "es",
+        week: {
+            dow: 0,
+            doy: 6 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Ant",
+            next: "Sig",
+            today: "Hoy",
+            month: "Mes",
+            week: "Semana",
+            day: "Día",
+            list: "Agenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Todo<br/>el día",
+        eventLimitText: "más",
+        noEventsMessage: "No hay eventos para mostrar"
+    };
+
+    return esUs;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/es.js b/backoffice/vendors/fullcalendar/core/locales/es.js
new file mode 100644 (file)
index 0000000..bfd9af4
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.es = factory()));
+}(this, function () { 'use strict';
+
+    var es = {
+        code: "es",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Ant",
+            next: "Sig",
+            today: "Hoy",
+            month: "Mes",
+            week: "Semana",
+            day: "Día",
+            list: "Agenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Todo<br/>el día",
+        eventLimitText: "más",
+        noEventsMessage: "No hay eventos para mostrar"
+    };
+
+    return es;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/et.js b/backoffice/vendors/fullcalendar/core/locales/et.js
new file mode 100644 (file)
index 0000000..c44fcae
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.et = factory()));
+}(this, function () { 'use strict';
+
+    var et = {
+        code: "et",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Eelnev",
+            next: "Järgnev",
+            today: "Täna",
+            month: "Kuu",
+            week: "Nädal",
+            day: "Päev",
+            list: "Päevakord"
+        },
+        weekLabel: "näd",
+        allDayText: "Kogu päev",
+        eventLimitText: function (n) {
+            return "+ veel " + n;
+        },
+        noEventsMessage: "Kuvamiseks puuduvad sündmused"
+    };
+
+    return et;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/eu.js b/backoffice/vendors/fullcalendar/core/locales/eu.js
new file mode 100644 (file)
index 0000000..91903aa
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.eu = factory()));
+}(this, function () { 'use strict';
+
+    var eu = {
+        code: "eu",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Aur",
+            next: "Hur",
+            today: "Gaur",
+            month: "Hilabetea",
+            week: "Astea",
+            day: "Eguna",
+            list: "Agenda"
+        },
+        weekLabel: "As",
+        allDayHtml: "Egun<br/>osoa",
+        eventLimitText: "gehiago",
+        noEventsMessage: "Ez dago ekitaldirik erakusteko"
+    };
+
+    return eu;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/fa.js b/backoffice/vendors/fullcalendar/core/locales/fa.js
new file mode 100644 (file)
index 0000000..031fc7b
--- /dev/null
@@ -0,0 +1,33 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fa = factory()));
+}(this, function () { 'use strict';
+
+    var fa = {
+        code: "fa",
+        week: {
+            dow: 6,
+            doy: 12 // The week that contains Jan 1st is the first week of the year.
+        },
+        dir: 'rtl',
+        buttonText: {
+            prev: "قبلی",
+            next: "بعدی",
+            today: "امروز",
+            month: "ماه",
+            week: "هفته",
+            day: "روز",
+            list: "برنامه"
+        },
+        weekLabel: "هف",
+        allDayText: "تمام روز",
+        eventLimitText: function (n) {
+            return "بیش از " + n;
+        },
+        noEventsMessage: "هیچ رویدادی به نمایش"
+    };
+
+    return fa;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/fi.js b/backoffice/vendors/fullcalendar/core/locales/fi.js
new file mode 100644 (file)
index 0000000..3912845
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fi = factory()));
+}(this, function () { 'use strict';
+
+    var fi = {
+        code: "fi",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Edellinen",
+            next: "Seuraava",
+            today: "Tänään",
+            month: "Kuukausi",
+            week: "Viikko",
+            day: "Päivä",
+            list: "Tapahtumat"
+        },
+        weekLabel: "Vk",
+        allDayText: "Koko päivä",
+        eventLimitText: "lisää",
+        noEventsMessage: "Ei näytettäviä tapahtumia"
+    };
+
+    return fi;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/fr-ca.js b/backoffice/vendors/fullcalendar/core/locales/fr-ca.js
new file mode 100644 (file)
index 0000000..d554c14
--- /dev/null
@@ -0,0 +1,27 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ca'] = factory()));
+}(this, function () { 'use strict';
+
+    var frCa = {
+        code: "fr",
+        buttonText: {
+            prev: "Précédent",
+            next: "Suivant",
+            today: "Aujourd'hui",
+            year: "Année",
+            month: "Mois",
+            week: "Semaine",
+            day: "Jour",
+            list: "Mon planning"
+        },
+        weekLabel: "Sem.",
+        allDayHtml: "Toute la<br/>journée",
+        eventLimitText: "en plus",
+        noEventsMessage: "Aucun événement à afficher"
+    };
+
+    return frCa;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/fr-ch.js b/backoffice/vendors/fullcalendar/core/locales/fr-ch.js
new file mode 100644 (file)
index 0000000..358b8bf
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ch'] = factory()));
+}(this, function () { 'use strict';
+
+    var frCh = {
+        code: "fr-ch",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Précédent",
+            next: "Suivant",
+            today: "Courant",
+            year: "Année",
+            month: "Mois",
+            week: "Semaine",
+            day: "Jour",
+            list: "Mon planning"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Toute la<br/>journée",
+        eventLimitText: "en plus",
+        noEventsMessage: "Aucun événement à afficher"
+    };
+
+    return frCh;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/fr.js b/backoffice/vendors/fullcalendar/core/locales/fr.js
new file mode 100644 (file)
index 0000000..b679cef
--- /dev/null
@@ -0,0 +1,31 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fr = factory()));
+}(this, function () { 'use strict';
+
+    var fr = {
+        code: "fr",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Précédent",
+            next: "Suivant",
+            today: "Aujourd'hui",
+            year: "Année",
+            month: "Mois",
+            week: "Semaine",
+            day: "Jour",
+            list: "Mon planning"
+        },
+        weekLabel: "Sem.",
+        allDayHtml: "Toute la<br/>journée",
+        eventLimitText: "en plus",
+        noEventsMessage: "Aucun événement à afficher"
+    };
+
+    return fr;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/gl.js b/backoffice/vendors/fullcalendar/core/locales/gl.js
new file mode 100644 (file)
index 0000000..721a6a8
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.gl = factory()));
+}(this, function () { 'use strict';
+
+    var gl = {
+        code: "gl",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Ant",
+            next: "Seg",
+            today: "Hoxe",
+            month: "Mes",
+            week: "Semana",
+            day: "Día",
+            list: "Axenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Todo<br/>o día",
+        eventLimitText: "máis",
+        noEventsMessage: "Non hai eventos para amosar"
+    };
+
+    return gl;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/he.js b/backoffice/vendors/fullcalendar/core/locales/he.js
new file mode 100644 (file)
index 0000000..3521d9e
--- /dev/null
@@ -0,0 +1,27 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.he = factory()));
+}(this, function () { 'use strict';
+
+    var he = {
+        code: "he",
+        dir: 'rtl',
+        buttonText: {
+            prev: "הקודם",
+            next: "הבא",
+            today: "היום",
+            month: "חודש",
+            week: "שבוע",
+            day: "יום",
+            list: "סדר יום"
+        },
+        allDayText: "כל היום",
+        eventLimitText: "אחר",
+        noEventsMessage: "אין אירועים להצגה",
+        weekLabel: "שבוע"
+    };
+
+    return he;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/hi.js b/backoffice/vendors/fullcalendar/core/locales/hi.js
new file mode 100644 (file)
index 0000000..15348e6
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hi = factory()));
+}(this, function () { 'use strict';
+
+    var hi = {
+        code: "hi",
+        week: {
+            dow: 0,
+            doy: 6 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "पिछला",
+            next: "अगला",
+            today: "आज",
+            month: "महीना",
+            week: "सप्ताह",
+            day: "दिन",
+            list: "कार्यसूची"
+        },
+        weekLabel: "हफ्ता",
+        allDayText: "सभी दिन",
+        eventLimitText: function (n) {
+            return "+अधिक " + n;
+        },
+        noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
+    };
+
+    return hi;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/hr.js b/backoffice/vendors/fullcalendar/core/locales/hr.js
new file mode 100644 (file)
index 0000000..295b485
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hr = factory()));
+}(this, function () { 'use strict';
+
+    var hr = {
+        code: "hr",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prijašnji",
+            next: "Sljedeći",
+            today: "Danas",
+            month: "Mjesec",
+            week: "Tjedan",
+            day: "Dan",
+            list: "Raspored"
+        },
+        weekLabel: "Tje",
+        allDayText: "Cijeli dan",
+        eventLimitText: function (n) {
+            return "+ još " + n;
+        },
+        noEventsMessage: "Nema događaja za prikaz"
+    };
+
+    return hr;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/hu.js b/backoffice/vendors/fullcalendar/core/locales/hu.js
new file mode 100644 (file)
index 0000000..2f0fe8a
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hu = factory()));
+}(this, function () { 'use strict';
+
+    var hu = {
+        code: "hu",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "vissza",
+            next: "előre",
+            today: "ma",
+            month: "Hónap",
+            week: "Hét",
+            day: "Nap",
+            list: "Napló"
+        },
+        weekLabel: "Hét",
+        allDayText: "Egész nap",
+        eventLimitText: "további",
+        noEventsMessage: "Nincs megjeleníthető esemény"
+    };
+
+    return hu;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/id.js b/backoffice/vendors/fullcalendar/core/locales/id.js
new file mode 100644 (file)
index 0000000..b742e80
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.id = factory()));
+}(this, function () { 'use strict';
+
+    var id = {
+        code: "id",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "mundur",
+            next: "maju",
+            today: "hari ini",
+            month: "Bulan",
+            week: "Minggu",
+            day: "Hari",
+            list: "Agenda"
+        },
+        weekLabel: "Mg",
+        allDayHtml: "Sehari<br/>penuh",
+        eventLimitText: "lebih",
+        noEventsMessage: "Tidak ada acara untuk ditampilkan"
+    };
+
+    return id;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/is.js b/backoffice/vendors/fullcalendar/core/locales/is.js
new file mode 100644 (file)
index 0000000..dd569bc
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.is = factory()));
+}(this, function () { 'use strict';
+
+    var is = {
+        code: "is",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Fyrri",
+            next: "Næsti",
+            today: "Í dag",
+            month: "Mánuður",
+            week: "Vika",
+            day: "Dagur",
+            list: "Dagskrá"
+        },
+        weekLabel: "Vika",
+        allDayHtml: "Allan<br/>daginn",
+        eventLimitText: "meira",
+        noEventsMessage: "Engir viðburðir til að sýna"
+    };
+
+    return is;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/it.js b/backoffice/vendors/fullcalendar/core/locales/it.js
new file mode 100644 (file)
index 0000000..39a2829
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.it = factory()));
+}(this, function () { 'use strict';
+
+    var it = {
+        code: "it",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prec",
+            next: "Succ",
+            today: "Oggi",
+            month: "Mese",
+            week: "Settimana",
+            day: "Giorno",
+            list: "Agenda"
+        },
+        weekLabel: "Sm",
+        allDayHtml: "Tutto il<br/>giorno",
+        eventLimitText: function (n) {
+            return "+altri " + n;
+        },
+        noEventsMessage: "Non ci sono eventi da visualizzare"
+    };
+
+    return it;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ja.js b/backoffice/vendors/fullcalendar/core/locales/ja.js
new file mode 100644 (file)
index 0000000..eb4245b
--- /dev/null
@@ -0,0 +1,28 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ja = factory()));
+}(this, function () { 'use strict';
+
+    var ja = {
+        code: "ja",
+        buttonText: {
+            prev: "前",
+            next: "次",
+            today: "今日",
+            month: "月",
+            week: "週",
+            day: "日",
+            list: "予定リスト"
+        },
+        weekLabel: "週",
+        allDayText: "終日",
+        eventLimitText: function (n) {
+            return "他 " + n + " 件";
+        },
+        noEventsMessage: "表示する予定はありません"
+    };
+
+    return ja;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ka.js b/backoffice/vendors/fullcalendar/core/locales/ka.js
new file mode 100644 (file)
index 0000000..b971c03
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ka = factory()));
+}(this, function () { 'use strict';
+
+    var ka = {
+        code: "ka",
+        week: {
+            dow: 1,
+            doy: 7
+        },
+        buttonText: {
+            prev: "წინა",
+            next: "შემდეგი",
+            today: "დღეს",
+            month: "თვე",
+            week: "კვირა",
+            day: "დღე",
+            list: "დღის წესრიგი"
+        },
+        weekLabel: "კვ",
+        allDayText: "მთელი დღე",
+        eventLimitText: function (n) {
+            return "+ კიდევ " + n;
+        },
+        noEventsMessage: "ღონისძიებები არ არის"
+    };
+
+    return ka;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/kk.js b/backoffice/vendors/fullcalendar/core/locales/kk.js
new file mode 100644 (file)
index 0000000..5b19b99
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.kk = factory()));
+}(this, function () { 'use strict';
+
+    var kk = {
+        code: "kk",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Алдыңғы",
+            next: "Келесі",
+            today: "Бүгін",
+            month: "Ай",
+            week: "Апта",
+            day: "Күн",
+            list: "Күн тәртібі"
+        },
+        weekLabel: "Не",
+        allDayText: "Күні бойы",
+        eventLimitText: function (n) {
+            return "+ тағы " + n;
+        },
+        noEventsMessage: "Көрсету үшін оқиғалар жоқ"
+    };
+
+    return kk;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ko.js b/backoffice/vendors/fullcalendar/core/locales/ko.js
new file mode 100644 (file)
index 0000000..ffe985d
--- /dev/null
@@ -0,0 +1,26 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ko = factory()));
+}(this, function () { 'use strict';
+
+    var ko = {
+        code: "ko",
+        buttonText: {
+            prev: "이전달",
+            next: "다음달",
+            today: "오늘",
+            month: "월",
+            week: "주",
+            day: "일",
+            list: "일정목록"
+        },
+        weekLabel: "주",
+        allDayText: "종일",
+        eventLimitText: "개",
+        noEventsMessage: "일정이 없습니다"
+    };
+
+    return ko;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/lb.js b/backoffice/vendors/fullcalendar/core/locales/lb.js
new file mode 100644 (file)
index 0000000..b9b17e3
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lb = factory()));
+}(this, function () { 'use strict';
+
+    var lb = {
+        code: "lb",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Zréck",
+            next: "Weider",
+            today: "Haut",
+            month: "Mount",
+            week: "Woch",
+            day: "Dag",
+            list: "Terminiwwersiicht"
+        },
+        weekLabel: "W",
+        allDayText: "Ganzen Dag",
+        eventLimitText: "méi",
+        noEventsMessage: "Nee Evenementer ze affichéieren"
+    };
+
+    return lb;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/lt.js b/backoffice/vendors/fullcalendar/core/locales/lt.js
new file mode 100644 (file)
index 0000000..ec641b7
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lt = factory()));
+}(this, function () { 'use strict';
+
+    var lt = {
+        code: "lt",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Atgal",
+            next: "Pirmyn",
+            today: "Šiandien",
+            month: "Mėnuo",
+            week: "Savaitė",
+            day: "Diena",
+            list: "Darbotvarkė"
+        },
+        weekLabel: "SAV",
+        allDayText: "Visą dieną",
+        eventLimitText: "daugiau",
+        noEventsMessage: "Nėra įvykių rodyti"
+    };
+
+    return lt;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/lv.js b/backoffice/vendors/fullcalendar/core/locales/lv.js
new file mode 100644 (file)
index 0000000..5453630
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lv = factory()));
+}(this, function () { 'use strict';
+
+    var lv = {
+        code: "lv",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Iepr.",
+            next: "Nāk.",
+            today: "Šodien",
+            month: "Mēnesis",
+            week: "Nedēļa",
+            day: "Diena",
+            list: "Dienas kārtība"
+        },
+        weekLabel: "Ned.",
+        allDayText: "Visu dienu",
+        eventLimitText: function (n) {
+            return "+vēl " + n;
+        },
+        noEventsMessage: "Nav notikumu"
+    };
+
+    return lv;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/mk.js b/backoffice/vendors/fullcalendar/core/locales/mk.js
new file mode 100644 (file)
index 0000000..6729fa6
--- /dev/null
@@ -0,0 +1,28 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.mk = factory()));
+}(this, function () { 'use strict';
+
+    var mk = {
+        code: "mk",
+        buttonText: {
+            prev: "претходно",
+            next: "следно",
+            today: "Денес",
+            month: "Месец",
+            week: "Недела",
+            day: "Ден",
+            list: "График"
+        },
+        weekLabel: "Сед",
+        allDayText: "Цел ден",
+        eventLimitText: function (n) {
+            return "+повеќе " + n;
+        },
+        noEventsMessage: "Нема настани за прикажување"
+    };
+
+    return mk;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ms.js b/backoffice/vendors/fullcalendar/core/locales/ms.js
new file mode 100644 (file)
index 0000000..7205ecc
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ms = factory()));
+}(this, function () { 'use strict';
+
+    var ms = {
+        code: "ms",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Sebelum",
+            next: "Selepas",
+            today: "hari ini",
+            month: "Bulan",
+            week: "Minggu",
+            day: "Hari",
+            list: "Agenda"
+        },
+        weekLabel: "Mg",
+        allDayText: "Sepanjang hari",
+        eventLimitText: function (n) {
+            return "masih ada " + n + " acara";
+        },
+        noEventsMessage: "Tiada peristiwa untuk dipaparkan"
+    };
+
+    return ms;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/nb.js b/backoffice/vendors/fullcalendar/core/locales/nb.js
new file mode 100644 (file)
index 0000000..6464461
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nb = factory()));
+}(this, function () { 'use strict';
+
+    var nb = {
+        code: "nb",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Forrige",
+            next: "Neste",
+            today: "I dag",
+            month: "Måned",
+            week: "Uke",
+            day: "Dag",
+            list: "Agenda"
+        },
+        weekLabel: "Uke",
+        allDayText: "Hele dagen",
+        eventLimitText: "til",
+        noEventsMessage: "Ingen hendelser å vise"
+    };
+
+    return nb;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/nl.js b/backoffice/vendors/fullcalendar/core/locales/nl.js
new file mode 100644 (file)
index 0000000..c91b5e5
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nl = factory()));
+}(this, function () { 'use strict';
+
+    var nl = {
+        code: "nl",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Voorgaand",
+            next: "Volgende",
+            today: "Vandaag",
+            year: "Jaar",
+            month: "Maand",
+            week: "Week",
+            day: "Dag",
+            list: "Agenda"
+        },
+        allDayText: "Hele dag",
+        eventLimitText: "extra",
+        noEventsMessage: "Geen evenementen om te laten zien"
+    };
+
+    return nl;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/nn.js b/backoffice/vendors/fullcalendar/core/locales/nn.js
new file mode 100644 (file)
index 0000000..a5cdd16
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nn = factory()));
+}(this, function () { 'use strict';
+
+    var nn = {
+        code: "nn",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Førre",
+            next: "Neste",
+            today: "I dag",
+            month: "Månad",
+            week: "Veke",
+            day: "Dag",
+            list: "Agenda"
+        },
+        weekLabel: "Veke",
+        allDayText: "Heile dagen",
+        eventLimitText: "til",
+        noEventsMessage: "Ingen hendelser å vise"
+    };
+
+    return nn;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/pl.js b/backoffice/vendors/fullcalendar/core/locales/pl.js
new file mode 100644 (file)
index 0000000..0a22e69
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pl = factory()));
+}(this, function () { 'use strict';
+
+    var pl = {
+        code: "pl",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Poprzedni",
+            next: "Następny",
+            today: "Dziś",
+            month: "Miesiąc",
+            week: "Tydzień",
+            day: "Dzień",
+            list: "Plan dnia"
+        },
+        weekLabel: "Tydz",
+        allDayText: "Cały dzień",
+        eventLimitText: "więcej",
+        noEventsMessage: "Brak wydarzeń do wyświetlenia"
+    };
+
+    return pl;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/pt-br.js b/backoffice/vendors/fullcalendar/core/locales/pt-br.js
new file mode 100644 (file)
index 0000000..0133cd6
--- /dev/null
@@ -0,0 +1,28 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['pt-br'] = factory()));
+}(this, function () { 'use strict';
+
+    var ptBr = {
+        code: "pt-br",
+        buttonText: {
+            prev: "Anterior",
+            next: "Próximo",
+            today: "Hoje",
+            month: "Mês",
+            week: "Semana",
+            day: "Dia",
+            list: "Compromissos"
+        },
+        weekLabel: "Sm",
+        allDayText: "dia inteiro",
+        eventLimitText: function (n) {
+            return "mais +" + n;
+        },
+        noEventsMessage: "Não há eventos para mostrar"
+    };
+
+    return ptBr;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/pt.js b/backoffice/vendors/fullcalendar/core/locales/pt.js
new file mode 100644 (file)
index 0000000..5c54d8d
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pt = factory()));
+}(this, function () { 'use strict';
+
+    var pt = {
+        code: "pt",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Anterior",
+            next: "Seguinte",
+            today: "Hoje",
+            month: "Mês",
+            week: "Semana",
+            day: "Dia",
+            list: "Agenda"
+        },
+        weekLabel: "Sem",
+        allDayText: "Todo o dia",
+        eventLimitText: "mais",
+        noEventsMessage: "Não há eventos para mostrar"
+    };
+
+    return pt;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ro.js b/backoffice/vendors/fullcalendar/core/locales/ro.js
new file mode 100644 (file)
index 0000000..e8992f2
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ro = factory()));
+}(this, function () { 'use strict';
+
+    var ro = {
+        code: "ro",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "precedentă",
+            next: "următoare",
+            today: "Azi",
+            month: "Lună",
+            week: "Săptămână",
+            day: "Zi",
+            list: "Agendă"
+        },
+        weekLabel: "Săpt",
+        allDayText: "Toată ziua",
+        eventLimitText: function (n) {
+            return "+alte " + n;
+        },
+        noEventsMessage: "Nu există evenimente de afișat"
+    };
+
+    return ro;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/ru.js b/backoffice/vendors/fullcalendar/core/locales/ru.js
new file mode 100644 (file)
index 0000000..77e0308
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ru = factory()));
+}(this, function () { 'use strict';
+
+    var ru = {
+        code: "ru",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Пред",
+            next: "След",
+            today: "Сегодня",
+            month: "Месяц",
+            week: "Неделя",
+            day: "День",
+            list: "Повестка дня"
+        },
+        weekLabel: "Нед",
+        allDayText: "Весь день",
+        eventLimitText: function (n) {
+            return "+ ещё " + n;
+        },
+        noEventsMessage: "Нет событий для отображения"
+    };
+
+    return ru;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/sk.js b/backoffice/vendors/fullcalendar/core/locales/sk.js
new file mode 100644 (file)
index 0000000..3513a64
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sk = factory()));
+}(this, function () { 'use strict';
+
+    var sk = {
+        code: "sk",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Predchádzajúci",
+            next: "Nasledujúci",
+            today: "Dnes",
+            month: "Mesiac",
+            week: "Týždeň",
+            day: "Deň",
+            list: "Rozvrh"
+        },
+        weekLabel: "Ty",
+        allDayText: "Celý deň",
+        eventLimitText: function (n) {
+            return "+ďalšie: " + n;
+        },
+        noEventsMessage: "Žiadne akcie na zobrazenie"
+    };
+
+    return sk;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/sl.js b/backoffice/vendors/fullcalendar/core/locales/sl.js
new file mode 100644 (file)
index 0000000..3233553
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sl = factory()));
+}(this, function () { 'use strict';
+
+    var sl = {
+        code: "sl",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prejšnji",
+            next: "Naslednji",
+            today: "Trenutni",
+            month: "Mesec",
+            week: "Teden",
+            day: "Dan",
+            list: "Dnevni red"
+        },
+        weekLabel: "Teden",
+        allDayText: "Ves dan",
+        eventLimitText: "več",
+        noEventsMessage: "Ni dogodkov za prikaz"
+    };
+
+    return sl;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/sq.js b/backoffice/vendors/fullcalendar/core/locales/sq.js
new file mode 100644 (file)
index 0000000..0d43a52
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sq = factory()));
+}(this, function () { 'use strict';
+
+    var sq = {
+        code: "sq",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "mbrapa",
+            next: "Përpara",
+            today: "sot",
+            month: "Muaj",
+            week: "Javë",
+            day: "Ditë",
+            list: "Listë"
+        },
+        weekLabel: "Ja",
+        allDayHtml: "Gjithë<br/>ditën",
+        eventLimitText: function (n) {
+            return "+më tepër " + n;
+        },
+        noEventsMessage: "Nuk ka evente për të shfaqur"
+    };
+
+    return sq;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/sr-cyrl.js b/backoffice/vendors/fullcalendar/core/locales/sr-cyrl.js
new file mode 100644 (file)
index 0000000..ba0d0df
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['sr-cyrl'] = factory()));
+}(this, function () { 'use strict';
+
+    var srCyrl = {
+        code: "sr-cyrl",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Претходна",
+            next: "следећи",
+            today: "Данас",
+            month: "Месец",
+            week: "Недеља",
+            day: "Дан",
+            list: "Планер"
+        },
+        weekLabel: "Сед",
+        allDayText: "Цео дан",
+        eventLimitText: function (n) {
+            return "+ још " + n;
+        },
+        noEventsMessage: "Нема догађаја за приказ"
+    };
+
+    return srCyrl;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/sr.js b/backoffice/vendors/fullcalendar/core/locales/sr.js
new file mode 100644 (file)
index 0000000..23e5c9b
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sr = factory()));
+}(this, function () { 'use strict';
+
+    var sr = {
+        code: "sr",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Prethodna",
+            next: "Sledeći",
+            today: "Danas",
+            month: "Mеsеc",
+            week: "Nеdеlja",
+            day: "Dan",
+            list: "Planеr"
+        },
+        weekLabel: "Sed",
+        allDayText: "Cеo dan",
+        eventLimitText: function (n) {
+            return "+ još " + n;
+        },
+        noEventsMessage: "Nеma događaja za prikaz"
+    };
+
+    return sr;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/sv.js b/backoffice/vendors/fullcalendar/core/locales/sv.js
new file mode 100644 (file)
index 0000000..a887060
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sv = factory()));
+}(this, function () { 'use strict';
+
+    var sv = {
+        code: "sv",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Förra",
+            next: "Nästa",
+            today: "Idag",
+            month: "Månad",
+            week: "Vecka",
+            day: "Dag",
+            list: "Program"
+        },
+        weekLabel: "v.",
+        allDayText: "Heldag",
+        eventLimitText: "till",
+        noEventsMessage: "Inga händelser att visa"
+    };
+
+    return sv;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/th.js b/backoffice/vendors/fullcalendar/core/locales/th.js
new file mode 100644 (file)
index 0000000..caa3fe9
--- /dev/null
@@ -0,0 +1,25 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.th = factory()));
+}(this, function () { 'use strict';
+
+    var th = {
+        code: "th",
+        buttonText: {
+            prev: "ย้อน",
+            next: "ถัดไป",
+            today: "วันนี้",
+            month: "เดือน",
+            week: "สัปดาห์",
+            day: "วัน",
+            list: "แผนงาน"
+        },
+        allDayText: "ตลอดวัน",
+        eventLimitText: "เพิ่มเติม",
+        noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
+    };
+
+    return th;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/tr.js b/backoffice/vendors/fullcalendar/core/locales/tr.js
new file mode 100644 (file)
index 0000000..4845898
--- /dev/null
@@ -0,0 +1,30 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.tr = factory()));
+}(this, function () { 'use strict';
+
+    var tr = {
+        code: "tr",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "geri",
+            next: "ileri",
+            today: "bugün",
+            month: "Ay",
+            week: "Hafta",
+            day: "Gün",
+            list: "Ajanda"
+        },
+        weekLabel: "Hf",
+        allDayText: "Tüm gün",
+        eventLimitText: "daha fazla",
+        noEventsMessage: "Gösterilecek etkinlik yok"
+    };
+
+    return tr;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/uk.js b/backoffice/vendors/fullcalendar/core/locales/uk.js
new file mode 100644 (file)
index 0000000..de33f25
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uk = factory()));
+}(this, function () { 'use strict';
+
+    var uk = {
+        code: "uk",
+        week: {
+            dow: 1,
+            doy: 7 // The week that contains Jan 1st is the first week of the year.
+        },
+        buttonText: {
+            prev: "Попередній",
+            next: "далі",
+            today: "Сьогодні",
+            month: "Місяць",
+            week: "Тиждень",
+            day: "День",
+            list: "Порядок денний"
+        },
+        weekLabel: "Тиж",
+        allDayText: "Увесь день",
+        eventLimitText: function (n) {
+            return "+ще " + n + "...";
+        },
+        noEventsMessage: "Немає подій для відображення"
+    };
+
+    return uk;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/vi.js b/backoffice/vendors/fullcalendar/core/locales/vi.js
new file mode 100644 (file)
index 0000000..167ce11
--- /dev/null
@@ -0,0 +1,32 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.vi = factory()));
+}(this, function () { 'use strict';
+
+    var vi = {
+        code: "vi",
+        week: {
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "Trước",
+            next: "Tiếp",
+            today: "Hôm nay",
+            month: "Tháng",
+            week: "Tuần",
+            day: "Ngày",
+            list: "Lịch biểu"
+        },
+        weekLabel: "Tu",
+        allDayText: "Cả ngày",
+        eventLimitText: function (n) {
+            return "+ thêm " + n;
+        },
+        noEventsMessage: "Không có sự kiện để hiển thị"
+    };
+
+    return vi;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/zh-cn.js b/backoffice/vendors/fullcalendar/core/locales/zh-cn.js
new file mode 100644 (file)
index 0000000..4debbb9
--- /dev/null
@@ -0,0 +1,33 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-cn'] = factory()));
+}(this, function () { 'use strict';
+
+    var zhCn = {
+        code: "zh-cn",
+        week: {
+            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+            dow: 1,
+            doy: 4 // The week that contains Jan 4th is the first week of the year.
+        },
+        buttonText: {
+            prev: "上月",
+            next: "下月",
+            today: "今天",
+            month: "月",
+            week: "周",
+            day: "日",
+            list: "日程"
+        },
+        weekLabel: "周",
+        allDayText: "全天",
+        eventLimitText: function (n) {
+            return "另外 " + n + " 个";
+        },
+        noEventsMessage: "没有事件显示"
+    };
+
+    return zhCn;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/locales/zh-tw.js b/backoffice/vendors/fullcalendar/core/locales/zh-tw.js
new file mode 100644 (file)
index 0000000..bc14dcd
--- /dev/null
@@ -0,0 +1,26 @@
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+    typeof define === 'function' && define.amd ? define(factory) :
+    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-tw'] = factory()));
+}(this, function () { 'use strict';
+
+    var zhTw = {
+        code: "zh-tw",
+        buttonText: {
+            prev: "上月",
+            next: "下月",
+            today: "今天",
+            month: "月",
+            week: "週",
+            day: "天",
+            list: "活動列表"
+        },
+        weekLabel: "周",
+        allDayText: "整天",
+        eventLimitText: '顯示更多',
+        noEventsMessage: "没有任何活動"
+    };
+
+    return zhTw;
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/main.css b/backoffice/vendors/fullcalendar/core/main.css
new file mode 100644 (file)
index 0000000..b9d7294
--- /dev/null
@@ -0,0 +1,900 @@
+/*!
+FullCalendar Core Package v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+.fc {
+  direction: ltr;
+  text-align: left; }
+
+.fc-rtl {
+  text-align: right; }
+
+body .fc {
+  /* extra precedence to overcome jqui */
+  font-size: 1em; }
+
+/* Colors
+--------------------------------------------------------------------------------------------------*/
+.fc-highlight {
+  /* when user is selecting cells */
+  background: #bce8f1;
+  opacity: .3; }
+
+.fc-bgevent {
+  /* default look for background events */
+  background: #8fdf82;
+  opacity: .3; }
+
+.fc-nonbusiness {
+  /* default look for non-business-hours areas */
+  /* will inherit .fc-bgevent's styles */
+  background: #d7d7d7; }
+
+/* Popover
+--------------------------------------------------------------------------------------------------*/
+.fc-popover {
+  position: absolute;
+  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); }
+
+.fc-popover .fc-header {
+  /* TODO: be more consistent with fc-head/fc-body */
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  align-items: center;
+  padding: 2px 4px; }
+
+.fc-rtl .fc-popover .fc-header {
+  flex-direction: row-reverse; }
+
+.fc-popover .fc-header .fc-title {
+  margin: 0 2px; }
+
+.fc-popover .fc-header .fc-close {
+  cursor: pointer;
+  opacity: 0.65;
+  font-size: 1.1em; }
+
+/* Misc Reusable Components
+--------------------------------------------------------------------------------------------------*/
+.fc-divider {
+  border-style: solid;
+  border-width: 1px; }
+
+hr.fc-divider {
+  height: 0;
+  margin: 0;
+  padding: 0 0 2px;
+  /* height is unreliable across browsers, so use padding */
+  border-width: 1px 0; }
+
+.fc-bg,
+.fc-bgevent-skeleton,
+.fc-highlight-skeleton,
+.fc-mirror-skeleton {
+  /* these element should always cling to top-left/right corners */
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0; }
+
+.fc-bg {
+  bottom: 0;
+  /* strech bg to bottom edge */ }
+
+.fc-bg table {
+  height: 100%;
+  /* strech bg to bottom edge */ }
+
+/* Tables
+--------------------------------------------------------------------------------------------------*/
+.fc table {
+  width: 100%;
+  box-sizing: border-box;
+  /* fix scrollbar issue in firefox */
+  table-layout: fixed;
+  border-collapse: collapse;
+  border-spacing: 0;
+  font-size: 1em;
+  /* normalize cross-browser */ }
+
+.fc th {
+  text-align: center; }
+
+.fc th,
+.fc td {
+  border-style: solid;
+  border-width: 1px;
+  padding: 0;
+  vertical-align: top; }
+
+.fc td.fc-today {
+  border-style: double;
+  /* overcome neighboring borders */ }
+
+/* Internal Nav Links
+--------------------------------------------------------------------------------------------------*/
+a[data-goto] {
+  cursor: pointer; }
+
+a[data-goto]:hover {
+  text-decoration: underline; }
+
+/* Fake Table Rows
+--------------------------------------------------------------------------------------------------*/
+.fc .fc-row {
+  /* extra precedence to overcome themes forcing a 1px border */
+  /* no visible border by default. but make available if need be (scrollbar width compensation) */
+  border-style: solid;
+  border-width: 0; }
+
+.fc-row table {
+  /* don't put left/right border on anything within a fake row.
+     the outer tbody will worry about this */
+  border-left: 0 hidden transparent;
+  border-right: 0 hidden transparent;
+  /* no bottom borders on rows */
+  border-bottom: 0 hidden transparent; }
+
+.fc-row:first-child table {
+  border-top: 0 hidden transparent;
+  /* no top border on first row */ }
+
+/* Day Row (used within the header and the DayGrid)
+--------------------------------------------------------------------------------------------------*/
+.fc-row {
+  position: relative; }
+
+.fc-row .fc-bg {
+  z-index: 1; }
+
+/* highlighting cells & background event skeleton */
+.fc-row .fc-bgevent-skeleton,
+.fc-row .fc-highlight-skeleton {
+  bottom: 0;
+  /* stretch skeleton to bottom of row */ }
+
+.fc-row .fc-bgevent-skeleton table,
+.fc-row .fc-highlight-skeleton table {
+  height: 100%;
+  /* stretch skeleton to bottom of row */ }
+
+.fc-row .fc-highlight-skeleton td,
+.fc-row .fc-bgevent-skeleton td {
+  border-color: transparent; }
+
+.fc-row .fc-bgevent-skeleton {
+  z-index: 2; }
+
+.fc-row .fc-highlight-skeleton {
+  z-index: 3; }
+
+/*
+row content (which contains day/week numbers and events) as well as "mirror" (which contains
+temporary rendered events).
+*/
+.fc-row .fc-content-skeleton {
+  position: relative;
+  z-index: 4;
+  padding-bottom: 2px;
+  /* matches the space above the events */ }
+
+.fc-row .fc-mirror-skeleton {
+  z-index: 5; }
+
+.fc .fc-row .fc-content-skeleton table,
+.fc .fc-row .fc-content-skeleton td,
+.fc .fc-row .fc-mirror-skeleton td {
+  /* see-through to the background below */
+  /* extra precedence to prevent theme-provided backgrounds */
+  background: none;
+  /* in case <td>s are globally styled */
+  border-color: transparent; }
+
+.fc-row .fc-content-skeleton td,
+.fc-row .fc-mirror-skeleton td {
+  /* don't put a border between events and/or the day number */
+  border-bottom: 0; }
+
+.fc-row .fc-content-skeleton tbody td,
+.fc-row .fc-mirror-skeleton tbody td {
+  /* don't put a border between event cells */
+  border-top: 0; }
+
+/* Scrolling Container
+--------------------------------------------------------------------------------------------------*/
+.fc-scroller {
+  -webkit-overflow-scrolling: touch; }
+
+/* TODO: move to timegrid/daygrid */
+.fc-scroller > .fc-day-grid,
+.fc-scroller > .fc-time-grid {
+  position: relative;
+  /* re-scope all positions */
+  width: 100%;
+  /* hack to force re-sizing this inner element when scrollbars appear/disappear */ }
+
+/* Global Event Styles
+--------------------------------------------------------------------------------------------------*/
+.fc-event {
+  position: relative;
+  /* for resize handle and other inner positioning */
+  display: block;
+  /* make the <a> tag block */
+  font-size: .85em;
+  line-height: 1.4;
+  border-radius: 3px;
+  border: 1px solid #3788d8; }
+
+.fc-event,
+.fc-event-dot {
+  background-color: #3788d8;
+  /* default BACKGROUND color */ }
+
+.fc-event,
+.fc-event:hover {
+  color: #fff;
+  /* default TEXT color */
+  text-decoration: none;
+  /* if <a> has an href */ }
+
+.fc-event[href],
+.fc-event.fc-draggable {
+  cursor: pointer;
+  /* give events with links and draggable events a hand mouse pointer */ }
+
+.fc-not-allowed,
+.fc-not-allowed .fc-event {
+  /* to override an event's custom cursor */
+  cursor: not-allowed; }
+
+.fc-event .fc-content {
+  position: relative;
+  z-index: 2; }
+
+/* resizer (cursor AND touch devices) */
+.fc-event .fc-resizer {
+  position: absolute;
+  z-index: 4; }
+
+/* resizer (touch devices) */
+.fc-event .fc-resizer {
+  display: none; }
+
+.fc-event.fc-allow-mouse-resize .fc-resizer,
+.fc-event.fc-selected .fc-resizer {
+  /* only show when hovering or selected (with touch) */
+  display: block; }
+
+/* hit area */
+.fc-event.fc-selected .fc-resizer:before {
+  /* 40x40 touch area */
+  content: "";
+  position: absolute;
+  z-index: 9999;
+  /* user of this util can scope within a lower z-index */
+  top: 50%;
+  left: 50%;
+  width: 40px;
+  height: 40px;
+  margin-left: -20px;
+  margin-top: -20px; }
+
+/* Event Selection (only for touch devices)
+--------------------------------------------------------------------------------------------------*/
+.fc-event.fc-selected {
+  z-index: 9999 !important;
+  /* overcomes inline z-index */
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); }
+
+.fc-event.fc-selected:after {
+  content: "";
+  position: absolute;
+  z-index: 1;
+  /* same z-index as fc-bg, behind text */
+  /* overcome the borders */
+  top: -1px;
+  right: -1px;
+  bottom: -1px;
+  left: -1px;
+  /* darkening effect */
+  background: #000;
+  opacity: .25; }
+
+/* Event Dragging
+--------------------------------------------------------------------------------------------------*/
+.fc-event.fc-dragging.fc-selected {
+  box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3); }
+
+.fc-event.fc-dragging:not(.fc-selected) {
+  opacity: .75; }
+
+/* Horizontal Events
+--------------------------------------------------------------------------------------------------*/
+/* bigger touch area when selected */
+.fc-h-event.fc-selected:before {
+  content: "";
+  position: absolute;
+  z-index: 3;
+  /* below resizers */
+  top: -10px;
+  bottom: -10px;
+  left: 0;
+  right: 0; }
+
+/* events that are continuing to/from another week. kill rounded corners and butt up against edge */
+.fc-ltr .fc-h-event.fc-not-start,
+.fc-rtl .fc-h-event.fc-not-end {
+  margin-left: 0;
+  border-left-width: 0;
+  padding-left: 1px;
+  /* replace the border with padding */
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0; }
+
+.fc-ltr .fc-h-event.fc-not-end,
+.fc-rtl .fc-h-event.fc-not-start {
+  margin-right: 0;
+  border-right-width: 0;
+  padding-right: 1px;
+  /* replace the border with padding */
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0; }
+
+/* resizer (cursor AND touch devices) */
+/* left resizer  */
+.fc-ltr .fc-h-event .fc-start-resizer,
+.fc-rtl .fc-h-event .fc-end-resizer {
+  cursor: w-resize;
+  left: -1px;
+  /* overcome border */ }
+
+/* right resizer */
+.fc-ltr .fc-h-event .fc-end-resizer,
+.fc-rtl .fc-h-event .fc-start-resizer {
+  cursor: e-resize;
+  right: -1px;
+  /* overcome border */ }
+
+/* resizer (mouse devices) */
+.fc-h-event.fc-allow-mouse-resize .fc-resizer {
+  width: 7px;
+  top: -1px;
+  /* overcome top border */
+  bottom: -1px;
+  /* overcome bottom border */ }
+
+/* resizer (touch devices) */
+.fc-h-event.fc-selected .fc-resizer {
+  /* 8x8 little dot */
+  border-radius: 4px;
+  border-width: 1px;
+  width: 6px;
+  height: 6px;
+  border-style: solid;
+  border-color: inherit;
+  background: #fff;
+  /* vertically center */
+  top: 50%;
+  margin-top: -4px; }
+
+/* left resizer  */
+.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,
+.fc-rtl .fc-h-event.fc-selected .fc-end-resizer {
+  margin-left: -4px;
+  /* centers the 8x8 dot on the left edge */ }
+
+/* right resizer */
+.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,
+.fc-rtl .fc-h-event.fc-selected .fc-start-resizer {
+  margin-right: -4px;
+  /* centers the 8x8 dot on the right edge */ }
+
+/* DayGrid events
+----------------------------------------------------------------------------------------------------
+We use the full "fc-day-grid-event" class instead of using descendants because the event won't
+be a descendant of the grid when it is being dragged.
+*/
+.fc-day-grid-event {
+  margin: 1px 2px 0;
+  /* spacing between events and edges */
+  padding: 0 1px; }
+
+tr:first-child > td > .fc-day-grid-event {
+  margin-top: 2px;
+  /* a little bit more space before the first event */ }
+
+.fc-mirror-skeleton tr:first-child > td > .fc-day-grid-event {
+  margin-top: 0;
+  /* except for mirror skeleton */ }
+
+.fc-day-grid-event .fc-content {
+  /* force events to be one-line tall */
+  white-space: nowrap;
+  overflow: hidden; }
+
+.fc-day-grid-event .fc-time {
+  font-weight: bold; }
+
+/* resizer (cursor devices) */
+/* left resizer  */
+.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,
+.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer {
+  margin-left: -2px;
+  /* to the day cell's edge */ }
+
+/* right resizer */
+.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,
+.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer {
+  margin-right: -2px;
+  /* to the day cell's edge */ }
+
+/* Event Limiting
+--------------------------------------------------------------------------------------------------*/
+/* "more" link that represents hidden events */
+a.fc-more {
+  margin: 1px 3px;
+  font-size: .85em;
+  cursor: pointer;
+  text-decoration: none; }
+
+a.fc-more:hover {
+  text-decoration: underline; }
+
+.fc-limited {
+  /* rows and cells that are hidden because of a "more" link */
+  display: none; }
+
+/* popover that appears when "more" link is clicked */
+.fc-day-grid .fc-row {
+  z-index: 1;
+  /* make the "more" popover one higher than this */ }
+
+.fc-more-popover {
+  z-index: 2;
+  width: 220px; }
+
+.fc-more-popover .fc-event-container {
+  padding: 10px; }
+
+/* Now Indicator
+--------------------------------------------------------------------------------------------------*/
+.fc-now-indicator {
+  position: absolute;
+  border: 0 solid red; }
+
+/* Utilities
+--------------------------------------------------------------------------------------------------*/
+.fc-unselectable {
+  -webkit-user-select: none;
+  -khtml-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  -webkit-touch-callout: none;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0); }
+
+/*
+TODO: more distinction between this file and common.css
+*/
+/* Colors
+--------------------------------------------------------------------------------------------------*/
+.fc-unthemed th,
+.fc-unthemed td,
+.fc-unthemed thead,
+.fc-unthemed tbody,
+.fc-unthemed .fc-divider,
+.fc-unthemed .fc-row,
+.fc-unthemed .fc-content,
+.fc-unthemed .fc-popover,
+.fc-unthemed .fc-list-view,
+.fc-unthemed .fc-list-heading td {
+  border-color: #ddd; }
+
+.fc-unthemed .fc-popover {
+  background-color: #fff; }
+
+.fc-unthemed .fc-divider,
+.fc-unthemed .fc-popover .fc-header,
+.fc-unthemed .fc-list-heading td {
+  background: #eee; }
+
+.fc-unthemed td.fc-today {
+  background: #fcf8e3; }
+
+.fc-unthemed .fc-disabled-day {
+  background: #d7d7d7;
+  opacity: .3; }
+
+/* Icons
+--------------------------------------------------------------------------------------------------
+from https://feathericons.com/ and built with IcoMoon
+*/
+@font-face {
+  font-family: 'fcicons';
+  src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");
+  font-weight: normal;
+  font-style: normal; }
+.fc-icon {
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'fcicons' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale; }
+
+.fc-icon-chevron-left:before {
+  content: "\e900"; }
+
+.fc-icon-chevron-right:before {
+  content: "\e901"; }
+
+.fc-icon-chevrons-left:before {
+  content: "\e902"; }
+
+.fc-icon-chevrons-right:before {
+  content: "\e903"; }
+
+.fc-icon-minus-square:before {
+  content: "\e904"; }
+
+.fc-icon-plus-square:before {
+  content: "\e905"; }
+
+.fc-icon-x:before {
+  content: "\e906"; }
+
+.fc-icon {
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  text-align: center; }
+
+/* Buttons
+--------------------------------------------------------------------------------------------------
+Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
+*/
+/* reset */
+.fc-button {
+  border-radius: 0;
+  overflow: visible;
+  text-transform: none;
+  margin: 0;
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit; }
+
+.fc-button:focus {
+  outline: 1px dotted;
+  outline: 5px auto -webkit-focus-ring-color; }
+
+.fc-button {
+  -webkit-appearance: button; }
+
+.fc-button:not(:disabled) {
+  cursor: pointer; }
+
+.fc-button::-moz-focus-inner {
+  padding: 0;
+  border-style: none; }
+
+/* theme */
+.fc-button {
+  display: inline-block;
+  font-weight: 400;
+  color: #212529;
+  text-align: center;
+  vertical-align: middle;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+  background-color: transparent;
+  border: 1px solid transparent;
+  padding: 0.4em 0.65em;
+  font-size: 1em;
+  line-height: 1.5;
+  border-radius: 0.25em; }
+
+.fc-button:hover {
+  color: #212529;
+  text-decoration: none; }
+
+.fc-button:focus {
+  outline: 0;
+  -webkit-box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
+  box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25); }
+
+.fc-button:disabled {
+  opacity: 0.65; }
+
+/* "primary" coloring */
+.fc-button-primary {
+  color: #fff;
+  background-color: #2C3E50;
+  border-color: #2C3E50; }
+
+.fc-button-primary:hover {
+  color: #fff;
+  background-color: #1e2b37;
+  border-color: #1a252f; }
+
+.fc-button-primary:focus {
+  -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
+  box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); }
+
+.fc-button-primary:disabled {
+  color: #fff;
+  background-color: #2C3E50;
+  border-color: #2C3E50; }
+
+.fc-button-primary:not(:disabled):active,
+.fc-button-primary:not(:disabled).fc-button-active {
+  color: #fff;
+  background-color: #1a252f;
+  border-color: #151e27; }
+
+.fc-button-primary:not(:disabled):active:focus,
+.fc-button-primary:not(:disabled).fc-button-active:focus {
+  -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
+  box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); }
+
+/* icons within buttons */
+.fc-button .fc-icon {
+  vertical-align: middle;
+  font-size: 1.5em; }
+
+/* Buttons Groups
+--------------------------------------------------------------------------------------------------*/
+.fc-button-group {
+  position: relative;
+  display: -webkit-inline-box;
+  display: -ms-inline-flexbox;
+  display: inline-flex;
+  vertical-align: middle; }
+
+.fc-button-group > .fc-button {
+  position: relative;
+  -webkit-box-flex: 1;
+  -ms-flex: 1 1 auto;
+  flex: 1 1 auto; }
+
+.fc-button-group > .fc-button:hover {
+  z-index: 1; }
+
+.fc-button-group > .fc-button:focus,
+.fc-button-group > .fc-button:active,
+.fc-button-group > .fc-button.fc-button-active {
+  z-index: 1; }
+
+.fc-button-group > .fc-button:not(:first-child) {
+  margin-left: -1px; }
+
+.fc-button-group > .fc-button:not(:last-child) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.fc-button-group > .fc-button:not(:first-child) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0; }
+
+/* Popover
+--------------------------------------------------------------------------------------------------*/
+.fc-unthemed .fc-popover {
+  border-width: 1px;
+  border-style: solid; }
+
+/* List View
+--------------------------------------------------------------------------------------------------*/
+.fc-unthemed .fc-list-item:hover td {
+  background-color: #f5f5f5; }
+
+/* Toolbar
+--------------------------------------------------------------------------------------------------*/
+.fc-toolbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center; }
+
+.fc-toolbar.fc-header-toolbar {
+  margin-bottom: 1.5em; }
+
+.fc-toolbar.fc-footer-toolbar {
+  margin-top: 1.5em; }
+
+/* inner content */
+.fc-toolbar > * > :not(:first-child) {
+  margin-left: .75em; }
+
+.fc-toolbar h2 {
+  font-size: 1.75em;
+  margin: 0; }
+
+/* View Structure
+--------------------------------------------------------------------------------------------------*/
+.fc-view-container {
+  position: relative; }
+
+/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
+/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
+.fc-view-container *,
+.fc-view-container *:before,
+.fc-view-container *:after {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box; }
+
+.fc-view,
+.fc-view > table {
+  /* so dragged elements can be above the view's main element */
+  position: relative;
+  z-index: 1; }
+
+@media print {
+  .fc {
+    max-width: 100% !important; }
+
+  /* Global Event Restyling
+  --------------------------------------------------------------------------------------------------*/
+  .fc-event {
+    background: #fff !important;
+    color: #000 !important;
+    page-break-inside: avoid; }
+
+  .fc-event .fc-resizer {
+    display: none; }
+
+  /* Table & Day-Row Restyling
+  --------------------------------------------------------------------------------------------------*/
+  .fc th,
+  .fc td,
+  .fc hr,
+  .fc thead,
+  .fc tbody,
+  .fc-row {
+    border-color: #ccc !important;
+    background: #fff !important; }
+
+  /* kill the overlaid, absolutely-positioned components */
+  /* common... */
+  .fc-bg,
+  .fc-bgevent-skeleton,
+  .fc-highlight-skeleton,
+  .fc-mirror-skeleton,
+  .fc-bgevent-container,
+  .fc-business-container,
+  .fc-highlight-container,
+  .fc-mirror-container {
+    display: none; }
+
+  /* don't force a min-height on rows (for DayGrid) */
+  .fc tbody .fc-row {
+    height: auto !important;
+    /* undo height that JS set in distributeHeight */
+    min-height: 0 !important;
+    /* undo the min-height from each view's specific stylesheet */ }
+
+  .fc tbody .fc-row .fc-content-skeleton {
+    position: static;
+    /* undo .fc-rigid */
+    padding-bottom: 0 !important;
+    /* use a more border-friendly method for this... */ }
+
+  .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td {
+    /* only works in newer browsers */
+    padding-bottom: 1em;
+    /* ...gives space within the skeleton. also ensures min height in a way */ }
+
+  .fc tbody .fc-row .fc-content-skeleton table {
+    /* provides a min-height for the row, but only effective for IE, which exaggerates this value,
+       making it look more like 3em. for other browers, it will already be this tall */
+    height: 1em; }
+
+  /* Undo month-view event limiting. Display all events and hide the "more" links
+  --------------------------------------------------------------------------------------------------*/
+  .fc-more-cell,
+  .fc-more {
+    display: none !important; }
+
+  .fc tr.fc-limited {
+    display: table-row !important; }
+
+  .fc td.fc-limited {
+    display: table-cell !important; }
+
+  .fc-popover {
+    display: none;
+    /* never display the "more.." popover in print mode */ }
+
+  /* TimeGrid Restyling
+  --------------------------------------------------------------------------------------------------*/
+  /* undo the min-height 100% trick used to fill the container's height */
+  .fc-time-grid {
+    min-height: 0 !important; }
+
+  /* don't display the side axis at all ("all-day" and time cells) */
+  .fc-timeGrid-view .fc-axis {
+    display: none; }
+
+  /* don't display the horizontal lines */
+  .fc-slats,
+  .fc-time-grid hr {
+    /* this hr is used when height is underused and needs to be filled */
+    display: none !important;
+    /* important overrides inline declaration */ }
+
+  /* let the container that holds the events be naturally positioned and create real height */
+  .fc-time-grid .fc-content-skeleton {
+    position: static; }
+
+  /* in case there are no events, we still want some height */
+  .fc-time-grid .fc-content-skeleton table {
+    height: 4em; }
+
+  /* kill the horizontal spacing made by the event container. event margins will be done below */
+  .fc-time-grid .fc-event-container {
+    margin: 0 !important; }
+
+  /* TimeGrid *Event* Restyling
+  --------------------------------------------------------------------------------------------------*/
+  /* naturally position events, vertically stacking them */
+  .fc-time-grid .fc-event {
+    position: static !important;
+    margin: 3px 2px !important; }
+
+  /* for events that continue to a future day, give the bottom border back */
+  .fc-time-grid .fc-event.fc-not-end {
+    border-bottom-width: 1px !important; }
+
+  /* indicate the event continues via "..." text */
+  .fc-time-grid .fc-event.fc-not-end:after {
+    content: "..."; }
+
+  /* for events that are continuations from previous days, give the top border back */
+  .fc-time-grid .fc-event.fc-not-start {
+    border-top-width: 1px !important; }
+
+  /* indicate the event is a continuation via "..." text */
+  .fc-time-grid .fc-event.fc-not-start:before {
+    content: "..."; }
+
+  /* time */
+  /* undo a previous declaration and let the time text span to a second line */
+  .fc-time-grid .fc-event .fc-time {
+    white-space: normal !important; }
+
+  /* hide the the time that is normally displayed... */
+  .fc-time-grid .fc-event .fc-time span {
+    display: none; }
+
+  /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
+  .fc-time-grid .fc-event .fc-time:after {
+    content: attr(data-full); }
+
+  /* Vertical Scroller & Containers
+  --------------------------------------------------------------------------------------------------*/
+  /* kill the scrollbars and allow natural height */
+  .fc-scroller,
+  .fc-day-grid-container,
+  .fc-time-grid-container {
+    /* */
+    overflow: visible !important;
+    height: auto !important; }
+
+  /* kill the horizontal border/padding used to compensate for scrollbars */
+  .fc-row {
+    border: 0 !important;
+    margin: 0 !important; }
+
+  /* Button Controls
+  --------------------------------------------------------------------------------------------------*/
+  .fc-button-group,
+  .fc button {
+    display: none;
+    /* don't display any button-related controls */ } }
diff --git a/backoffice/vendors/fullcalendar/core/main.d.ts b/backoffice/vendors/fullcalendar/core/main.d.ts
new file mode 100644 (file)
index 0000000..226b4f4
--- /dev/null
@@ -0,0 +1,2835 @@
+declare module "@fullcalendar/core/util/dom-manip" {
+    export function createElement(tagName: string, attrs: object | null, content?: ElementContent): HTMLElement;
+    export function htmlToElement(html: string): HTMLElement;
+    export function htmlToElements(html: string): HTMLElement[];
+    export type ElementContent = string | Node | Node[] | NodeList;
+    export function appendToElement(el: HTMLElement, content: ElementContent): void;
+    export function prependToElement(parent: HTMLElement, content: ElementContent): void;
+    export function insertAfterElement(refEl: HTMLElement, content: ElementContent): void;
+    export function removeElement(el: HTMLElement): void;
+    export function elementClosest(el: HTMLElement, selector: string): HTMLElement;
+    export function elementMatches(el: HTMLElement, selector: string): HTMLElement;
+    export function findElements(container: HTMLElement[] | HTMLElement | NodeListOf<HTMLElement>, selector: string): HTMLElement[];
+    export function findChildren(parent: HTMLElement[] | HTMLElement, selector?: string): HTMLElement[];
+    export function forceClassName(el: HTMLElement, className: string, bool: any): void;
+    export function applyStyle(el: HTMLElement, props: object): void;
+    export function applyStyleProp(el: HTMLElement, name: string, val: any): void;
+}
+
+declare module "@fullcalendar/core/util/geom" {
+    export interface Point {
+        left: number;
+        top: number;
+    }
+    export interface Rect {
+        left: number;
+        right: number;
+        top: number;
+        bottom: number;
+    }
+    export function pointInsideRect(point: Point, rect: Rect): boolean;
+    export function intersectRects(rect1: Rect, rect2: Rect): Rect | false;
+    export function translateRect(rect: Rect, deltaX: number, deltaY: number): Rect;
+    export function constrainPoint(point: Point, rect: Rect): Point;
+    export function getRectCenter(rect: Rect): Point;
+    export function diffPoints(point1: Point, point2: Point): Point;
+}
+
+declare module "@fullcalendar/core/util/scrollbars" {
+    export function getIsRtlScrollbarOnLeft(): boolean;
+    export function sanitizeScrollbarWidth(width: number): number;
+}
+
+declare module "@fullcalendar/core/util/dom-geom" {
+    import { Rect } from "@fullcalendar/core/util/geom";
+    export interface EdgeInfo {
+        borderLeft: number;
+        borderRight: number;
+        borderTop: number;
+        borderBottom: number;
+        scrollbarLeft: number;
+        scrollbarRight: number;
+        scrollbarBottom: number;
+        paddingLeft?: number;
+        paddingRight?: number;
+        paddingTop?: number;
+        paddingBottom?: number;
+    }
+    export function computeEdges(el: any, getPadding?: boolean): EdgeInfo;
+    export function computeInnerRect(el: any, goWithinPadding?: boolean): {
+        left: number;
+        right: number;
+        top: number;
+        bottom: number;
+    };
+    export function computeRect(el: any): Rect;
+    export function computeHeightAndMargins(el: HTMLElement): number;
+    export function getClippingParents(el: HTMLElement): HTMLElement[];
+    export function computeClippingRect(el: HTMLElement): Rect;
+}
+
+declare module "@fullcalendar/core/util/dom-event" {
+    export function preventDefault(ev: any): void;
+    export function listenBySelector(container: HTMLElement, eventType: string, selector: string, handler: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
+    export function listenToHoverBySelector(container: HTMLElement, selector: string, onMouseEnter: (ev: Event, matchedTarget: HTMLElement) => void, onMouseLeave: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
+    export function whenTransitionDone(el: HTMLElement, callback: (ev: Event) => void): void;
+}
+
+declare module "@fullcalendar/core/datelib/duration" {
+    export type DurationInput = DurationObjectInput | string | number;
+    export interface DurationObjectInput {
+        years?: number;
+        year?: number;
+        months?: number;
+        month?: number;
+        weeks?: number;
+        week?: number;
+        days?: number;
+        day?: number;
+        hours?: number;
+        hour?: number;
+        minutes?: number;
+        minute?: number;
+        seconds?: number;
+        second?: number;
+        milliseconds?: number;
+        millisecond?: number;
+        ms?: number;
+    }
+    export interface Duration {
+        years: number;
+        months: number;
+        days: number;
+        milliseconds: number;
+    }
+    export function createDuration(input: DurationInput, unit?: string): Duration | null;
+    export function getWeeksFromInput(obj: DurationObjectInput): number;
+    export function durationsEqual(d0: Duration, d1: Duration): boolean;
+    export function isSingleDay(dur: Duration): boolean;
+    export function addDurations(d0: Duration, d1: Duration): {
+        years: number;
+        months: number;
+        days: number;
+        milliseconds: number;
+    };
+    export function subtractDurations(d1: Duration, d0: Duration): Duration;
+    export function multiplyDuration(d: Duration, n: number): {
+        years: number;
+        months: number;
+        days: number;
+        milliseconds: number;
+    };
+    export function asRoughYears(dur: Duration): number;
+    export function asRoughMonths(dur: Duration): number;
+    export function asRoughDays(dur: Duration): number;
+    export function asRoughHours(dur: Duration): number;
+    export function asRoughMinutes(dur: Duration): number;
+    export function asRoughSeconds(dur: Duration): number;
+    export function asRoughMs(dur: Duration): number;
+    export function wholeDivideDurations(numerator: Duration, denominator: Duration): number;
+    export function greatestDurationDenominator(dur: Duration, dontReturnWeeks?: boolean): {
+        unit: string;
+        value: number;
+    };
+}
+
+declare module "@fullcalendar/core/datelib/marker" {
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    export type DateMarker = Date;
+    export const DAY_IDS: string[];
+    export function addWeeks(m: DateMarker, n: number): Date;
+    export function addDays(m: DateMarker, n: number): Date;
+    export function addMs(m: DateMarker, n: number): Date;
+    export function diffWeeks(m0: any, m1: any): number;
+    export function diffDays(m0: any, m1: any): number;
+    export function diffHours(m0: any, m1: any): number;
+    export function diffMinutes(m0: any, m1: any): number;
+    export function diffSeconds(m0: any, m1: any): number;
+    export function diffDayAndTime(m0: DateMarker, m1: DateMarker): Duration;
+    export function diffWholeWeeks(m0: DateMarker, m1: DateMarker): number;
+    export function diffWholeDays(m0: DateMarker, m1: DateMarker): number;
+    export function startOfDay(m: DateMarker): DateMarker;
+    export function startOfHour(m: DateMarker): Date;
+    export function startOfMinute(m: DateMarker): Date;
+    export function startOfSecond(m: DateMarker): Date;
+    export function weekOfYear(marker: any, dow: any, doy: any): number;
+    export function dateToLocalArray(date: any): any[];
+    export function arrayToLocalDate(a: any): Date;
+    export function dateToUtcArray(date: any): any[];
+    export function arrayToUtcDate(a: any): Date;
+    export function isValidDate(m: DateMarker): boolean;
+    export function timeAsMs(m: DateMarker): number;
+}
+
+declare module "@fullcalendar/core/datelib/calendar-system" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    export interface CalendarSystem {
+        getMarkerYear(d: DateMarker): number;
+        getMarkerMonth(d: DateMarker): number;
+        getMarkerDay(d: DateMarker): number;
+        arrayToMarker(arr: number[]): DateMarker;
+        markerToArray(d: DateMarker): number[];
+    }
+    export function registerCalendarSystem(name: any, theClass: any): void;
+    export function createCalendarSystem(name: any): any;
+}
+
+declare module "@fullcalendar/core/util/object" {
+    export function mergeProps(propObjs: any, complexProps?: any): any;
+    export function filterHash(hash: any, func: any): {};
+    export function mapHash<InputItem, OutputItem>(hash: {
+        [key: string]: InputItem;
+    }, func: (input: InputItem, key: string) => OutputItem): {
+        [key: string]: OutputItem;
+    };
+    export function arrayToHash(a: any): {
+        [key: string]: true;
+    };
+    export function hashValuesToArray(obj: any): any[];
+}
+
+declare module "@fullcalendar/core/datelib/locale" {
+    export type LocaleCodeArg = string | string[];
+    export type LocaleSingularArg = LocaleCodeArg | RawLocale;
+    export interface Locale {
+        codeArg: LocaleCodeArg;
+        codes: string[];
+        week: {
+            dow: number;
+            doy: number;
+        };
+        simpleNumberFormat: Intl.NumberFormat;
+        options: any;
+    }
+    export interface RawLocale {
+        code: string;
+        [otherProp: string]: any;
+    }
+    export type RawLocaleMap = {
+        [code: string]: RawLocale;
+    };
+    export interface RawLocaleInfo {
+        map: RawLocaleMap;
+        defaultCode: string;
+    }
+    export function parseRawLocales(explicitRawLocales: RawLocale[]): RawLocaleInfo;
+    export function buildLocale(inputSingular: LocaleSingularArg, available: RawLocaleMap): Locale;
+}
+
+declare module "@fullcalendar/core/datelib/timezone" {
+    export abstract class NamedTimeZoneImpl {
+        timeZoneName: string;
+        constructor(timeZoneName: string);
+        abstract offsetForArray(a: number[]): number;
+        abstract timestampToArray(ms: number): number[];
+    }
+    export type NamedTimeZoneImplClass = {
+        new (timeZoneName: string): NamedTimeZoneImpl;
+    };
+}
+
+declare module "@fullcalendar/core/util/array" {
+    export function removeMatching(array: any, testFunc: any): number;
+    export function removeExact(array: any, exactVal: any): number;
+    export function isArraysEqual(a0: any, a1: any): boolean;
+}
+
+declare module "@fullcalendar/core/util/memoize" {
+    export function memoize<T>(workerFunc: T): T;
+    export function memoizeOutput<T>(workerFunc: T, equalityFunc: (output0: any, output1: any) => boolean): T;
+}
+
+declare module "@fullcalendar/core/datelib/formatting-native" {
+    import { DateFormatter, DateFormattingContext, ZonedMarker } from "@fullcalendar/core/datelib/formatting";
+    export class NativeFormatter implements DateFormatter {
+        standardDateProps: any;
+        extendedSettings: any;
+        severity: number;
+        private buildFormattingFunc;
+        constructor(formatSettings: any);
+        format(date: ZonedMarker, context: DateFormattingContext): string;
+        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
+        getLargestUnit(): "week" | "day" | "month" | "year";
+    }
+}
+
+declare module "@fullcalendar/core/datelib/formatting-cmd" {
+    import { DateFormatter, DateFormattingContext, ZonedMarker, VerboseFormattingArg } from "@fullcalendar/core/datelib/formatting";
+    export type CmdFormatterFunc = (cmd: string, arg: VerboseFormattingArg) => string;
+    export class CmdFormatter implements DateFormatter {
+        cmdStr: string;
+        separator: string;
+        constructor(cmdStr: string, separator?: string);
+        format(date: ZonedMarker, context: DateFormattingContext): string;
+        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
+    }
+}
+
+declare module "@fullcalendar/core/datelib/formatting-func" {
+    import { DateFormatter, DateFormattingContext, ZonedMarker, VerboseFormattingArg } from "@fullcalendar/core/datelib/formatting";
+    export type FuncFormatterFunc = (arg: VerboseFormattingArg) => string;
+    export class FuncFormatter implements DateFormatter {
+        func: FuncFormatterFunc;
+        constructor(func: FuncFormatterFunc);
+        format(date: ZonedMarker, context: DateFormattingContext): string;
+        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
+    }
+}
+
+declare module "@fullcalendar/core/datelib/formatting" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { CalendarSystem } from "@fullcalendar/core/datelib/calendar-system";
+    import { Locale } from "@fullcalendar/core/datelib/locale";
+    import { CmdFormatterFunc } from "@fullcalendar/core/datelib/formatting-cmd";
+    import { FuncFormatterFunc } from "@fullcalendar/core/datelib/formatting-func";
+    export interface ZonedMarker {
+        marker: DateMarker;
+        timeZoneOffset: number;
+    }
+    export interface ExpandedZonedMarker extends ZonedMarker {
+        array: number[];
+        year: number;
+        month: number;
+        day: number;
+        hour: number;
+        minute: number;
+        second: number;
+        millisecond: number;
+    }
+    export interface VerboseFormattingArg {
+        date: ExpandedZonedMarker;
+        start: ExpandedZonedMarker;
+        end?: ExpandedZonedMarker;
+        timeZone: string;
+        localeCodes: string[];
+        separator: string;
+    }
+    export interface DateFormattingContext {
+        timeZone: string;
+        locale: Locale;
+        calendarSystem: CalendarSystem;
+        computeWeekNumber: (d: DateMarker) => number;
+        weekLabel: string;
+        cmdFormatter?: CmdFormatterFunc;
+    }
+    export interface DateFormatter {
+        format(date: ZonedMarker, context: DateFormattingContext): any;
+        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): any;
+    }
+    export type FormatterInput = object | string | FuncFormatterFunc;
+    export function createFormatter(input: FormatterInput, defaultSeparator?: string): DateFormatter;
+    export function buildIsoString(marker: DateMarker, timeZoneOffset?: number, stripZeroTime?: boolean): string;
+    export function formatIsoTimeString(marker: DateMarker): string;
+    export function formatTimeZoneOffset(minutes: number, doIso?: boolean): string;
+    export function createVerboseFormattingArg(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext, separator?: string): VerboseFormattingArg;
+}
+
+declare module "@fullcalendar/core/datelib/parsing" {
+    export function parse(str: any): {
+        marker: Date;
+        isTimeUnspecified: boolean;
+        timeZoneOffset: any;
+    };
+}
+
+declare module "@fullcalendar/core/datelib/env" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { CalendarSystem } from "@fullcalendar/core/datelib/calendar-system";
+    import { Locale } from "@fullcalendar/core/datelib/locale";
+    import { NamedTimeZoneImpl, NamedTimeZoneImplClass } from "@fullcalendar/core/datelib/timezone";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { DateFormatter } from "@fullcalendar/core/datelib/formatting";
+    import { CmdFormatterFunc } from "@fullcalendar/core/datelib/formatting-cmd";
+    export interface DateEnvSettings {
+        timeZone: string;
+        namedTimeZoneImpl?: NamedTimeZoneImplClass;
+        calendarSystem: string;
+        locale: Locale;
+        weekNumberCalculation?: any;
+        firstDay?: any;
+        weekLabel?: string;
+        cmdFormatter?: CmdFormatterFunc;
+    }
+    export type DateInput = Date | string | number | number[];
+    export interface DateMarkerMeta {
+        marker: DateMarker;
+        isTimeUnspecified: boolean;
+        forcedTzo: number | null;
+    }
+    export class DateEnv {
+        timeZone: string;
+        namedTimeZoneImpl: NamedTimeZoneImpl;
+        canComputeOffset: boolean;
+        calendarSystem: CalendarSystem;
+        locale: Locale;
+        weekDow: number;
+        weekDoy: number;
+        weekNumberFunc: any;
+        weekLabel: string;
+        cmdFormatter?: CmdFormatterFunc;
+        constructor(settings: DateEnvSettings);
+        createMarker(input: DateInput): DateMarker;
+        createNowMarker(): DateMarker;
+        createMarkerMeta(input: DateInput): DateMarkerMeta;
+        parse(s: string): {
+            marker: Date;
+            isTimeUnspecified: boolean;
+            forcedTzo: any;
+        };
+        getYear(marker: DateMarker): number;
+        getMonth(marker: DateMarker): number;
+        add(marker: DateMarker, dur: Duration): DateMarker;
+        subtract(marker: DateMarker, dur: Duration): DateMarker;
+        addYears(marker: DateMarker, n: number): Date;
+        addMonths(marker: DateMarker, n: number): Date;
+        diffWholeYears(m0: DateMarker, m1: DateMarker): number;
+        diffWholeMonths(m0: DateMarker, m1: DateMarker): number;
+        greatestWholeUnit(m0: DateMarker, m1: DateMarker): {
+            unit: string;
+            value: number;
+        };
+        countDurationsBetween(m0: DateMarker, m1: DateMarker, d: Duration): number;
+        startOf(m: DateMarker, unit: string): Date;
+        startOfYear(m: DateMarker): DateMarker;
+        startOfMonth(m: DateMarker): DateMarker;
+        startOfWeek(m: DateMarker): DateMarker;
+        computeWeekNumber(marker: DateMarker): number;
+        format(marker: DateMarker, formatter: DateFormatter, dateOptions?: {
+            forcedTzo?: number;
+        }): any;
+        formatRange(start: DateMarker, end: DateMarker, formatter: DateFormatter, dateOptions?: {
+            forcedStartTzo?: number;
+            forcedEndTzo?: number;
+            isEndExclusive?: boolean;
+        }): any;
+        formatIso(marker: DateMarker, extraOptions?: any): string;
+        timestampToMarker(ms: number): Date;
+        offsetForMarker(m: DateMarker): number;
+        toDate(m: DateMarker, forcedTzo?: number): Date;
+    }
+}
+
+declare module "@fullcalendar/core/datelib/date-range" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { DateEnv, DateInput } from "@fullcalendar/core/datelib/env";
+    export interface DateRangeInput {
+        start?: DateInput;
+        end?: DateInput;
+    }
+    export interface OpenDateRange {
+        start: DateMarker | null;
+        end: DateMarker | null;
+    }
+    export interface DateRange {
+        start: DateMarker;
+        end: DateMarker;
+    }
+    export function parseRange(input: DateRangeInput, dateEnv: DateEnv): OpenDateRange;
+    export function invertRanges(ranges: DateRange[], constraintRange: DateRange): DateRange[];
+    export function intersectRanges(range0: OpenDateRange, range1: OpenDateRange): OpenDateRange;
+    export function rangesEqual(range0: OpenDateRange, range1: OpenDateRange): boolean;
+    export function rangesIntersect(range0: OpenDateRange, range1: OpenDateRange): boolean;
+    export function rangeContainsRange(outerRange: OpenDateRange, innerRange: OpenDateRange): boolean;
+    export function rangeContainsMarker(range: OpenDateRange, date: DateMarker | number): boolean;
+    export function constrainMarkerToRange(date: DateMarker, range: DateRange): DateMarker;
+}
+
+declare module "@fullcalendar/core/util/misc" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { DateEnv } from "@fullcalendar/core/datelib/env";
+    import { DateRange, OpenDateRange } from "@fullcalendar/core/datelib/date-range";
+    export function compensateScroll(rowEl: HTMLElement, scrollbarWidths: any): void;
+    export function uncompensateScroll(rowEl: HTMLElement): void;
+    export function disableCursor(): void;
+    export function enableCursor(): void;
+    export function distributeHeight(els: HTMLElement[], availableHeight: any, shouldRedistribute: any): void;
+    export function undistributeHeight(els: HTMLElement[]): void;
+    export function matchCellWidths(els: HTMLElement[]): number;
+    export function subtractInnerElHeight(outerEl: HTMLElement, innerEl: HTMLElement): number;
+    export function preventSelection(el: HTMLElement): void;
+    export function allowSelection(el: HTMLElement): void;
+    export function preventContextMenu(el: HTMLElement): void;
+    export function allowContextMenu(el: HTMLElement): void;
+    export function parseFieldSpecs(input: any): any[];
+    export function compareByFieldSpecs(obj0: any, obj1: any, fieldSpecs: any): any;
+    export function compareByFieldSpec(obj0: any, obj1: any, fieldSpec: any): any;
+    export function flexibleCompare(a: any, b: any): number;
+    export function capitaliseFirstLetter(str: any): any;
+    export function padStart(val: any, len: any): string;
+    export function compareNumbers(a: any, b: any): number;
+    export function isInt(n: any): boolean;
+    export function applyAll(functions: any, thisObj: any, args: any): any;
+    export function firstDefined(...args: any[]): any;
+    export function debounce(func: any, wait: any): () => any;
+    export type GenericHash = {
+        [key: string]: any;
+    };
+    export function refineProps(rawProps: GenericHash, processors: GenericHash, defaults?: GenericHash, leftoverProps?: GenericHash): GenericHash;
+    export function freezeRaw(raw: any): any;
+    export function computeAlignedDayRange(timedRange: DateRange): DateRange;
+    export function computeVisibleDayRange(timedRange: OpenDateRange, nextDayThreshold?: Duration): OpenDateRange;
+    export function isMultiDayRange(range: DateRange): boolean;
+    export function diffDates(date0: DateMarker, date1: DateMarker, dateEnv: DateEnv, largeUnit?: string): Duration;
+}
+
+declare module "@fullcalendar/core/common/Mixin" {
+    export { Mixin as default, Mixin };
+
+    class Mixin {
+        static mixInto(destClass: any): void;
+        static mixIntoObj(destObj: any): void;
+        static mixOver(destClass: any): void;
+    }
+}
+
+declare module "@fullcalendar/core/common/EmitterMixin" {
+    import Mixin from "@fullcalendar/core/common/Mixin";
+    export interface EmitterInterface {
+        on(types: any, handler: any): any;
+        one(types: any, handler: any): any;
+        off(types: any, handler: any): any;
+        trigger(type: any, ...args: any[]): any;
+        triggerWith(type: any, context: any, args: any): any;
+        hasHandlers(type: any): any;
+    }
+    export { EmitterMixin as default, EmitterMixin };
+    class EmitterMixin extends Mixin implements EmitterInterface {
+        _handlers: any;
+        _oneHandlers: any;
+        on(type: any, handler: any): this;
+        one(type: any, handler: any): this;
+        off(type: any, handler?: any): this;
+        trigger(type: any, ...args: any[]): this;
+        triggerWith(type: any, context: any, args: any): this;
+        hasHandlers(type: any): any;
+    }
+}
+
+declare module "@fullcalendar/core/structs/recurring-event" {
+    import { EventInput, EventDef } from "@fullcalendar/core/structs/event";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { DateEnv } from "@fullcalendar/core/datelib/env";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    export interface ParsedRecurring {
+        typeData: any;
+        allDayGuess: boolean | null;
+        duration: Duration | null;
+    }
+    export interface RecurringType {
+        parse: (rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv) => ParsedRecurring | null;
+        expand: (typeData: any, framingRange: DateRange, dateEnv: DateEnv) => DateMarker[];
+    }
+    export function parseRecurring(eventInput: EventInput, allDayDefault: boolean | null, dateEnv: DateEnv, recurringTypes: RecurringType[], leftovers: any): {
+        allDay: any;
+        duration: Duration;
+        typeData: any;
+        typeId: number;
+    };
+    export function expandRecurringRanges(eventDef: EventDef, framingRange: DateRange, dateEnv: DateEnv, recurringTypes: RecurringType[]): DateMarker[];
+}
+
+declare module "@fullcalendar/core/util/promise" {
+    export function unpromisify(func: any, success: any, failure?: any): void;
+}
+
+declare module "@fullcalendar/core/event-sources/func-event-source" {
+    import { EventSourceError } from "@fullcalendar/core/structs/event-source";
+    import { EventInput } from "@fullcalendar/core/structs/event";
+    export type EventSourceFunc = (arg: {
+        start: Date;
+        end: Date;
+        timeZone: string;
+    }, successCallback: (events: EventInput[]) => void, failureCallback: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
+    const _default: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default;
+}
+
+declare module "@fullcalendar/core/structs/event-source" {
+    import { EventInput } from "@fullcalendar/core/structs/event";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { EventSourceFunc } from "@fullcalendar/core/event-sources/func-event-source";
+    import { EventUi } from "@fullcalendar/core/component/event-ui";
+    import { ConstraintInput, AllowFunc } from "@fullcalendar/core/validation";
+    export type EventSourceError = {
+        message: string;
+        response?: any;
+        [otherProp: string]: any;
+    };
+    export type EventInputTransformer = (eventInput: EventInput) => EventInput | null;
+    export type EventSourceSuccessResponseHandler = (rawData: any, response: any) => EventInput[] | void;
+    export type EventSourceErrorResponseHandler = (error: EventSourceError) => void;
+    export interface ExtendedEventSourceInput {
+        id?: string | number;
+        allDayDefault?: boolean;
+        eventDataTransform?: EventInputTransformer;
+        events?: EventInput[] | EventSourceFunc;
+        url?: string;
+        method?: string;
+        extraParams?: object | (() => object);
+        startParam?: string;
+        endParam?: string;
+        timeZoneParam?: string;
+        success?: EventSourceSuccessResponseHandler;
+        failure?: EventSourceErrorResponseHandler;
+        editable?: boolean;
+        startEditable?: boolean;
+        durationEditable?: boolean;
+        constraint?: ConstraintInput;
+        overlap?: boolean;
+        allow?: AllowFunc;
+        className?: string[] | string;
+        classNames?: string[] | string;
+        backgroundColor?: string;
+        borderColor?: string;
+        textColor?: string;
+        color?: string;
+        [otherProp: string]: any;
+    }
+    export type EventSourceInput = ExtendedEventSourceInput | // object in extended form
+    EventSourceFunc | // just a function
+    string;
+    export interface EventSource {
+        _raw: any;
+        sourceId: string;
+        sourceDefId: number;
+        meta: any;
+        publicId: string;
+        isFetching: boolean;
+        latestFetchId: string;
+        fetchRange: DateRange | null;
+        allDayDefault: boolean | null;
+        eventDataTransform: EventInputTransformer;
+        ui: EventUi;
+        success: EventSourceSuccessResponseHandler | null;
+        failure: EventSourceErrorResponseHandler | null;
+        extendedProps: any;
+    }
+    export type EventSourceHash = {
+        [sourceId: string]: EventSource;
+    };
+    export type EventSourceFetcher = (arg: {
+        eventSource: EventSource;
+        calendar: Calendar;
+        range: DateRange;
+    }, success: (res: {
+        rawEvents: EventInput[];
+        xhr?: XMLHttpRequest;
+    }) => void, failure: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
+    export interface EventSourceDef {
+        ignoreRange?: boolean;
+        parseMeta: (raw: EventSourceInput) => object | null;
+        fetch: EventSourceFetcher;
+    }
+    export function doesSourceNeedRange(eventSource: EventSource, calendar: Calendar): boolean;
+    export function parseEventSource(raw: EventSourceInput, calendar: Calendar): EventSource | null;
+}
+
+declare module "@fullcalendar/core/structs/event-store" {
+    import { EventInput, EventDef, EventDefHash, EventInstanceHash, EventTuple } from "@fullcalendar/core/structs/event";
+    import { EventSource } from "@fullcalendar/core/structs/event-source";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    export interface EventStore {
+        defs: EventDefHash;
+        instances: EventInstanceHash;
+    }
+    export function parseEvents(rawEvents: EventInput[], sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventStore;
+    export function eventTupleToStore(tuple: EventTuple, eventStore?: EventStore): EventStore;
+    export function expandRecurring(eventStore: EventStore, framingRange: DateRange, calendar: Calendar): EventStore;
+    export function getRelevantEvents(eventStore: EventStore, instanceId: string): EventStore;
+    export function transformRawEvents(rawEvents: any, eventSource: EventSource, calendar: Calendar): any;
+    export function createEmptyEventStore(): EventStore;
+    export function mergeEventStores(store0: EventStore, store1: EventStore): EventStore;
+    export function filterEventStoreDefs(eventStore: EventStore, filterFunc: (eventDef: EventDef) => boolean): EventStore;
+}
+
+declare module "@fullcalendar/core/interactions/hit" {
+    import DateComponent from "@fullcalendar/core/component/DateComponent";
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    import { Rect } from "@fullcalendar/core/util/geom";
+    export interface Hit {
+        component: DateComponent<any>;
+        dateSpan: DateSpan;
+        dayEl: HTMLElement;
+        rect: Rect;
+        layer: number;
+    }
+}
+
+declare module "@fullcalendar/core/structs/event-mutation" {
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventDef } from "@fullcalendar/core/structs/event";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { EventUiHash } from "@fullcalendar/core/component/event-ui";
+    export interface EventMutation {
+        startDelta?: Duration;
+        endDelta?: Duration;
+        standardProps?: any;
+        extendedProps?: any;
+    }
+    export function applyMutationToEventStore(eventStore: EventStore, eventConfigBase: EventUiHash, mutation: EventMutation, calendar: Calendar): EventStore;
+    export type eventDefMutationApplier = (eventDef: EventDef, mutation: EventMutation, calendar: Calendar) => void;
+}
+
+declare module "@fullcalendar/core/api/EventSourceApi" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { EventSource } from "@fullcalendar/core/structs/event-source";
+    export { EventSourceApi as default, EventSourceApi };
+    class EventSourceApi {
+        calendar: Calendar;
+        internalEventSource: EventSource;
+        constructor(calendar: Calendar, internalEventSource: EventSource);
+        remove(): void;
+        refetch(): void;
+        readonly id: string;
+        readonly url: string;
+    }
+}
+
+declare module "@fullcalendar/core/api/EventApi" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { EventDef, EventInstance } from "@fullcalendar/core/structs/event";
+    import { EventMutation } from "@fullcalendar/core/structs/event-mutation";
+    import { DateInput } from "@fullcalendar/core/datelib/env";
+    import { DurationInput } from "@fullcalendar/core/datelib/duration";
+    import { FormatterInput } from "@fullcalendar/core/datelib/formatting";
+    import EventSourceApi from "@fullcalendar/core/api/EventSourceApi";
+    export { EventApi as default, EventApi };
+    class EventApi {
+        _calendar: Calendar;
+        _def: EventDef;
+        _instance: EventInstance | null;
+        constructor(calendar: Calendar, def: EventDef, instance?: EventInstance);
+        setProp(name: string, val: string): void;
+        setExtendedProp(name: string, val: string): void;
+        setStart(startInput: DateInput, options?: {
+            granularity?: string;
+            maintainDuration?: boolean;
+        }): void;
+        setEnd(endInput: DateInput | null, options?: {
+            granularity?: string;
+        }): void;
+        setDates(startInput: DateInput, endInput: DateInput | null, options?: {
+            allDay?: boolean;
+            granularity?: string;
+        }): void;
+        moveStart(deltaInput: DurationInput): void;
+        moveEnd(deltaInput: DurationInput): void;
+        moveDates(deltaInput: DurationInput): void;
+        setAllDay(allDay: boolean, options?: {
+            maintainDuration?: boolean;
+        }): void;
+        formatRange(formatInput: FormatterInput): any;
+        mutate(mutation: EventMutation): void;
+        remove(): void;
+        readonly source: EventSourceApi | null;
+        readonly start: Date | null;
+        readonly end: Date | null;
+        readonly id: string;
+        readonly groupId: string;
+        readonly allDay: boolean;
+        readonly title: string;
+        readonly url: string;
+        readonly rendering: string;
+        readonly startEditable: boolean;
+        readonly durationEditable: boolean;
+        readonly constraint: any;
+        readonly overlap: any;
+        readonly allow: any;
+        readonly backgroundColor: string;
+        readonly borderColor: string;
+        readonly textColor: string;
+        readonly classNames: string[];
+        readonly extendedProps: any;
+    }
+}
+
+declare module "@fullcalendar/core/component/renderers/FgEventRenderer" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { DateFormatter } from "@fullcalendar/core/datelib/formatting";
+    import { EventUi } from "@fullcalendar/core/component/event-ui";
+    import { EventRenderRange } from "@fullcalendar/core/component/event-rendering";
+    import { Seg } from "@fullcalendar/core/component/DateComponent";
+    import { ComponentContext } from "@fullcalendar/core/component/Component";
+    export { FgEventRenderer as default, FgEventRenderer };
+    abstract class FgEventRenderer {
+        context: ComponentContext;
+        eventTimeFormat: DateFormatter;
+        displayEventTime: boolean;
+        displayEventEnd: boolean;
+        segs: Seg[];
+        isSizeDirty: boolean;
+        constructor(context: ComponentContext);
+        renderSegs(segs: Seg[], mirrorInfo?: any): void;
+        unrender(_segs: Seg[], mirrorInfo?: any): void;
+        abstract renderSegHtml(seg: Seg, mirrorInfo: any): string;
+        abstract attachSegs(segs: Seg[], mirrorInfo: any): any;
+        abstract detachSegs(segs: Seg[]): any;
+        rangeUpdated(): void;
+        renderSegEls(segs: Seg[], mirrorInfo: any): Seg[];
+        getSegClasses(seg: Seg, isDraggable: any, isResizable: any, mirrorInfo: any): string[];
+        getTimeText(eventRange: EventRenderRange, formatter?: any, displayEnd?: any): any;
+        _getTimeText(start: DateMarker, end: DateMarker, allDay: any, formatter?: any, displayEnd?: any, forcedStartTzo?: number, forcedEndTzo?: number): any;
+        computeEventTimeFormat(): any;
+        computeDisplayEventTime(): boolean;
+        computeDisplayEventEnd(): boolean;
+        getSkinCss(ui: EventUi): {
+            'background-color': string;
+            'border-color': string;
+            color: string;
+        };
+        sortEventSegs(segs: any): Seg[];
+        computeSizes(force: boolean): void;
+        assignSizes(force: boolean): void;
+        computeSegSizes(segs: Seg[]): void;
+        assignSegSizes(segs: Seg[]): void;
+        hideByHash(hash: any): void;
+        showByHash(hash: any): void;
+        selectByInstanceId(instanceId: string): void;
+        unselectByInstanceId(instanceId: string): void;
+    }
+    export function buildSegCompareObj(seg: Seg): any;
+}
+
+declare module "@fullcalendar/core/util/html" {
+    export function htmlEscape(s: any): string;
+    export function cssToStr(cssProps: any): string;
+    export function attrsToStr(attrs: any): string;
+    export type ClassNameInput = string | string[];
+    export function parseClassName(raw: ClassNameInput): string[];
+}
+
+declare module "@fullcalendar/core/component/renderers/FillRenderer" {
+    import { Seg } from "@fullcalendar/core/component/DateComponent";
+    import { ComponentContext } from "@fullcalendar/core/component/Component";
+    export { FillRenderer as default, FillRenderer };
+    abstract class FillRenderer {
+        context: ComponentContext;
+        fillSegTag: string;
+        containerElsByType: any;
+        segsByType: any;
+        dirtySizeFlags: any;
+        constructor(context: ComponentContext);
+        getSegsByType(type: string): any;
+        renderSegs(type: any, segs: Seg[]): void;
+        unrender(type: any): void;
+        renderSegEls(type: any, segs: Seg[]): Seg[];
+        renderSegHtml(type: any, seg: Seg): string;
+        abstract attachSegs(type: any, segs: Seg[]): HTMLElement[] | void;
+        detachSegs(type: any, segs: Seg[]): void;
+        computeSizes(force: boolean): void;
+        assignSizes(force: boolean): void;
+        computeSegSizes(segs: Seg[]): void;
+        assignSegSizes(segs: Seg[]): void;
+    }
+}
+
+declare module "@fullcalendar/core/interactions/event-interaction-state" {
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { Seg } from "@fullcalendar/core/component/DateComponent";
+    export interface EventInteractionState {
+        affectedEvents: EventStore;
+        mutatedEvents: EventStore;
+        isEvent: boolean;
+        origSeg: Seg | null;
+    }
+}
+
+declare module "@fullcalendar/core/component/DateComponent" {
+    import Component, { ComponentContext } from "@fullcalendar/core/component/Component";
+    import { EventRenderRange } from "@fullcalendar/core/component/event-rendering";
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    import { EventInstanceHash } from "@fullcalendar/core/structs/event";
+    import { Hit } from "@fullcalendar/core/interactions/hit";
+    import FgEventRenderer from "@fullcalendar/core/component/renderers/FgEventRenderer";
+    import FillRenderer from "@fullcalendar/core/component/renderers/FillRenderer";
+    import { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    export type DateComponentHash = {
+        [uid: string]: DateComponent<any>;
+    };
+    export interface Seg {
+        component?: DateComponent<any>;
+        isStart: boolean;
+        isEnd: boolean;
+        eventRange?: EventRenderRange;
+        el?: HTMLElement;
+        [otherProp: string]: any;
+    }
+    export interface EventSegUiInteractionState {
+        affectedInstances: EventInstanceHash;
+        segs: Seg[];
+        isEvent: boolean;
+        sourceSeg: any;
+    }
+    export { DateComponent as default, DateComponent };
+    class DateComponent<PropsType> extends Component<PropsType> {
+        fgSegSelector: string;
+        bgSegSelector: string;
+        largeUnit: any;
+        eventRenderer: FgEventRenderer;
+        mirrorRenderer: FgEventRenderer;
+        fillRenderer: FillRenderer;
+        el: HTMLElement;
+        constructor(context: ComponentContext, el: HTMLElement, isView?: boolean);
+        destroy(): void;
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
+        isInteractionValid(interaction: EventInteractionState): boolean;
+        isDateSelectionValid(selection: DateSpan): boolean;
+        publiclyTrigger(name: any, args: any): any;
+        publiclyTriggerAfterSizing(name: any, args: any): void;
+        hasPublicHandlers(name: any): boolean;
+        triggerRenderedSegs(segs: Seg[], isMirrors: boolean): void;
+        triggerWillRemoveSegs(segs: Seg[], isMirrors: boolean): void;
+        isValidSegDownEl(el: HTMLElement): boolean;
+        isValidDateDownEl(el: HTMLElement): boolean;
+        isPopover(): boolean;
+        isInPopover(el: HTMLElement): boolean;
+    }
+}
+
+declare module "@fullcalendar/core/component/event-rendering" {
+    import { EventDef, EventTuple, EventDefHash } from "@fullcalendar/core/structs/event";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { Seg } from "@fullcalendar/core/component/DateComponent";
+    import View from "@fullcalendar/core/View";
+    import { EventUi, EventUiHash } from "@fullcalendar/core/component/event-ui";
+    export interface EventRenderRange extends EventTuple {
+        ui: EventUi;
+        range: DateRange;
+        isStart: boolean;
+        isEnd: boolean;
+    }
+    export function sliceEventStore(eventStore: EventStore, eventUiBases: EventUiHash, framingRange: DateRange, nextDayThreshold?: Duration): {
+        bg: EventRenderRange[];
+        fg: EventRenderRange[];
+    };
+    export function hasBgRendering(def: EventDef): boolean;
+    export function filterSegsViaEls(view: View, segs: Seg[], isMirror: any): Seg[];
+    export function getElSeg(el: HTMLElement): Seg | null;
+    export function compileEventUis(eventDefs: EventDefHash, eventUiBases: EventUiHash): {
+        [key: string]: EventUi;
+    };
+    export function compileEventUi(eventDef: EventDef, eventUiBases: EventUiHash): EventUi;
+}
+
+declare module "@fullcalendar/core/structs/date-span" {
+    import { DateRange, OpenDateRange } from "@fullcalendar/core/datelib/date-range";
+    import { DateInput, DateEnv } from "@fullcalendar/core/datelib/env";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { EventRenderRange } from "@fullcalendar/core/component/event-rendering";
+    import { EventUiHash } from "@fullcalendar/core/component/event-ui";
+    import Calendar from "@fullcalendar/core/Calendar";
+    export interface OpenDateSpanInput {
+        start?: DateInput;
+        end?: DateInput;
+        allDay?: boolean;
+        [otherProp: string]: any;
+    }
+    export interface DateSpanInput extends OpenDateSpanInput {
+        start: DateInput;
+        end: DateInput;
+    }
+    export interface OpenDateSpan {
+        range: OpenDateRange;
+        allDay: boolean;
+        [otherProp: string]: any;
+    }
+    export interface DateSpan extends OpenDateSpan {
+        range: DateRange;
+    }
+    export interface DateSpanApi {
+        start: Date;
+        end: Date;
+        startStr: string;
+        endStr: string;
+        allDay: boolean;
+    }
+    export interface DatePointApi {
+        date: Date;
+        dateStr: string;
+        allDay: boolean;
+    }
+    export function parseDateSpan(raw: DateSpanInput, dateEnv: DateEnv, defaultDuration?: Duration): DateSpan | null;
+    export function parseOpenDateSpan(raw: OpenDateSpanInput, dateEnv: DateEnv): OpenDateSpan | null;
+    export function isDateSpansEqual(span0: DateSpan, span1: DateSpan): boolean;
+    export function buildDateSpanApi(span: DateSpan, dateEnv: DateEnv): DateSpanApi;
+    export function buildDatePointApi(span: DateSpan, dateEnv: DateEnv): DatePointApi;
+    export function fabricateEventRange(dateSpan: DateSpan, eventUiBases: EventUiHash, calendar: Calendar): EventRenderRange;
+}
+
+declare module "@fullcalendar/core/reducers/eventStore" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { EventInstanceHash } from "@fullcalendar/core/structs/event";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { Action } from "@fullcalendar/core/reducers/types";
+    import { EventSourceHash } from "@fullcalendar/core/structs/event-source";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    export default function (eventStore: EventStore, action: Action, eventSources: EventSourceHash, dateProfile: DateProfile, calendar: Calendar): EventStore;
+    export function excludeInstances(eventStore: EventStore, removals: EventInstanceHash): EventStore;
+}
+
+declare module "@fullcalendar/core/component/event-splitting" {
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventDef } from "@fullcalendar/core/structs/event";
+    import { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    import { EventUiHash, EventUi } from "@fullcalendar/core/component/event-ui";
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    export interface SplittableProps {
+        businessHours: EventStore | null;
+        dateSelection: DateSpan | null;
+        eventStore: EventStore;
+        eventUiBases: EventUiHash;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+    }
+    export { Splitter as default, Splitter };
+    abstract class Splitter<PropsType extends SplittableProps = SplittableProps> {
+        private getKeysForEventDefs;
+        private splitDateSelection;
+        private splitEventStore;
+        private splitIndividualUi;
+        private splitEventDrag;
+        private splitEventResize;
+        private eventUiBuilders;
+        abstract getKeyInfo(props: PropsType): {
+            [key: string]: {
+                ui?: EventUi;
+                businessHours?: EventStore;
+            };
+        };
+        abstract getKeysForDateSpan(dateSpan: DateSpan): string[];
+        abstract getKeysForEventDef(eventDef: EventDef): string[];
+        splitProps(props: PropsType): {
+            [key: string]: SplittableProps;
+        };
+        private _splitDateSpan;
+        private _getKeysForEventDefs;
+        private _splitEventStore;
+        private _splitIndividualUi;
+        private _splitInteraction;
+    }
+}
+
+declare module "@fullcalendar/core/validation" {
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { DateSpan, DateSpanApi } from "@fullcalendar/core/structs/date-span";
+    import EventApi from "@fullcalendar/core/api/EventApi";
+    import { EventInput } from "@fullcalendar/core/structs/event";
+    import { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    import { SplittableProps } from "@fullcalendar/core/component/event-splitting";
+    export type ConstraintInput = 'businessHours' | string | EventInput | EventInput[];
+    export type Constraint = 'businessHours' | string | EventStore | false;
+    export type OverlapFunc = ((stillEvent: EventApi, movingEvent: EventApi | null) => boolean);
+    export type AllowFunc = (span: DateSpanApi, movingEvent: EventApi | null) => boolean;
+    export type isPropsValidTester = (props: SplittableProps, calendar: Calendar) => boolean;
+    export function isInteractionValid(interaction: EventInteractionState, calendar: Calendar): boolean;
+    export function isDateSelectionValid(dateSelection: DateSpan, calendar: Calendar): boolean;
+    export function isPropsValid(state: SplittableProps, calendar: Calendar, dateSpanMeta?: {}, filterConfig?: any): boolean;
+    export function normalizeConstraint(input: ConstraintInput, calendar: Calendar): Constraint | null;
+}
+
+declare module "@fullcalendar/core/component/event-ui" {
+    import { Constraint, AllowFunc, ConstraintInput } from "@fullcalendar/core/validation";
+    import { parseClassName } from "@fullcalendar/core/util/html";
+    import Calendar from "@fullcalendar/core/Calendar";
+    export interface UnscopedEventUiInput {
+        editable?: boolean;
+        startEditable?: boolean;
+        durationEditable?: boolean;
+        constraint?: ConstraintInput;
+        overlap?: boolean;
+        allow?: AllowFunc;
+        className?: string[] | string;
+        classNames?: string[] | string;
+        backgroundColor?: string;
+        borderColor?: string;
+        textColor?: string;
+        color?: string;
+    }
+    export interface EventUi {
+        startEditable: boolean | null;
+        durationEditable: boolean | null;
+        constraints: Constraint[];
+        overlap: boolean | null;
+        allows: AllowFunc[];
+        backgroundColor: string;
+        borderColor: string;
+        textColor: string;
+        classNames: string[];
+    }
+    export type EventUiHash = {
+        [defId: string]: EventUi;
+    };
+    export const UNSCOPED_EVENT_UI_PROPS: {
+        editable: BooleanConstructor;
+        startEditable: BooleanConstructor;
+        durationEditable: BooleanConstructor;
+        constraint: any;
+        overlap: any;
+        allow: any;
+        className: typeof parseClassName;
+        classNames: typeof parseClassName;
+        color: StringConstructor;
+        backgroundColor: StringConstructor;
+        borderColor: StringConstructor;
+        textColor: StringConstructor;
+    };
+    export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, calendar: Calendar, leftovers?: any): EventUi;
+    export function processScopedUiProps(prefix: string, rawScoped: any, calendar: Calendar, leftovers?: any): EventUi;
+    export function combineEventUis(uis: EventUi[]): EventUi;
+}
+
+declare module "@fullcalendar/core/structs/event" {
+    import { DateInput } from "@fullcalendar/core/datelib/env";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { UnscopedEventUiInput, EventUi } from "@fullcalendar/core/component/event-ui";
+    export type EventRenderingChoice = '' | 'background' | 'inverse-background' | 'none';
+    export interface EventNonDateInput extends UnscopedEventUiInput {
+        id?: string | number;
+        groupId?: string | number;
+        title?: string;
+        url?: string;
+        rendering?: EventRenderingChoice;
+        extendedProps?: object;
+        [extendedProp: string]: any;
+    }
+    export interface EventDateInput {
+        start?: DateInput;
+        end?: DateInput;
+        date?: DateInput;
+        allDay?: boolean;
+    }
+    export type EventInput = EventNonDateInput & EventDateInput;
+    export interface EventDef {
+        defId: string;
+        sourceId: string;
+        publicId: string;
+        groupId: string;
+        allDay: boolean;
+        hasEnd: boolean;
+        recurringDef: {
+            typeId: number;
+            typeData: any;
+            duration: Duration | null;
+        } | null;
+        title: string;
+        url: string;
+        rendering: EventRenderingChoice;
+        ui: EventUi;
+        extendedProps: any;
+    }
+    export interface EventInstance {
+        instanceId: string;
+        defId: string;
+        range: DateRange;
+        forcedStartTzo: number | null;
+        forcedEndTzo: number | null;
+    }
+    export interface EventTuple {
+        def: EventDef;
+        instance: EventInstance | null;
+    }
+    export type EventInstanceHash = {
+        [instanceId: string]: EventInstance;
+    };
+    export type EventDefHash = {
+        [defId: string]: EventDef;
+    };
+    export const NON_DATE_PROPS: {
+        id: StringConstructor;
+        groupId: StringConstructor;
+        title: StringConstructor;
+        url: StringConstructor;
+        rendering: StringConstructor;
+        extendedProps: any;
+    };
+    export const DATE_PROPS: {
+        start: any;
+        date: any;
+        end: any;
+        allDay: any;
+    };
+    export function parseEvent(raw: EventInput, sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventTuple | null;
+    export function parseEventDef(raw: EventNonDateInput, sourceId: string, allDay: boolean, hasEnd: boolean, calendar: Calendar): EventDef;
+    export type eventDefParserFunc = (def: EventDef, props: any, leftovers: any) => void;
+    export function createEventInstance(defId: string, range: DateRange, forcedStartTzo?: number, forcedEndTzo?: number): EventInstance;
+}
+
+declare module "@fullcalendar/core/reducers/types" {
+    import { EventInput, EventInstanceHash } from "@fullcalendar/core/structs/event";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventMutation } from "@fullcalendar/core/structs/event-mutation";
+    import { EventSource, EventSourceHash, EventSourceError } from "@fullcalendar/core/structs/event-source";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    import { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    import { DateEnv } from "@fullcalendar/core/datelib/env";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    export interface CalendarState {
+        eventSources: EventSourceHash;
+        eventSourceLoadingLevel: number;
+        loadingLevel: number;
+        viewType: string;
+        currentDate: DateMarker;
+        dateProfile: DateProfile | null;
+        eventStore: EventStore;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+    }
+    export type reducerFunc = (state: CalendarState, action: Action, calendar: Calendar) => CalendarState;
+    export type Action = {
+        type: 'INIT';
+    } | // wont it create another rerender?
+    {
+        type: 'PREV';
+    } | {
+        type: 'NEXT';
+    } | {
+        type: 'SET_DATE';
+        dateMarker: DateMarker;
+    } | {
+        type: 'SET_VIEW_TYPE';
+        viewType: string;
+        dateMarker?: DateMarker;
+    } | {
+        type: 'SELECT_DATES';
+        selection: DateSpan;
+    } | {
+        type: 'UNSELECT_DATES';
+    } | {
+        type: 'SELECT_EVENT';
+        eventInstanceId: string;
+    } | {
+        type: 'UNSELECT_EVENT';
+    } | {
+        type: 'SET_EVENT_DRAG';
+        state: EventInteractionState;
+    } | {
+        type: 'UNSET_EVENT_DRAG';
+    } | {
+        type: 'SET_EVENT_RESIZE';
+        state: EventInteractionState;
+    } | {
+        type: 'UNSET_EVENT_RESIZE';
+    } | {
+        type: 'ADD_EVENT_SOURCES';
+        sources: EventSource[];
+    } | {
+        type: 'REMOVE_EVENT_SOURCE';
+        sourceId: string;
+    } | {
+        type: 'REMOVE_ALL_EVENT_SOURCES';
+    } | {
+        type: 'FETCH_EVENT_SOURCES';
+        sourceIds?: string[];
+    } | // if no sourceIds, fetch all
+    {
+        type: 'CHANGE_TIMEZONE';
+        oldDateEnv: DateEnv;
+    } | {
+        type: 'RECEIVE_EVENTS';
+        sourceId: string;
+        fetchId: string;
+        fetchRange: DateRange | null;
+        rawEvents: EventInput[];
+    } | {
+        type: 'RECEIVE_EVENT_ERROR';
+        sourceId: string;
+        fetchId: string;
+        fetchRange: DateRange | null;
+        error: EventSourceError;
+    } | // need all these?
+    {
+        type: 'ADD_EVENTS';
+        eventStore: EventStore;
+    } | {
+        type: 'MERGE_EVENTS';
+        eventStore: EventStore;
+    } | {
+        type: 'MUTATE_EVENTS';
+        instanceId: string;
+        mutation: EventMutation;
+        fromApi?: boolean;
+    } | {
+        type: 'REMOVE_EVENT_DEF';
+        defId: string;
+    } | {
+        type: 'REMOVE_EVENT_INSTANCES';
+        instances: EventInstanceHash;
+    } | {
+        type: 'REMOVE_ALL_EVENTS';
+    } | {
+        type: 'RESET_EVENTS';
+    };
+}
+
+declare module "@fullcalendar/core/component/memoized-rendering" {
+    export interface MemoizedRendering<ArgsType extends any[]> {
+        (...args: ArgsType): void;
+        unrender: () => void;
+        dependents: MemoizedRendering<any>[];
+    }
+    export function memoizeRendering<ArgsType extends any[]>(renderFunc: (...args: ArgsType) => void, unrenderFunc?: (...args: ArgsType) => void, dependencies?: MemoizedRendering<any>[]): MemoizedRendering<ArgsType>;
+}
+
+declare module "@fullcalendar/core/Toolbar" {
+    import Component, { ComponentContext } from "@fullcalendar/core/component/Component";
+    export interface ToolbarRenderProps {
+        layout: any;
+        title: string;
+        activeButton: string;
+        isTodayEnabled: boolean;
+        isPrevEnabled: boolean;
+        isNextEnabled: boolean;
+    }
+    export { Toolbar as default, Toolbar };
+    class Toolbar extends Component<ToolbarRenderProps> {
+        el: HTMLElement;
+        viewsWithButtons: any;
+        private _renderLayout;
+        private _updateTitle;
+        private _updateActiveButton;
+        private _updateToday;
+        private _updatePrev;
+        private _updateNext;
+        constructor(context: ComponentContext, extraClassName: any);
+        destroy(): void;
+        render(props: ToolbarRenderProps): void;
+        renderLayout(layout: any): void;
+        unrenderLayout(): void;
+        renderSection(position: any, buttonStr: any): HTMLElement;
+        updateToday(isTodayEnabled: any): void;
+        updatePrev(isPrevEnabled: any): void;
+        updateNext(isNextEnabled: any): void;
+        updateTitle(text: any): void;
+        updateActiveButton(buttonName?: any): void;
+        toggleButtonEnabled(buttonName: any, bool: any): void;
+    }
+}
+
+declare module "@fullcalendar/core/structs/business-hours" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { EventInput } from "@fullcalendar/core/structs/event";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    export type BusinessHoursInput = boolean | EventInput | EventInput[];
+    export function parseBusinessHours(input: BusinessHoursInput, calendar: Calendar): EventStore;
+}
+
+declare module "@fullcalendar/core/CalendarComponent" {
+    import Component, { ComponentContext } from "@fullcalendar/core/component/Component";
+    import { ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    import View from "@fullcalendar/core/View";
+    import Toolbar from "@fullcalendar/core/Toolbar";
+    import DateProfileGenerator, { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventUiHash } from "@fullcalendar/core/component/event-ui";
+    import { BusinessHoursInput } from "@fullcalendar/core/structs/business-hours";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { CalendarState } from "@fullcalendar/core/reducers/types";
+    export interface CalendarComponentProps extends CalendarState {
+        viewSpec: ViewSpec;
+        dateProfileGenerator: DateProfileGenerator;
+        eventUiBases: EventUiHash;
+    }
+    export { CalendarComponent as default, CalendarComponent };
+    class CalendarComponent extends Component<CalendarComponentProps> {
+        view: View;
+        header: Toolbar;
+        footer: Toolbar;
+        computeTitle: (dateProfile: any, viewOptions: any) => string;
+        parseBusinessHours: (input: BusinessHoursInput) => EventStore;
+        el: HTMLElement;
+        contentEl: HTMLElement;
+        isHeightAuto: boolean;
+        viewHeight: number;
+        private _renderToolbars;
+        private buildViewPropTransformers;
+        constructor(context: ComponentContext, el: HTMLElement);
+        destroy(): void;
+        toggleElClassNames(bool: boolean): void;
+        render(props: CalendarComponentProps): void;
+        renderToolbars(viewSpec: ViewSpec, dateProfile: DateProfile, currentDate: DateMarker, dateProfileGenerator: DateProfileGenerator, title: string): void;
+        renderView(props: CalendarComponentProps, title: string): void;
+        updateSize(isResize?: boolean): void;
+        computeHeightVars(): void;
+        queryToolbarsHeight(): number;
+        freezeHeight(): void;
+        thawHeight(): void;
+    }
+}
+
+declare module "@fullcalendar/core/interactions/event-dragging" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { EventMutation } from "@fullcalendar/core/structs/event-mutation";
+    import { Hit } from "@fullcalendar/core/interactions/hit";
+    export type eventDragMutationMassager = (mutation: EventMutation, hit0: Hit, hit1: Hit) => void;
+    export type EventDropTransformers = (mutation: EventMutation, calendar: Calendar) => void;
+}
+
+declare module "@fullcalendar/core/interactions/date-selecting" {
+    import { Hit } from "@fullcalendar/core/interactions/hit";
+    export type dateSelectionJoinTransformer = (hit0: Hit, hit1: Hit) => any;
+}
+
+declare module "@fullcalendar/core/interactions/event-resizing" {
+    import { Hit } from "@fullcalendar/core/interactions/hit";
+    export type EventResizeJoinTransforms = (hit0: Hit, hit1: Hit) => false | object;
+}
+
+declare module "@fullcalendar/core/structs/drag-meta" {
+    import { Duration, DurationInput } from "@fullcalendar/core/datelib/duration";
+    import { EventNonDateInput } from "@fullcalendar/core/structs/event";
+    export interface DragMetaInput extends EventNonDateInput {
+        startTime?: DurationInput;
+        duration?: DurationInput;
+        create?: boolean;
+        sourceId?: string;
+    }
+    export interface DragMeta {
+        startTime: Duration | null;
+        duration: Duration | null;
+        create: boolean;
+        sourceId: string;
+        leftoverProps: object;
+    }
+    export function parseDragMeta(raw: DragMetaInput): DragMeta;
+}
+
+declare module "@fullcalendar/core/interactions/external-element-dragging" {
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    import { DragMeta } from "@fullcalendar/core/structs/drag-meta";
+    export type ExternalDefTransform = (dateSpan: DateSpan, dragMeta: DragMeta) => any;
+}
+
+declare module "@fullcalendar/core/interactions/interaction" {
+    import DateComponent from "@fullcalendar/core/component/DateComponent";
+    export abstract class Interaction {
+        component: DateComponent<any>;
+        constructor(settings: InteractionSettings);
+        destroy(): void;
+    }
+    export type InteractionClass = {
+        new (settings: InteractionSettings): Interaction;
+    };
+    export interface InteractionSettingsInput {
+        el: HTMLElement;
+        useEventCenter?: boolean;
+    }
+    export interface InteractionSettings {
+        component: DateComponent<any>;
+        el: HTMLElement;
+        useEventCenter: boolean;
+    }
+    export type InteractionSettingsStore = {
+        [componenUid: string]: InteractionSettings;
+    };
+    export function parseInteractionSettings(component: DateComponent<any>, input: InteractionSettingsInput): InteractionSettings;
+    export function interactionSettingsToStore(settings: InteractionSettings): {
+        [x: string]: InteractionSettings;
+    };
+    export let interactionSettingsStore: InteractionSettingsStore;
+}
+
+declare module "@fullcalendar/core/theme/Theme" {
+    export { Theme as default, Theme };
+
+    class Theme {
+        calendarOptions: any;
+        classes: any;
+        iconClasses: any;
+        baseIconClass: string;
+        iconOverrideOption: any;
+        iconOverrideCustomButtonOption: any;
+        iconOverridePrefix: string;
+        constructor(calendarOptions: any);
+        processIconOverride(): void;
+        setIconOverride(iconOverrideHash: any): void;
+        applyIconOverridePrefix(className: any): any;
+        getClass(key: any): any;
+        getIconClass(buttonName: any): string;
+        getCustomButtonIconClass(customButtonProps: any): string;
+    }
+    export type ThemeClass = {
+        new (calendarOptions: any): Theme;
+    };
+}
+
+declare module "@fullcalendar/core/interactions/ElementDragging" {
+    import EmitterMixin from "@fullcalendar/core/common/EmitterMixin";
+    export { ElementDragging as default, ElementDragging };
+    abstract class ElementDragging {
+        emitter: EmitterMixin;
+        constructor(el: HTMLElement);
+        destroy(): void;
+        abstract setIgnoreMove(bool: boolean): void;
+        setMirrorIsVisible(bool: boolean): void;
+        setMirrorNeedsRevert(bool: boolean): void;
+        setAutoScrollEnabled(bool: boolean): void;
+    }
+    export type ElementDraggingClass = {
+        new (el: HTMLElement): ElementDragging;
+    };
+}
+
+declare module "@fullcalendar/core/plugin-system" {
+    import { reducerFunc } from "@fullcalendar/core/reducers/types";
+    import { eventDefParserFunc } from "@fullcalendar/core/structs/event";
+    import { eventDefMutationApplier } from "@fullcalendar/core/structs/event-mutation";
+    import Calendar, { DatePointTransform, DateSpanTransform, CalendarInteractionClass, OptionChangeHandlerMap } from "@fullcalendar/core/Calendar";
+    import { ViewConfigInputHash } from "@fullcalendar/core/structs/view-config";
+    import { ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    import View, { ViewProps } from "@fullcalendar/core/View";
+    import { CalendarComponentProps } from "@fullcalendar/core/CalendarComponent";
+    import { isPropsValidTester } from "@fullcalendar/core/validation";
+    import { eventDragMutationMassager, EventDropTransformers } from "@fullcalendar/core/interactions/event-dragging";
+    import { dateSelectionJoinTransformer } from "@fullcalendar/core/interactions/date-selecting";
+    import { EventResizeJoinTransforms } from "@fullcalendar/core/interactions/event-resizing";
+    import { ExternalDefTransform } from "@fullcalendar/core/interactions/external-element-dragging";
+    import { InteractionClass } from "@fullcalendar/core/interactions/interaction";
+    import { ThemeClass } from "@fullcalendar/core/theme/Theme";
+    import { EventSourceDef } from "@fullcalendar/core/structs/event-source";
+    import { CmdFormatterFunc } from "@fullcalendar/core/datelib/formatting-cmd";
+    import { RecurringType } from "@fullcalendar/core/structs/recurring-event";
+    import { NamedTimeZoneImplClass } from "@fullcalendar/core/datelib/timezone";
+    import { ElementDraggingClass } from "@fullcalendar/core/interactions/ElementDragging";
+    export interface PluginDefInput {
+        deps?: PluginDef[];
+        reducers?: reducerFunc[];
+        eventDefParsers?: eventDefParserFunc[];
+        eventDragMutationMassagers?: eventDragMutationMassager[];
+        eventDefMutationAppliers?: eventDefMutationApplier[];
+        dateSelectionTransformers?: dateSelectionJoinTransformer[];
+        datePointTransforms?: DatePointTransform[];
+        dateSpanTransforms?: DateSpanTransform[];
+        views?: ViewConfigInputHash;
+        viewPropsTransformers?: ViewPropsTransformerClass[];
+        isPropsValid?: isPropsValidTester;
+        externalDefTransforms?: ExternalDefTransform[];
+        eventResizeJoinTransforms?: EventResizeJoinTransforms[];
+        viewContainerModifiers?: ViewContainerModifier[];
+        eventDropTransformers?: EventDropTransformers[];
+        componentInteractions?: InteractionClass[];
+        calendarInteractions?: CalendarInteractionClass[];
+        themeClasses?: {
+            [themeSystemName: string]: ThemeClass;
+        };
+        eventSourceDefs?: EventSourceDef[];
+        cmdFormatter?: CmdFormatterFunc;
+        recurringTypes?: RecurringType[];
+        namedTimeZonedImpl?: NamedTimeZoneImplClass;
+        defaultView?: string;
+        elementDraggingImpl?: ElementDraggingClass;
+        optionChangeHandlers?: OptionChangeHandlerMap;
+    }
+    export interface PluginHooks {
+        reducers: reducerFunc[];
+        eventDefParsers: eventDefParserFunc[];
+        eventDragMutationMassagers: eventDragMutationMassager[];
+        eventDefMutationAppliers: eventDefMutationApplier[];
+        dateSelectionTransformers: dateSelectionJoinTransformer[];
+        datePointTransforms: DatePointTransform[];
+        dateSpanTransforms: DateSpanTransform[];
+        views: ViewConfigInputHash;
+        viewPropsTransformers: ViewPropsTransformerClass[];
+        isPropsValid: isPropsValidTester | null;
+        externalDefTransforms: ExternalDefTransform[];
+        eventResizeJoinTransforms: EventResizeJoinTransforms[];
+        viewContainerModifiers: ViewContainerModifier[];
+        eventDropTransformers: EventDropTransformers[];
+        componentInteractions: InteractionClass[];
+        calendarInteractions: CalendarInteractionClass[];
+        themeClasses: {
+            [themeSystemName: string]: ThemeClass;
+        };
+        eventSourceDefs: EventSourceDef[];
+        cmdFormatter?: CmdFormatterFunc;
+        recurringTypes: RecurringType[];
+        namedTimeZonedImpl?: NamedTimeZoneImplClass;
+        defaultView: string;
+        elementDraggingImpl?: ElementDraggingClass;
+        optionChangeHandlers: OptionChangeHandlerMap;
+    }
+    export interface PluginDef extends PluginHooks {
+        id: string;
+        deps: PluginDef[];
+    }
+    export type ViewPropsTransformerClass = new () => ViewPropsTransformer;
+    export interface ViewPropsTransformer {
+        transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, view: View): any;
+    }
+    export type ViewContainerModifier = (contentEl: HTMLElement, calendar: Calendar) => void;
+    export function createPlugin(input: PluginDefInput): PluginDef;
+    export class PluginSystem {
+        hooks: PluginHooks;
+        addedHash: {
+            [pluginId: string]: true;
+        };
+        constructor();
+        add(plugin: PluginDef): void;
+    }
+}
+
+declare module "@fullcalendar/core/event-sources/array-event-source" {
+    const _default_1: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_1;
+}
+
+declare module "@fullcalendar/core/util/requestJson" {
+    export default function requestJson(method: string, url: string, params: object, successCallback: any, failureCallback: any): void;
+}
+
+declare module "@fullcalendar/core/event-sources/json-feed-event-source" {
+    const _default_2: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_2;
+}
+
+declare module "@fullcalendar/core/structs/recurring-event-simple" {
+    const _default_3: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_3;
+}
+
+declare module "@fullcalendar/core/util/object-similarity" {
+    export function isValuesSimilar(val0: any, val1: any, depth?: number): boolean;
+    export function isArraysSimilar(a0: any, a1: any, depth?: number): boolean;
+    export function isObjectsSimilar(obj0: any, obj1: any, depth?: number): boolean;
+    export function computeChangedProps(obj0: any, obj1: any, depth?: number): {};
+    export function anyKeysRemoved(obj0: any, obj1: any): boolean;
+}
+
+declare module "@fullcalendar/core/option-change-handlers" {
+    const _default_4: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_4;
+}
+
+declare module "@fullcalendar/core/options" {
+    import { PluginDef } from "@fullcalendar/core/plugin-system";
+    export const config: any;
+    export const globalDefaults: {
+        defaultRangeSeparator: string;
+        titleRangeSeparator: string;
+        defaultTimedEventDuration: string;
+        defaultAllDayEventDuration: {
+            day: number;
+        };
+        forceEventDuration: boolean;
+        nextDayThreshold: string;
+        columnHeader: boolean;
+        defaultView: string;
+        aspectRatio: number;
+        header: {
+            left: string;
+            center: string;
+            right: string;
+        };
+        weekends: boolean;
+        weekNumbers: boolean;
+        weekNumberCalculation: string;
+        editable: boolean;
+        scrollTime: string;
+        minTime: string;
+        maxTime: string;
+        showNonCurrentDates: boolean;
+        lazyFetching: boolean;
+        startParam: string;
+        endParam: string;
+        timeZoneParam: string;
+        timeZone: string;
+        locales: any[];
+        locale: string;
+        timeGridEventMinHeight: number;
+        themeSystem: string;
+        dragRevertDuration: number;
+        dragScroll: boolean;
+        allDayMaintainDuration: boolean;
+        unselectAuto: boolean;
+        dropAccept: string;
+        eventOrder: string;
+        eventLimit: boolean;
+        eventLimitClick: string;
+        dayPopoverFormat: {
+            month: string;
+            day: string;
+            year: string;
+        };
+        handleWindowResize: boolean;
+        windowResizeDelay: number;
+        longPressDelay: number;
+        eventDragMinDistance: number;
+    };
+    export const rtlDefaults: {
+        header: {
+            left: string;
+            center: string;
+            right: string;
+        };
+        buttonIcons: {
+            prev: string;
+            next: string;
+            prevYear: string;
+            nextYear: string;
+        };
+    };
+    export function mergeOptions(optionObjs: any): any;
+    export function refinePluginDefs(pluginInputs: any[]): PluginDef[];
+}
+
+declare module "@fullcalendar/core/OptionsManager" {
+    export { OptionsManager as default, OptionsManager };
+
+    class OptionsManager {
+        dirDefaults: any;
+        localeDefaults: any;
+        overrides: any;
+        dynamicOverrides: any;
+        computed: any;
+        constructor(overrides: any);
+        add(props: any): void;
+        addDynamic(props: any): void;
+        reset(props: any): void;
+        compute(): void;
+    }
+}
+
+declare module "@fullcalendar/core/reducers/eventSources" {
+    import { EventSourceHash } from "@fullcalendar/core/structs/event-source";
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    import { Action } from "@fullcalendar/core/reducers/types";
+    export default function (eventSources: EventSourceHash, action: Action, dateProfile: DateProfile | null, calendar: Calendar): EventSourceHash;
+}
+
+declare module "@fullcalendar/core/reducers/main" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import { CalendarState, Action } from "@fullcalendar/core/reducers/types";
+    export default function (state: CalendarState, action: Action, calendar: Calendar): CalendarState;
+}
+
+declare module "@fullcalendar/core/interactions/pointer" {
+    export interface PointerDragEvent {
+        origEvent: UIEvent;
+        isTouch: boolean;
+        subjectEl: EventTarget;
+        pageX: number;
+        pageY: number;
+        deltaX: number;
+        deltaY: number;
+    }
+}
+
+declare module "@fullcalendar/core/interactions/EventClicking" {
+    import { Interaction, InteractionSettings } from "@fullcalendar/core/interactions/interaction";
+    export { EventClicking as default, EventClicking };
+    class EventClicking extends Interaction {
+        constructor(settings: InteractionSettings);
+        handleSegClick: (ev: Event, segEl: HTMLElement) => void;
+    }
+}
+
+declare module "@fullcalendar/core/interactions/EventHovering" {
+    import { Interaction, InteractionSettings } from "@fullcalendar/core/interactions/interaction";
+    export { EventHovering as default, EventHovering };
+    class EventHovering extends Interaction {
+        removeHoverListeners: () => void;
+        currentSegEl: HTMLElement;
+        constructor(settings: InteractionSettings);
+        destroy(): void;
+        handleEventElRemove: (el: HTMLElement) => void;
+        handleSegEnter: (ev: Event, segEl: HTMLElement) => void;
+        handleSegLeave: (ev: Event, segEl: HTMLElement) => void;
+        triggerEvent(publicEvName: string, ev: Event | null, segEl: HTMLElement): void;
+    }
+}
+
+declare module "@fullcalendar/core/theme/StandardTheme" {
+    import Theme from "@fullcalendar/core/theme/Theme";
+    export { StandardTheme as default, StandardTheme };
+    class StandardTheme extends Theme {
+    }
+}
+
+declare module "@fullcalendar/core/Calendar" {
+    import { EmitterInterface } from "@fullcalendar/core/common/EmitterMixin";
+    import OptionsManager from "@fullcalendar/core/OptionsManager";
+    import View from "@fullcalendar/core/View";
+    import Theme from "@fullcalendar/core/theme/Theme";
+    import { OptionsInput } from "@fullcalendar/core/types/input-types";
+    import { RawLocaleMap } from "@fullcalendar/core/datelib/locale";
+    import { DateEnv, DateInput } from "@fullcalendar/core/datelib/env";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { Duration, DurationInput } from "@fullcalendar/core/datelib/duration";
+    import { DateSpan, DateSpanApi, DatePointApi } from "@fullcalendar/core/structs/date-span";
+    import { DateRangeInput } from "@fullcalendar/core/datelib/date-range";
+    import DateProfileGenerator from "@fullcalendar/core/DateProfileGenerator";
+    import { EventSourceInput } from "@fullcalendar/core/structs/event-source";
+    import { EventInput } from "@fullcalendar/core/structs/event";
+    import { CalendarState, Action } from "@fullcalendar/core/reducers/types";
+    import EventSourceApi from "@fullcalendar/core/api/EventSourceApi";
+    import EventApi from "@fullcalendar/core/api/EventApi";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventUiHash, EventUi } from "@fullcalendar/core/component/event-ui";
+    import { ViewSpecHash, ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    import { PluginSystem } from "@fullcalendar/core/plugin-system";
+    import CalendarComponent from "@fullcalendar/core/CalendarComponent";
+    import DateComponent from "@fullcalendar/core/component/DateComponent";
+    import { PointerDragEvent } from "@fullcalendar/core/interactions/pointer";
+    import { InteractionSettingsInput, Interaction } from "@fullcalendar/core/interactions/interaction";
+    export interface DateClickApi extends DatePointApi {
+        dayEl: HTMLElement;
+        jsEvent: UIEvent;
+        view: View;
+    }
+    export interface DateSelectionApi extends DateSpanApi {
+        jsEvent: UIEvent;
+        view: View;
+    }
+    export type DatePointTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
+    export type DateSpanTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
+    export type CalendarInteraction = {
+        destroy(): any;
+    };
+    export type CalendarInteractionClass = {
+        new (calendar: Calendar): CalendarInteraction;
+    };
+    export type OptionChangeHandler = (propValue: any, calendar: Calendar) => void;
+    export type OptionChangeHandlerMap = {
+        [propName: string]: OptionChangeHandler;
+    };
+    export { Calendar as default, Calendar };
+    class Calendar {
+        static on: EmitterInterface['on'];
+        static off: EmitterInterface['off'];
+        static trigger: EmitterInterface['trigger'];
+        on: EmitterInterface['on'];
+        one: EmitterInterface['one'];
+        off: EmitterInterface['off'];
+        trigger: EmitterInterface['trigger'];
+        triggerWith: EmitterInterface['triggerWith'];
+        hasHandlers: EmitterInterface['hasHandlers'];
+        private parseRawLocales;
+        private buildLocale;
+        private buildDateEnv;
+        private buildTheme;
+        private buildEventUiSingleBase;
+        private buildSelectionConfig;
+        private buildEventUiBySource;
+        private buildEventUiBases;
+        eventUiBases: EventUiHash;
+        selectionConfig: EventUi;
+        optionsManager: OptionsManager;
+        viewSpecs: ViewSpecHash;
+        dateProfileGenerators: {
+            [viewName: string]: DateProfileGenerator;
+        };
+        theme: Theme;
+        dateEnv: DateEnv;
+        availableRawLocales: RawLocaleMap;
+        pluginSystem: PluginSystem;
+        defaultAllDayEventDuration: Duration;
+        defaultTimedEventDuration: Duration;
+        calendarInteractions: CalendarInteraction[];
+        interactionsStore: {
+            [componentUid: string]: Interaction[];
+        };
+        removeNavLinkListener: any;
+        windowResizeProxy: any;
+        isHandlingWindowResize: boolean;
+        state: CalendarState;
+        actionQueue: any[];
+        isReducing: boolean;
+        needsRerender: boolean;
+        needsFullRerender: boolean;
+        isRendering: boolean;
+        renderingPauseDepth: number;
+        renderableEventStore: EventStore;
+        buildDelayedRerender: typeof buildDelayedRerender;
+        delayedRerender: any;
+        afterSizingTriggers: any;
+        isViewUpdated: boolean;
+        isDatesUpdated: boolean;
+        isEventsUpdated: boolean;
+        el: HTMLElement;
+        component: CalendarComponent;
+        constructor(el: HTMLElement, overrides?: OptionsInput);
+        addPluginInputs(pluginInputs: any): void;
+        readonly view: View;
+        render(): void;
+        destroy(): void;
+        bindHandlers(): void;
+        unbindHandlers(): void;
+        hydrate(): void;
+        buildInitialState(): CalendarState;
+        dispatch(action: Action): void;
+        reduce(state: CalendarState, action: Action, calendar: Calendar): CalendarState;
+        requestRerender(needsFull?: boolean): void;
+        tryRerender(): void;
+        batchRendering(func: any): void;
+        executeRender(): void;
+        renderComponent(needsFull: any): void;
+        resetOptions(options: any): void;
+        setOptions(options: any): void;
+        processOptions(options: any, mode?: 'dynamic' | 'reset'): void;
+        setOption(name: string, val: any): void;
+        getOption(name: string): any;
+        opt(name: string): any;
+        viewOpt(name: string): any;
+        viewOpts(): any;
+        handleOptions(options: any): void;
+        getAvailableLocaleCodes(): string[];
+        _buildSelectionConfig(rawOpts: any): EventUi;
+        _buildEventUiSingleBase(rawOpts: any): EventUi;
+        hasPublicHandlers(name: string): boolean;
+        publiclyTrigger(name: string, args?: any): any;
+        publiclyTriggerAfterSizing(name: any, args: any): void;
+        releaseAfterSizingTriggers(): void;
+        isValidViewType(viewType: string): boolean;
+        changeView(viewType: string, dateOrRange?: DateRangeInput | DateInput): void;
+        zoomTo(dateMarker: DateMarker, viewType?: string): void;
+        getUnitViewSpec(unit: string): ViewSpec | null;
+        getInitialDate(): Date;
+        prev(): void;
+        next(): void;
+        prevYear(): void;
+        nextYear(): void;
+        today(): void;
+        gotoDate(zonedDateInput: any): void;
+        incrementDate(deltaInput: any): void;
+        getDate(): Date;
+        formatDate(d: DateInput, formatter: any): string;
+        formatRange(d0: DateInput, d1: DateInput, settings: any): any;
+        formatIso(d: DateInput, omitTime?: boolean): string;
+        windowResize(ev: Event): void;
+        updateSize(): void;
+        registerInteractiveComponent(component: DateComponent<any>, settingsInput: InteractionSettingsInput): void;
+        unregisterInteractiveComponent(component: DateComponent<any>): void;
+        select(dateOrObj: DateInput | any, endDate?: DateInput): void;
+        unselect(pev?: PointerDragEvent): void;
+        triggerDateSelect(selection: DateSpan, pev?: PointerDragEvent): void;
+        triggerDateUnselect(pev?: PointerDragEvent): void;
+        triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent): void;
+        buildDatePointApi(dateSpan: DateSpan): DatePointApi;
+        buildDateSpanApi(dateSpan: DateSpan): DateSpanApi;
+        getNow(): DateMarker;
+        getDefaultEventEnd(allDay: boolean, marker: DateMarker): DateMarker;
+        addEvent(eventInput: EventInput, sourceInput?: EventSourceApi | string | number): EventApi | null;
+        getEventById(id: string): EventApi | null;
+        getEvents(): EventApi[];
+        removeAllEvents(): void;
+        rerenderEvents(): void;
+        getEventSources(): EventSourceApi[];
+        getEventSourceById(id: string | number): EventSourceApi | null;
+        addEventSource(sourceInput: EventSourceInput): EventSourceApi;
+        removeAllEventSources(): void;
+        refetchEvents(): void;
+        scrollToTime(timeInput: DurationInput): void;
+    }
+    function buildDelayedRerender(this: Calendar, wait: any): any;
+}
+
+declare module "@fullcalendar/core/component/Component" {
+    import Calendar from "@fullcalendar/core/Calendar";
+    import View from "@fullcalendar/core/View";
+    import Theme from "@fullcalendar/core/theme/Theme";
+    import { DateEnv } from "@fullcalendar/core/datelib/env";
+    export interface ComponentContext {
+        options: any;
+        dateEnv: DateEnv;
+        theme: Theme;
+        calendar: Calendar;
+        view: View;
+    }
+    export type EqualityFuncHash = {
+        [propName: string]: (obj0: any, obj1: any) => boolean;
+    };
+    export { Component as default, Component };
+    class Component<PropsType> {
+        equalityFuncs: EqualityFuncHash;
+        uid: string;
+        props: PropsType | null;
+        context: ComponentContext;
+        dateEnv: DateEnv;
+        theme: Theme;
+        view: View;
+        calendar: Calendar;
+        isRtl: boolean;
+        constructor(context: ComponentContext, isView?: boolean);
+        static addEqualityFuncs(newFuncs: EqualityFuncHash): void;
+        opt(name: any): any;
+        receiveProps(props: PropsType): void;
+        protected render(props: PropsType): void;
+        destroy(): void;
+    }
+}
+
+declare module "@fullcalendar/core/structs/view-config" {
+    import View from "@fullcalendar/core/View";
+    import { ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    import { ComponentContext } from "@fullcalendar/core/component/Component";
+    import DateProfileGenerator from "@fullcalendar/core/DateProfileGenerator";
+    export type ViewClass = new (context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement) => View;
+    export interface ViewConfigObjectInput {
+        type?: string;
+        class?: ViewClass;
+        [optionName: string]: any;
+    }
+    export type ViewConfigInput = ViewClass | ViewConfigObjectInput;
+    export type ViewConfigInputHash = {
+        [viewType: string]: ViewConfigInput;
+    };
+    export interface ViewConfig {
+        superType: string;
+        class: ViewClass | null;
+        options: any;
+    }
+    export type ViewConfigHash = {
+        [viewType: string]: ViewConfig;
+    };
+    export function parseViewConfigs(inputs: ViewConfigInputHash): ViewConfigHash;
+}
+
+declare module "@fullcalendar/core/structs/view-def" {
+    import { ViewClass, ViewConfigHash } from "@fullcalendar/core/structs/view-config";
+    export interface ViewDef {
+        type: string;
+        class: ViewClass;
+        overrides: any;
+        defaults: any;
+    }
+    export type ViewDefHash = {
+        [viewType: string]: ViewDef;
+    };
+    export function compileViewDefs(defaultConfigs: ViewConfigHash, overrideConfigs: ViewConfigHash): ViewDefHash;
+}
+
+declare module "@fullcalendar/core/structs/view-spec" {
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import OptionsManager from "@fullcalendar/core/OptionsManager";
+    import { ViewConfigInputHash, ViewClass } from "@fullcalendar/core/structs/view-config";
+    export interface ViewSpec {
+        type: string;
+        class: ViewClass;
+        duration: Duration;
+        durationUnit: string;
+        singleUnit: string;
+        options: any;
+        buttonTextOverride: string;
+        buttonTextDefault: string;
+    }
+    export type ViewSpecHash = {
+        [viewType: string]: ViewSpec;
+    };
+    export function buildViewSpecs(defaultInputs: ViewConfigInputHash, optionsManager: OptionsManager): ViewSpecHash;
+}
+
+declare module "@fullcalendar/core/DateProfileGenerator" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { DateRange, OpenDateRange } from "@fullcalendar/core/datelib/date-range";
+    import { ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    import { DateEnv } from "@fullcalendar/core/datelib/env";
+    import Calendar from "@fullcalendar/core/Calendar";
+    export interface DateProfile {
+        currentRange: DateRange;
+        currentRangeUnit: string;
+        isRangeAllDay: boolean;
+        validRange: OpenDateRange;
+        activeRange: DateRange;
+        renderRange: DateRange;
+        minTime: Duration;
+        maxTime: Duration;
+        isValid: boolean;
+        dateIncrement: Duration;
+    }
+    export { DateProfileGenerator as default, DateProfileGenerator };
+    class DateProfileGenerator {
+        viewSpec: ViewSpec;
+        options: any;
+        dateEnv: DateEnv;
+        calendar: Calendar;
+        isHiddenDayHash: boolean[];
+        constructor(viewSpec: ViewSpec, calendar: Calendar);
+        buildPrev(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
+        buildNext(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
+        build(currentDate: DateMarker, direction?: any, forceToValid?: boolean): DateProfile;
+        buildValidRange(): OpenDateRange;
+        buildCurrentRangeInfo(date: DateMarker, direction: any): {
+            duration: any;
+            unit: any;
+            range: any;
+        };
+        getFallbackDuration(): Duration;
+        adjustActiveRange(range: DateRange, minTime: Duration, maxTime: Duration): {
+            start: Date;
+            end: Date;
+        };
+        buildRangeFromDuration(date: DateMarker, direction: any, duration: Duration, unit: any): any;
+        buildRangeFromDayCount(date: DateMarker, direction: any, dayCount: any): {
+            start: Date;
+            end: Date;
+        };
+        buildCustomVisibleRange(date: DateMarker): OpenDateRange;
+        buildRenderRange(currentRange: DateRange, currentRangeUnit: any, isRangeAllDay: any): DateRange;
+        buildDateIncrement(fallback: any): Duration;
+        getRangeOption(name: any, ...otherArgs: any[]): OpenDateRange;
+        initHiddenDays(): void;
+        trimHiddenDays(range: DateRange): DateRange | null;
+        isHiddenDay(day: any): boolean;
+        skipHiddenDays(date: DateMarker, inc?: number, isExclusive?: boolean): Date;
+    }
+    export function isDateProfilesEqual(p0: DateProfile, p1: DateProfile): boolean;
+}
+
+declare module "@fullcalendar/core/View" {
+    import DateProfileGenerator, { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { EmitterInterface } from "@fullcalendar/core/common/EmitterMixin";
+    import { ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    import { ComponentContext } from "@fullcalendar/core/component/Component";
+    import DateComponent from "@fullcalendar/core/component/DateComponent";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventUiHash } from "@fullcalendar/core/component/event-ui";
+    import { EventRenderRange } from "@fullcalendar/core/component/event-rendering";
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    import { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    export interface ViewProps {
+        dateProfile: DateProfile;
+        businessHours: EventStore;
+        eventStore: EventStore;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+    }
+    export { View as default, View };
+    abstract class View extends DateComponent<ViewProps> {
+        usesMinMaxTime: boolean;
+        dateProfileGeneratorClass: any;
+        on: EmitterInterface['on'];
+        one: EmitterInterface['one'];
+        off: EmitterInterface['off'];
+        trigger: EmitterInterface['trigger'];
+        triggerWith: EmitterInterface['triggerWith'];
+        hasHandlers: EmitterInterface['hasHandlers'];
+        viewSpec: ViewSpec;
+        dateProfileGenerator: DateProfileGenerator;
+        type: string;
+        title: string;
+        queuedScroll: any;
+        eventOrderSpecs: any;
+        nextDayThreshold: Duration;
+        isNowIndicatorRendered: boolean;
+        initialNowDate: DateMarker;
+        initialNowQueriedMs: number;
+        nowIndicatorTimeoutID: any;
+        nowIndicatorIntervalID: any;
+        private renderDatesMem;
+        private renderBusinessHoursMem;
+        private renderDateSelectionMem;
+        private renderEventsMem;
+        private renderEventSelectionMem;
+        private renderEventDragMem;
+        private renderEventResizeMem;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        initialize(): void;
+        readonly activeStart: Date;
+        readonly activeEnd: Date;
+        readonly currentStart: Date;
+        readonly currentEnd: Date;
+        render(props: ViewProps): void;
+        destroy(): void;
+        updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
+        updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
+        renderDatesWrap(dateProfile: DateProfile): void;
+        unrenderDatesWrap(): void;
+        renderDates(dateProfile: DateProfile): void;
+        unrenderDates(): void;
+        renderBusinessHours(businessHours: EventStore): void;
+        unrenderBusinessHours(): void;
+        renderDateSelectionWrap(selection: DateSpan): void;
+        unrenderDateSelectionWrap(selection: DateSpan): void;
+        renderDateSelection(selection: DateSpan): void;
+        unrenderDateSelection(selection: DateSpan): void;
+        renderEvents(eventStore: EventStore): void;
+        unrenderEvents(): void;
+        sliceEvents(eventStore: EventStore, allDay: boolean): EventRenderRange[];
+        renderEventSelectionWrap(instanceId: string): void;
+        unrenderEventSelectionWrap(instanceId: string): void;
+        renderEventSelection(instanceId: string): void;
+        unrenderEventSelection(instanceId: string): void;
+        renderEventDragWrap(state: EventInteractionState): void;
+        unrenderEventDragWrap(state: EventInteractionState): void;
+        renderEventDrag(state: EventInteractionState): void;
+        unrenderEventDrag(state: EventInteractionState): void;
+        renderEventResizeWrap(state: EventInteractionState): void;
+        unrenderEventResizeWrap(state: EventInteractionState): void;
+        renderEventResize(state: EventInteractionState): void;
+        unrenderEventResize(state: EventInteractionState): void;
+        startNowIndicator(dateProfile: DateProfile): void;
+        updateNowIndicator(): void;
+        stopNowIndicator(): void;
+        getNowIndicatorUnit(dateProfile: DateProfile): void;
+        renderNowIndicator(date: any): void;
+        unrenderNowIndicator(): void;
+        addScroll(scroll: any): void;
+        popScroll(isResize: boolean): void;
+        applyQueuedScroll(isResize: boolean): void;
+        queryScroll(): any;
+        applyScroll(scroll: any, isResize: boolean): void;
+        computeDateScroll(timeMs: number): {};
+        queryDateScroll(): {};
+        applyDateScroll(scroll: any): void;
+        scrollToTime(time: Duration): void;
+    }
+}
+
+declare module "@fullcalendar/core/types/input-types" {
+    import View from "@fullcalendar/core/View";
+    import { EventSourceInput, EventInputTransformer } from "@fullcalendar/core/structs/event-source";
+    import { Duration, DurationInput } from "@fullcalendar/core/datelib/duration";
+    import { DateInput } from "@fullcalendar/core/datelib/env";
+    import { FormatterInput } from "@fullcalendar/core/datelib/formatting";
+    import { DateRangeInput } from "@fullcalendar/core/datelib/date-range";
+    import { BusinessHoursInput } from "@fullcalendar/core/structs/business-hours";
+    import EventApi from "@fullcalendar/core/api/EventApi";
+    import { AllowFunc, ConstraintInput, OverlapFunc } from "@fullcalendar/core/validation";
+    import { PluginDef } from "@fullcalendar/core/plugin-system";
+    import { LocaleSingularArg, RawLocale } from "@fullcalendar/core/datelib/locale";
+    export interface ToolbarInput {
+        left?: string;
+        center?: string;
+        right?: string;
+    }
+    export interface CustomButtonInput {
+        text: string;
+        icon?: string;
+        themeIcon?: string;
+        bootstrapFontAwesome?: string;
+        click(element: HTMLElement): void;
+    }
+    export interface ButtonIconsInput {
+        prev?: string;
+        next?: string;
+        prevYear?: string;
+        nextYear?: string;
+    }
+    export interface ButtonTextCompoundInput {
+        prev?: string;
+        next?: string;
+        prevYear?: string;
+        nextYear?: string;
+        today?: string;
+        month?: string;
+        week?: string;
+        day?: string;
+        [viewId: string]: string | undefined;
+    }
+    export interface EventSegment {
+        event: EventApi;
+        start: Date;
+        end: Date;
+        isStart: boolean;
+        isEnd: boolean;
+    }
+    export interface CellInfo {
+        date: Date;
+        dayEl: HTMLElement;
+        moreEl: HTMLElement;
+        segs: EventSegment[];
+        hiddenSegs: EventSegment[];
+    }
+    export interface DropInfo {
+        start: Date;
+        end: Date;
+    }
+    export interface OptionsInputBase {
+        header?: boolean | ToolbarInput;
+        footer?: boolean | ToolbarInput;
+        customButtons?: {
+            [name: string]: CustomButtonInput;
+        };
+        buttonIcons?: boolean | ButtonIconsInput;
+        themeSystem?: 'standard' | string;
+        bootstrapFontAwesome?: boolean | ButtonIconsInput;
+        firstDay?: number;
+        dir?: 'ltr' | 'rtl' | 'auto';
+        weekends?: boolean;
+        hiddenDays?: number[];
+        fixedWeekCount?: boolean;
+        weekNumbers?: boolean;
+        weekNumbersWithinDays?: boolean;
+        weekNumberCalculation?: 'local' | 'ISO' | ((m: Date) => number);
+        businessHours?: BusinessHoursInput;
+        showNonCurrentDates?: boolean;
+        height?: number | 'auto' | 'parent' | (() => number);
+        contentHeight?: number | 'auto' | (() => number);
+        aspectRatio?: number;
+        handleWindowResize?: boolean;
+        windowResizeDelay?: number;
+        eventLimit?: boolean | number;
+        eventLimitClick?: 'popover' | 'week' | 'day' | string | ((cellinfo: CellInfo, jsevent: Event) => void);
+        timeZone?: string | boolean;
+        now?: DateInput | (() => DateInput);
+        defaultView?: string;
+        allDaySlot?: boolean;
+        allDayText?: string;
+        slotDuration?: DurationInput;
+        slotLabelFormat?: FormatterInput;
+        slotLabelInterval?: DurationInput;
+        snapDuration?: DurationInput;
+        scrollTime?: DurationInput;
+        minTime?: DurationInput;
+        maxTime?: DurationInput;
+        slotEventOverlap?: boolean;
+        listDayFormat?: FormatterInput | boolean;
+        listDayAltFormat?: FormatterInput | boolean;
+        noEventsMessage?: string;
+        defaultDate?: DateInput;
+        nowIndicator?: boolean;
+        visibleRange?: ((currentDate: Date) => DateRangeInput) | DateRangeInput;
+        validRange?: DateRangeInput;
+        dateIncrement?: DurationInput;
+        dateAlignment?: string;
+        duration?: DurationInput;
+        dayCount?: number;
+        locales?: RawLocale[];
+        locale?: LocaleSingularArg;
+        eventTimeFormat?: FormatterInput;
+        columnHeader?: boolean;
+        columnHeaderFormat?: FormatterInput;
+        columnHeaderText?: string | ((date: DateInput) => string);
+        columnHeaderHtml?: string | ((date: DateInput) => string);
+        titleFormat?: FormatterInput;
+        weekLabel?: string;
+        displayEventTime?: boolean;
+        displayEventEnd?: boolean;
+        eventLimitText?: string | ((eventCnt: number) => string);
+        dayPopoverFormat?: FormatterInput;
+        navLinks?: boolean;
+        navLinkDayClick?: string | ((date: Date, jsEvent: Event) => void);
+        navLinkWeekClick?: string | ((weekStart: any, jsEvent: Event) => void);
+        selectable?: boolean;
+        selectMirror?: boolean;
+        unselectAuto?: boolean;
+        unselectCancel?: string;
+        defaultAllDayEventDuration?: DurationInput;
+        defaultTimedEventDuration?: DurationInput;
+        cmdFormatter?: string;
+        defaultRangeSeparator?: string;
+        selectConstraint?: ConstraintInput;
+        selectOverlap?: boolean | OverlapFunc;
+        selectAllow?: AllowFunc;
+        editable?: boolean;
+        eventStartEditable?: boolean;
+        eventDurationEditable?: boolean;
+        eventConstraint?: ConstraintInput;
+        eventOverlap?: boolean | OverlapFunc;
+        eventAllow?: AllowFunc;
+        eventClassName?: string[] | string;
+        eventClassNames?: string[] | string;
+        eventBackgroundColor?: string;
+        eventBorderColor?: string;
+        eventTextColor?: string;
+        eventColor?: string;
+        events?: EventSourceInput;
+        eventSources?: EventSourceInput[];
+        allDayDefault?: boolean;
+        startParam?: string;
+        endParam?: string;
+        lazyFetching?: boolean;
+        nextDayThreshold?: DurationInput;
+        eventOrder?: string | Array<((a: EventApi, b: EventApi) => number) | (string | ((a: EventApi, b: EventApi) => number))>;
+        rerenderDelay?: number | null;
+        dragRevertDuration?: number;
+        dragScroll?: boolean;
+        longPressDelay?: number;
+        eventLongPressDelay?: number;
+        droppable?: boolean;
+        dropAccept?: string | ((draggable: any) => boolean);
+        eventDataTransform?: EventInputTransformer;
+        allDayMaintainDuration?: boolean;
+        eventResizableFromStart?: boolean;
+        timeGridEventMinHeight?: number;
+        datesRender?(arg: {
+            view: View;
+            el: HTMLElement;
+        }): void;
+        datesDestroy?(arg: {
+            view: View;
+            el: HTMLElement;
+        }): void;
+        dayRender?(arg: {
+            view: View;
+            date: Date;
+            allDay: boolean;
+            el: HTMLElement;
+        }): void;
+        windowResize?(view: View): void;
+        dateClick?(arg: {
+            date: Date;
+            dateStr: string;
+            allDay: boolean;
+            resource: any;
+            dayEl: HTMLElement;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventClick?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            jsEvent: MouseEvent;
+            view: View;
+        }): boolean | void;
+        eventMouseEnter?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventMouseLeave?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        select?(arg: {
+            start: Date;
+            end: Date;
+            startStr: string;
+            endStr: string;
+            allDay: boolean;
+            resource: any;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        unselect?(arg: {
+            view: View;
+            jsEvent: Event;
+        }): void;
+        loading?(isLoading: boolean, view: View): void;
+        eventRender?(arg: {
+            event: EventApi;
+            el: HTMLElement;
+            view: View;
+        }): void;
+        eventPositioned?(arg: {
+            event: EventApi;
+            el: HTMLElement;
+            view: View;
+        }): void;
+        _eventsPositioned?(arg: {
+            view: View;
+        }): void;
+        eventDestroy?(arg: {
+            event: EventApi;
+            el: HTMLElement;
+            view: View;
+        }): void;
+        eventDragStart?(arg: {
+            event: EventApi;
+            el: HTMLElement;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventDragStop?(arg: {
+            event: EventApi;
+            el: HTMLElement;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventDrop?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            delta: Duration;
+            revert: () => void;
+            jsEvent: Event;
+            view: View;
+        }): void;
+        eventResizeStart?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventResizeStop?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventResize?(arg: {
+            el: HTMLElement;
+            event: EventApi;
+            delta: Duration;
+            revert: () => void;
+            jsEvent: Event;
+            view: View;
+        }): void;
+        drop?(arg: {
+            date: Date;
+            dateStr: string;
+            allDay: boolean;
+            draggedEl: HTMLElement;
+            jsEvent: MouseEvent;
+            view: View;
+        }): void;
+        eventReceive?(arg: {
+            event: EventApi;
+            draggedEl: HTMLElement;
+            view: View;
+        }): void;
+        eventLeave?(arg: {
+            draggedEl: HTMLElement;
+            event: EventApi;
+            view: View;
+        }): void;
+        viewSkeletonRender?(arg: {
+            el: HTMLElement;
+            view: View;
+        }): void;
+        viewSkeletonDestroy?(arg: {
+            el: HTMLElement;
+            view: View;
+        }): void;
+        _destroyed?(): void;
+    }
+    export interface ViewOptionsInput extends OptionsInputBase {
+        type?: string;
+        buttonText?: string;
+    }
+    export interface OptionsInput extends OptionsInputBase {
+        buttonText?: ButtonTextCompoundInput;
+        views?: {
+            [viewId: string]: ViewOptionsInput;
+        };
+        plugins?: (PluginDef | string)[];
+    }
+}
+
+declare module "@fullcalendar/core/component/date-rendering" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import Component, { ComponentContext } from "@fullcalendar/core/component/Component";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    export function buildGotoAnchorHtml(component: Component<any>, gotoOptions: any, attrs: any, innerHtml?: any): string;
+    export function getAllDayHtml(component: Component<any>): any;
+    export function getDayClasses(date: DateMarker, dateProfile: DateProfile, context: ComponentContext, noThemeHighlight?: any): any[];
+}
+
+declare module "@fullcalendar/core/common/PositionCache" {
+    export { PositionCache as default, PositionCache };
+
+    class PositionCache {
+        originClientRect: ClientRect;
+        els: HTMLElement[];
+        originEl: HTMLElement;
+        isHorizontal: boolean;
+        isVertical: boolean;
+        lefts: any;
+        rights: any;
+        tops: any;
+        bottoms: any;
+        constructor(originEl: HTMLElement, els: HTMLElement[], isHorizontal: boolean, isVertical: boolean);
+        build(): void;
+        buildElHorizontals(originClientLeft: number): void;
+        buildElVerticals(originClientTop: number): void;
+        leftToIndex(leftPosition: number): any;
+        topToIndex(topPosition: number): any;
+        getWidth(leftIndex: number): number;
+        getHeight(topIndex: number): number;
+    }
+}
+
+declare module "@fullcalendar/core/common/scroll-controller" {
+    export abstract class ScrollController {
+        abstract getScrollTop(): number;
+        abstract getScrollLeft(): number;
+        abstract setScrollTop(top: number): void;
+        abstract setScrollLeft(left: number): void;
+        abstract getClientWidth(): number;
+        abstract getClientHeight(): number;
+        abstract getScrollWidth(): number;
+        abstract getScrollHeight(): number;
+        getMaxScrollTop(): number;
+        getMaxScrollLeft(): number;
+        canScrollVertically(): boolean;
+        canScrollHorizontally(): boolean;
+        canScrollUp(): boolean;
+        canScrollDown(): boolean;
+        canScrollLeft(): boolean;
+        canScrollRight(): boolean;
+    }
+    export class ElementScrollController extends ScrollController {
+        el: HTMLElement;
+        constructor(el: HTMLElement);
+        getScrollTop(): number;
+        getScrollLeft(): number;
+        setScrollTop(top: number): void;
+        setScrollLeft(left: number): void;
+        getScrollWidth(): number;
+        getScrollHeight(): number;
+        getClientHeight(): number;
+        getClientWidth(): number;
+    }
+    export class WindowScrollController extends ScrollController {
+        getScrollTop(): number;
+        getScrollLeft(): number;
+        setScrollTop(n: number): void;
+        setScrollLeft(n: number): void;
+        getScrollWidth(): number;
+        getScrollHeight(): number;
+        getClientHeight(): number;
+        getClientWidth(): number;
+    }
+}
+
+declare module "@fullcalendar/core/common/ScrollComponent" {
+    import { ElementScrollController } from "@fullcalendar/core/common/scroll-controller";
+    export interface ScrollbarWidths {
+        left: number;
+        right: number;
+        bottom: number;
+    }
+    export { ScrollComponent as default, ScrollComponent };
+    class ScrollComponent extends ElementScrollController {
+        overflowX: string;
+        overflowY: string;
+        constructor(overflowX: string, overflowY: string);
+        clear(): void;
+        destroy(): void;
+        applyOverflow(): void;
+        lockOverflow(scrollbarWidths: ScrollbarWidths): void;
+        setHeight(height: number | string): void;
+        getScrollbarWidths(): ScrollbarWidths;
+    }
+}
+
+declare module "@fullcalendar/core/formatting-api" {
+    import { DateInput } from "@fullcalendar/core/datelib/env";
+    export function formatDate(dateInput: DateInput, settings?: {}): any;
+    export function formatRange(startInput: DateInput, endInput: DateInput, settings: any): any;
+}
+
+declare module "@fullcalendar/core/common/table-utils" {
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    import { ComponentContext } from "@fullcalendar/core/component/Component";
+    export function computeFallbackHeaderFormat(datesRepDistinctDays: boolean, dayCnt: number): {
+        weekday: string;
+        month?: undefined;
+        day?: undefined;
+        omitCommas?: undefined;
+    } | {
+        weekday: string;
+        month: string;
+        day: string;
+        omitCommas: boolean;
+    };
+    export function renderDateCell(dateMarker: DateMarker, dateProfile: DateProfile, datesRepDistinctDays: any, colCnt: any, colHeadFormat: any, context: ComponentContext, colspan?: any, otherAttrs?: any): string;
+}
+
+declare module "@fullcalendar/core/common/DayHeader" {
+    import Component, { ComponentContext } from "@fullcalendar/core/component/Component";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    export interface DayTableHeaderProps {
+        dates: DateMarker[];
+        dateProfile: DateProfile;
+        datesRepDistinctDays: boolean;
+        renderIntroHtml?: () => string;
+    }
+    export { DayHeader as default, DayHeader };
+    class DayHeader extends Component<DayTableHeaderProps> {
+        el: HTMLElement;
+        thead: HTMLElement;
+        constructor(context: ComponentContext, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: DayTableHeaderProps): void;
+    }
+}
+
+declare module "@fullcalendar/core/common/DaySeries" {
+    import DateProfileGenerator from "@fullcalendar/core/DateProfileGenerator";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    export interface DaySeriesSeg {
+        firstIndex: number;
+        lastIndex: number;
+        isStart: boolean;
+        isEnd: boolean;
+    }
+    export { DaySeries as default, DaySeries };
+    class DaySeries {
+        cnt: number;
+        dates: DateMarker[];
+        indices: number[];
+        constructor(range: DateRange, dateProfileGenerator: DateProfileGenerator);
+        sliceRange(range: DateRange): DaySeriesSeg | null;
+        private getDateDayIndex;
+    }
+}
+
+declare module "@fullcalendar/core/common/DayTable" {
+    import DaySeries from "@fullcalendar/core/common/DaySeries";
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    import { Seg } from "@fullcalendar/core/component/DateComponent";
+    export interface DayTableSeg extends Seg {
+        row: number;
+        firstCol: number;
+        lastCol: number;
+    }
+    export interface DayTableCell {
+        date: DateMarker;
+        htmlAttrs?: string;
+    }
+    export { DayTable as default, DayTable };
+    class DayTable {
+        rowCnt: number;
+        colCnt: number;
+        cells: DayTableCell[][];
+        headerDates: DateMarker[];
+        private daySeries;
+        constructor(daySeries: DaySeries, breakOnWeeks: boolean);
+        private buildCells;
+        private buildCell;
+        private buildHeaderDates;
+        sliceRange(range: DateRange): DayTableSeg[];
+    }
+}
+
+declare module "@fullcalendar/core/common/slicing-utils" {
+    import { DateRange } from "@fullcalendar/core/datelib/date-range";
+    import { EventStore } from "@fullcalendar/core/structs/event-store";
+    import { EventUiHash } from "@fullcalendar/core/component/event-ui";
+    import { DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    import DateComponent, { Seg, EventSegUiInteractionState } from "@fullcalendar/core/component/DateComponent";
+    import { DateSpan } from "@fullcalendar/core/structs/date-span";
+    import { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    import { Duration } from "@fullcalendar/core/datelib/duration";
+    import { DateMarker } from "@fullcalendar/core/datelib/marker";
+    export interface SliceableProps {
+        dateSelection: DateSpan;
+        businessHours: EventStore;
+        eventStore: EventStore;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+        eventSelection: string;
+        eventUiBases: EventUiHash;
+    }
+    export interface SlicedProps<SegType extends Seg> {
+        dateSelectionSegs: SegType[];
+        businessHourSegs: SegType[];
+        fgEventSegs: SegType[];
+        bgEventSegs: SegType[];
+        eventDrag: EventSegUiInteractionState | null;
+        eventResize: EventSegUiInteractionState | null;
+        eventSelection: string;
+    }
+    export { Slicer as default, Slicer };
+    abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []> {
+        private sliceBusinessHours;
+        private sliceDateSelection;
+        private sliceEventStore;
+        private sliceEventDrag;
+        private sliceEventResize;
+        abstract sliceRange(dateRange: DateRange, ...extraArgs: ExtraArgs): SegType[];
+        sliceProps(props: SliceableProps, dateProfile: DateProfile, nextDayThreshold: Duration | null, component: DateComponent<any>, // TODO: kill
+        ...extraArgs: ExtraArgs): SlicedProps<SegType>;
+        sliceNowDate(// does not memoize
+        date: DateMarker, component: DateComponent<any>, // TODO: kill
+        ...extraArgs: ExtraArgs): SegType[];
+        private _sliceBusinessHours;
+        private _sliceEventStore;
+        private _sliceInteraction;
+        private _sliceDateSpan;
+        private sliceEventRanges;
+        private sliceEventRange;
+    }
+}
+
+declare module "@fullcalendar/core" {
+    export const version = "<%= version %>";
+    export { OptionsInput } from "@fullcalendar/core/types/input-types";
+    export { EventInput, EventDef, EventDefHash, EventInstance, EventInstanceHash, parseEventDef, createEventInstance, EventTuple } from "@fullcalendar/core/structs/event";
+    export { BusinessHoursInput, parseBusinessHours } from "@fullcalendar/core/structs/business-hours";
+    export { applyAll, debounce, padStart, isInt, capitaliseFirstLetter, parseFieldSpecs, compareByFieldSpecs, compareByFieldSpec, flexibleCompare, computeVisibleDayRange, refineProps, freezeRaw, matchCellWidths, uncompensateScroll, compensateScroll, subtractInnerElHeight, isMultiDayRange, distributeHeight, undistributeHeight, preventSelection, allowSelection, preventContextMenu, allowContextMenu, compareNumbers, enableCursor, disableCursor, diffDates } from "@fullcalendar/core/util/misc";
+    export { htmlEscape, cssToStr } from "@fullcalendar/core/util/html";
+    export { removeExact, isArraysEqual } from "@fullcalendar/core/util/array";
+    export { memoize, memoizeOutput } from "@fullcalendar/core/util/memoize";
+    export { memoizeRendering, MemoizedRendering } from "@fullcalendar/core/component/memoized-rendering";
+    export { intersectRects, Rect, pointInsideRect, constrainPoint, getRectCenter, diffPoints, Point, translateRect } from "@fullcalendar/core/util/geom";
+    export { mapHash, filterHash } from "@fullcalendar/core/util/object";
+    export { isObjectsSimilar, isValuesSimilar } from "@fullcalendar/core/util/object-similarity";
+    export { findElements, findChildren, htmlToElement, createElement, insertAfterElement, prependToElement, removeElement, appendToElement, applyStyle, applyStyleProp, elementMatches, elementClosest, forceClassName } from "@fullcalendar/core/util/dom-manip";
+    export { EventStore, filterEventStoreDefs, createEmptyEventStore, mergeEventStores, getRelevantEvents, eventTupleToStore } from "@fullcalendar/core/structs/event-store";
+    export { EventUiHash, EventUi, processScopedUiProps, combineEventUis } from "@fullcalendar/core/component/event-ui";
+    export { default as Splitter, SplittableProps } from "@fullcalendar/core/component/event-splitting";
+    export { buildGotoAnchorHtml, getAllDayHtml, getDayClasses } from "@fullcalendar/core/component/date-rendering";
+    export { preventDefault, listenBySelector, whenTransitionDone } from "@fullcalendar/core/util/dom-event";
+    export { computeInnerRect, computeEdges, computeHeightAndMargins, getClippingParents, computeClippingRect, computeRect } from "@fullcalendar/core/util/dom-geom";
+    export { unpromisify } from "@fullcalendar/core/util/promise";
+    export { default as EmitterMixin, EmitterInterface } from "@fullcalendar/core/common/EmitterMixin";
+    export { DateRange, rangeContainsMarker, intersectRanges, rangesEqual, rangesIntersect, rangeContainsRange } from "@fullcalendar/core/datelib/date-range";
+    export { default as Mixin } from "@fullcalendar/core/common/Mixin";
+    export { default as PositionCache } from "@fullcalendar/core/common/PositionCache";
+    export { default as ScrollComponent, ScrollbarWidths } from "@fullcalendar/core/common/ScrollComponent";
+    export { ScrollController, ElementScrollController, WindowScrollController } from "@fullcalendar/core/common/scroll-controller";
+    export { default as Theme } from "@fullcalendar/core/theme/Theme";
+    export { default as Component, ComponentContext } from "@fullcalendar/core/component/Component";
+    export { default as DateComponent, Seg, EventSegUiInteractionState } from "@fullcalendar/core/component/DateComponent";
+    export { default as Calendar, DatePointTransform, DateSpanTransform, DateSelectionApi } from "@fullcalendar/core/Calendar";
+    export { default as View, ViewProps } from "@fullcalendar/core/View";
+    export { default as FgEventRenderer, buildSegCompareObj } from "@fullcalendar/core/component/renderers/FgEventRenderer";
+    export { default as FillRenderer } from "@fullcalendar/core/component/renderers/FillRenderer";
+    export { default as DateProfileGenerator, DateProfile } from "@fullcalendar/core/DateProfileGenerator";
+    export { ViewDef } from "@fullcalendar/core/structs/view-def";
+    export { ViewSpec } from "@fullcalendar/core/structs/view-spec";
+    export { DateSpan, DateSpanApi, DatePointApi, isDateSpansEqual } from "@fullcalendar/core/structs/date-span";
+    export { DateMarker, addDays, startOfDay, addMs, addWeeks, diffWeeks, diffWholeWeeks, diffWholeDays, diffDayAndTime, diffDays, isValidDate } from "@fullcalendar/core/datelib/marker";
+    export { Duration, createDuration, isSingleDay, multiplyDuration, addDurations, asRoughMinutes, asRoughSeconds, asRoughMs, wholeDivideDurations, greatestDurationDenominator } from "@fullcalendar/core/datelib/duration";
+    export { DateEnv, DateMarkerMeta } from "@fullcalendar/core/datelib/env";
+    export { DateFormatter, createFormatter, VerboseFormattingArg, formatIsoTimeString } from "@fullcalendar/core/datelib/formatting";
+    export { NamedTimeZoneImpl } from "@fullcalendar/core/datelib/timezone";
+    export { parse as parseMarker } from "@fullcalendar/core/datelib/parsing";
+    export { EventSourceDef, EventSource, EventSourceHash } from "@fullcalendar/core/structs/event-source";
+    export { Interaction, InteractionSettings, interactionSettingsToStore, interactionSettingsStore, InteractionSettingsStore } from "@fullcalendar/core/interactions/interaction";
+    export { PointerDragEvent } from "@fullcalendar/core/interactions/pointer";
+    export { Hit } from "@fullcalendar/core/interactions/hit";
+    export { dateSelectionJoinTransformer } from "@fullcalendar/core/interactions/date-selecting";
+    export { eventDragMutationMassager } from "@fullcalendar/core/interactions/event-dragging";
+    export { EventResizeJoinTransforms } from "@fullcalendar/core/interactions/event-resizing";
+    export { default as ElementDragging } from "@fullcalendar/core/interactions/ElementDragging";
+    export { formatDate, formatRange } from "@fullcalendar/core/formatting-api";
+    export { globalDefaults, config } from "@fullcalendar/core/options";
+    export { RecurringType, ParsedRecurring } from "@fullcalendar/core/structs/recurring-event";
+    export { DragMetaInput, DragMeta, parseDragMeta } from "@fullcalendar/core/structs/drag-meta";
+    export { createPlugin, PluginDef, PluginDefInput, ViewPropsTransformer, ViewContainerModifier } from "@fullcalendar/core/plugin-system";
+    export { reducerFunc, Action, CalendarState } from "@fullcalendar/core/reducers/types";
+    export { CalendarComponentProps } from "@fullcalendar/core/CalendarComponent";
+    export { default as DayHeader } from "@fullcalendar/core/common/DayHeader";
+    export { computeFallbackHeaderFormat, renderDateCell } from "@fullcalendar/core/common/table-utils";
+    export { default as DaySeries } from "@fullcalendar/core/common/DaySeries";
+    export { EventInteractionState } from "@fullcalendar/core/interactions/event-interaction-state";
+    export { EventRenderRange, sliceEventStore, hasBgRendering, getElSeg } from "@fullcalendar/core/component/event-rendering";
+    export { default as DayTable, DayTableSeg, DayTableCell } from "@fullcalendar/core/common/DayTable";
+    export { default as Slicer, SlicedProps } from "@fullcalendar/core/common/slicing-utils";
+    export { EventMutation, applyMutationToEventStore } from "@fullcalendar/core/structs/event-mutation";
+    export { Constraint, ConstraintInput, AllowFunc, isPropsValid, isInteractionValid } from "@fullcalendar/core/validation";
+    export { default as EventApi } from "@fullcalendar/core/api/EventApi";
+    export { default as requestJson } from "@fullcalendar/core/util/requestJson";
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/core/main.js b/backoffice/vendors/fullcalendar/core/main.js
new file mode 100644 (file)
index 0000000..82da13e
--- /dev/null
@@ -0,0 +1,8802 @@
+/*!
+FullCalendar Core Package v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+    typeof define === 'function' && define.amd ? define(['exports'], factory) :
+    (global = global || self, factory(global.FullCalendar = {}));
+}(this, function (exports) { 'use strict';
+
+    // Creating
+    // ----------------------------------------------------------------------------------------------------------------
+    var elementPropHash = {
+        className: true,
+        colSpan: true,
+        rowSpan: true
+    };
+    var containerTagHash = {
+        '<tr': 'tbody',
+        '<td': 'tr'
+    };
+    function createElement(tagName, attrs, content) {
+        var el = document.createElement(tagName);
+        if (attrs) {
+            for (var attrName in attrs) {
+                if (attrName === 'style') {
+                    applyStyle(el, attrs[attrName]);
+                }
+                else if (elementPropHash[attrName]) {
+                    el[attrName] = attrs[attrName];
+                }
+                else {
+                    el.setAttribute(attrName, attrs[attrName]);
+                }
+            }
+        }
+        if (typeof content === 'string') {
+            el.innerHTML = content; // shortcut. no need to process HTML in any way
+        }
+        else if (content != null) {
+            appendToElement(el, content);
+        }
+        return el;
+    }
+    function htmlToElement(html) {
+        html = html.trim();
+        var container = document.createElement(computeContainerTag(html));
+        container.innerHTML = html;
+        return container.firstChild;
+    }
+    function htmlToElements(html) {
+        return Array.prototype.slice.call(htmlToNodeList(html));
+    }
+    function htmlToNodeList(html) {
+        html = html.trim();
+        var container = document.createElement(computeContainerTag(html));
+        container.innerHTML = html;
+        return container.childNodes;
+    }
+    // assumes html already trimmed and tag names are lowercase
+    function computeContainerTag(html) {
+        return containerTagHash[html.substr(0, 3) // faster than using regex
+        ] || 'div';
+    }
+    function appendToElement(el, content) {
+        var childNodes = normalizeContent(content);
+        for (var i = 0; i < childNodes.length; i++) {
+            el.appendChild(childNodes[i]);
+        }
+    }
+    function prependToElement(parent, content) {
+        var newEls = normalizeContent(content);
+        var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
+        for (var i = 0; i < newEls.length; i++) {
+            parent.insertBefore(newEls[i], afterEl);
+        }
+    }
+    function insertAfterElement(refEl, content) {
+        var newEls = normalizeContent(content);
+        var afterEl = refEl.nextSibling || null;
+        for (var i = 0; i < newEls.length; i++) {
+            refEl.parentNode.insertBefore(newEls[i], afterEl);
+        }
+    }
+    function normalizeContent(content) {
+        var els;
+        if (typeof content === 'string') {
+            els = htmlToElements(content);
+        }
+        else if (content instanceof Node) {
+            els = [content];
+        }
+        else { // Node[] or NodeList
+            els = Array.prototype.slice.call(content);
+        }
+        return els;
+    }
+    function removeElement(el) {
+        if (el.parentNode) {
+            el.parentNode.removeChild(el);
+        }
+    }
+    // Querying
+    // ----------------------------------------------------------------------------------------------------------------
+    // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
+    var matchesMethod = Element.prototype.matches ||
+        Element.prototype.matchesSelector ||
+        Element.prototype.msMatchesSelector;
+    var closestMethod = Element.prototype.closest || function (selector) {
+        // polyfill
+        var el = this;
+        if (!document.documentElement.contains(el)) {
+            return null;
+        }
+        do {
+            if (elementMatches(el, selector)) {
+                return el;
+            }
+            el = el.parentElement || el.parentNode;
+        } while (el !== null && el.nodeType === 1);
+        return null;
+    };
+    function elementClosest(el, selector) {
+        return closestMethod.call(el, selector);
+    }
+    function elementMatches(el, selector) {
+        return matchesMethod.call(el, selector);
+    }
+    // accepts multiple subject els
+    // returns a real array. good for methods like forEach
+    function findElements(container, selector) {
+        var containers = container instanceof HTMLElement ? [container] : container;
+        var allMatches = [];
+        for (var i = 0; i < containers.length; i++) {
+            var matches = containers[i].querySelectorAll(selector);
+            for (var j = 0; j < matches.length; j++) {
+                allMatches.push(matches[j]);
+            }
+        }
+        return allMatches;
+    }
+    // accepts multiple subject els
+    // only queries direct child elements
+    function findChildren(parent, selector) {
+        var parents = parent instanceof HTMLElement ? [parent] : parent;
+        var allMatches = [];
+        for (var i = 0; i < parents.length; i++) {
+            var childNodes = parents[i].children; // only ever elements
+            for (var j = 0; j < childNodes.length; j++) {
+                var childNode = childNodes[j];
+                if (!selector || elementMatches(childNode, selector)) {
+                    allMatches.push(childNode);
+                }
+            }
+        }
+        return allMatches;
+    }
+    // Attributes
+    // ----------------------------------------------------------------------------------------------------------------
+    function forceClassName(el, className, bool) {
+        if (bool) {
+            el.classList.add(className);
+        }
+        else {
+            el.classList.remove(className);
+        }
+    }
+    // Style
+    // ----------------------------------------------------------------------------------------------------------------
+    var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
+    function applyStyle(el, props) {
+        for (var propName in props) {
+            applyStyleProp(el, propName, props[propName]);
+        }
+    }
+    function applyStyleProp(el, name, val) {
+        if (val == null) {
+            el.style[name] = '';
+        }
+        else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
+            el.style[name] = val + 'px';
+        }
+        else {
+            el.style[name] = val;
+        }
+    }
+
+    function pointInsideRect(point, rect) {
+        return point.left >= rect.left &&
+            point.left < rect.right &&
+            point.top >= rect.top &&
+            point.top < rect.bottom;
+    }
+    // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
+    function intersectRects(rect1, rect2) {
+        var res = {
+            left: Math.max(rect1.left, rect2.left),
+            right: Math.min(rect1.right, rect2.right),
+            top: Math.max(rect1.top, rect2.top),
+            bottom: Math.min(rect1.bottom, rect2.bottom)
+        };
+        if (res.left < res.right && res.top < res.bottom) {
+            return res;
+        }
+        return false;
+    }
+    function translateRect(rect, deltaX, deltaY) {
+        return {
+            left: rect.left + deltaX,
+            right: rect.right + deltaX,
+            top: rect.top + deltaY,
+            bottom: rect.bottom + deltaY
+        };
+    }
+    // Returns a new point that will have been moved to reside within the given rectangle
+    function constrainPoint(point, rect) {
+        return {
+            left: Math.min(Math.max(point.left, rect.left), rect.right),
+            top: Math.min(Math.max(point.top, rect.top), rect.bottom)
+        };
+    }
+    // Returns a point that is the center of the given rectangle
+    function getRectCenter(rect) {
+        return {
+            left: (rect.left + rect.right) / 2,
+            top: (rect.top + rect.bottom) / 2
+        };
+    }
+    // Subtracts point2's coordinates from point1's coordinates, returning a delta
+    function diffPoints(point1, point2) {
+        return {
+            left: point1.left - point2.left,
+            top: point1.top - point2.top
+        };
+    }
+
+    // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
+    var isRtlScrollbarOnLeft = null;
+    function getIsRtlScrollbarOnLeft() {
+        if (isRtlScrollbarOnLeft === null) {
+            isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
+        }
+        return isRtlScrollbarOnLeft;
+    }
+    function computeIsRtlScrollbarOnLeft() {
+        var outerEl = createElement('div', {
+            style: {
+                position: 'absolute',
+                top: -1000,
+                left: 0,
+                border: 0,
+                padding: 0,
+                overflow: 'scroll',
+                direction: 'rtl'
+            }
+        }, '<div></div>');
+        document.body.appendChild(outerEl);
+        var innerEl = outerEl.firstChild;
+        var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
+        removeElement(outerEl);
+        return res;
+    }
+    // The scrollbar width computations in computeEdges are sometimes flawed when it comes to
+    // retina displays, rounding, and IE11. Massage them into a usable value.
+    function sanitizeScrollbarWidth(width) {
+        width = Math.max(0, width); // no negatives
+        width = Math.round(width);
+        return width;
+    }
+
+    function computeEdges(el, getPadding) {
+        if (getPadding === void 0) { getPadding = false; }
+        var computedStyle = window.getComputedStyle(el);
+        var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
+        var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
+        var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
+        var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
+        var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
+        var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
+        var res = {
+            borderLeft: borderLeft,
+            borderRight: borderRight,
+            borderTop: borderTop,
+            borderBottom: borderBottom,
+            scrollbarBottom: scrollbarBottom,
+            scrollbarLeft: 0,
+            scrollbarRight: 0
+        };
+        if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
+            res.scrollbarLeft = scrollbarLeftRight;
+        }
+        else {
+            res.scrollbarRight = scrollbarLeftRight;
+        }
+        if (getPadding) {
+            res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
+            res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
+            res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
+            res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
+        }
+        return res;
+    }
+    function computeInnerRect(el, goWithinPadding) {
+        if (goWithinPadding === void 0) { goWithinPadding = false; }
+        var outerRect = computeRect(el);
+        var edges = computeEdges(el, goWithinPadding);
+        var res = {
+            left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
+            right: outerRect.right - edges.borderRight - edges.scrollbarRight,
+            top: outerRect.top + edges.borderTop,
+            bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
+        };
+        if (goWithinPadding) {
+            res.left += edges.paddingLeft;
+            res.right -= edges.paddingRight;
+            res.top += edges.paddingTop;
+            res.bottom -= edges.paddingBottom;
+        }
+        return res;
+    }
+    function computeRect(el) {
+        var rect = el.getBoundingClientRect();
+        return {
+            left: rect.left + window.pageXOffset,
+            top: rect.top + window.pageYOffset,
+            right: rect.right + window.pageXOffset,
+            bottom: rect.bottom + window.pageYOffset
+        };
+    }
+    function computeViewportRect() {
+        return {
+            left: window.pageXOffset,
+            right: window.pageXOffset + document.documentElement.clientWidth,
+            top: window.pageYOffset,
+            bottom: window.pageYOffset + document.documentElement.clientHeight
+        };
+    }
+    function computeHeightAndMargins(el) {
+        var computed = window.getComputedStyle(el);
+        return el.getBoundingClientRect().height +
+            parseInt(computed.marginTop, 10) +
+            parseInt(computed.marginBottom, 10);
+    }
+    // does not return window
+    function getClippingParents(el) {
+        var parents = [];
+        while (el instanceof HTMLElement) { // will stop when gets to document or null
+            var computedStyle = window.getComputedStyle(el);
+            if (computedStyle.position === 'fixed') {
+                break;
+            }
+            if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
+                parents.push(el);
+            }
+            el = el.parentNode;
+        }
+        return parents;
+    }
+    function computeClippingRect(el) {
+        return getClippingParents(el)
+            .map(function (el) {
+            return computeInnerRect(el);
+        })
+            .concat(computeViewportRect())
+            .reduce(function (rect0, rect1) {
+            return intersectRects(rect0, rect1) || rect1; // should always intersect
+        });
+    }
+
+    // Stops a mouse/touch event from doing it's native browser action
+    function preventDefault(ev) {
+        ev.preventDefault();
+    }
+    // Event Delegation
+    // ----------------------------------------------------------------------------------------------------------------
+    function listenBySelector(container, eventType, selector, handler) {
+        function realHandler(ev) {
+            var matchedChild = elementClosest(ev.target, selector);
+            if (matchedChild) {
+                handler.call(matchedChild, ev, matchedChild);
+            }
+        }
+        container.addEventListener(eventType, realHandler);
+        return function () {
+            container.removeEventListener(eventType, realHandler);
+        };
+    }
+    function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
+        var currentMatchedChild;
+        return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
+            if (matchedChild !== currentMatchedChild) {
+                currentMatchedChild = matchedChild;
+                onMouseEnter(ev, matchedChild);
+                var realOnMouseLeave_1 = function (ev) {
+                    currentMatchedChild = null;
+                    onMouseLeave(ev, matchedChild);
+                    matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
+                };
+                // listen to the next mouseleave, and then unattach
+                matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
+            }
+        });
+    }
+    // Animation
+    // ----------------------------------------------------------------------------------------------------------------
+    var transitionEventNames = [
+        'webkitTransitionEnd',
+        'otransitionend',
+        'oTransitionEnd',
+        'msTransitionEnd',
+        'transitionend'
+    ];
+    // triggered only when the next single subsequent transition finishes
+    function whenTransitionDone(el, callback) {
+        var realCallback = function (ev) {
+            callback(ev);
+            transitionEventNames.forEach(function (eventName) {
+                el.removeEventListener(eventName, realCallback);
+            });
+        };
+        transitionEventNames.forEach(function (eventName) {
+            el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
+        });
+    }
+
+    var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
+    // Adding
+    function addWeeks(m, n) {
+        var a = dateToUtcArray(m);
+        a[2] += n * 7;
+        return arrayToUtcDate(a);
+    }
+    function addDays(m, n) {
+        var a = dateToUtcArray(m);
+        a[2] += n;
+        return arrayToUtcDate(a);
+    }
+    function addMs(m, n) {
+        var a = dateToUtcArray(m);
+        a[6] += n;
+        return arrayToUtcDate(a);
+    }
+    // Diffing (all return floats)
+    function diffWeeks(m0, m1) {
+        return diffDays(m0, m1) / 7;
+    }
+    function diffDays(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
+    }
+    function diffHours(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
+    }
+    function diffMinutes(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
+    }
+    function diffSeconds(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / 1000;
+    }
+    function diffDayAndTime(m0, m1) {
+        var m0day = startOfDay(m0);
+        var m1day = startOfDay(m1);
+        return {
+            years: 0,
+            months: 0,
+            days: Math.round(diffDays(m0day, m1day)),
+            milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
+        };
+    }
+    // Diffing Whole Units
+    function diffWholeWeeks(m0, m1) {
+        var d = diffWholeDays(m0, m1);
+        if (d !== null && d % 7 === 0) {
+            return d / 7;
+        }
+        return null;
+    }
+    function diffWholeDays(m0, m1) {
+        if (timeAsMs(m0) === timeAsMs(m1)) {
+            return Math.round(diffDays(m0, m1));
+        }
+        return null;
+    }
+    // Start-Of
+    function startOfDay(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate()
+        ]);
+    }
+    function startOfHour(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate(),
+            m.getUTCHours()
+        ]);
+    }
+    function startOfMinute(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate(),
+            m.getUTCHours(),
+            m.getUTCMinutes()
+        ]);
+    }
+    function startOfSecond(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate(),
+            m.getUTCHours(),
+            m.getUTCMinutes(),
+            m.getUTCSeconds()
+        ]);
+    }
+    // Week Computation
+    function weekOfYear(marker, dow, doy) {
+        var y = marker.getUTCFullYear();
+        var w = weekOfGivenYear(marker, y, dow, doy);
+        if (w < 1) {
+            return weekOfGivenYear(marker, y - 1, dow, doy);
+        }
+        var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
+        if (nextW >= 1) {
+            return Math.min(w, nextW);
+        }
+        return w;
+    }
+    function weekOfGivenYear(marker, year, dow, doy) {
+        var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
+        var dayStart = startOfDay(marker);
+        var days = Math.round(diffDays(firstWeekStart, dayStart));
+        return Math.floor(days / 7) + 1; // zero-indexed
+    }
+    // start-of-first-week - start-of-year
+    function firstWeekOffset(year, dow, doy) {
+        // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+        var fwd = 7 + dow - doy;
+        // first-week day local weekday -- which local weekday is fwd
+        var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
+        return -fwdlw + fwd - 1;
+    }
+    // Array Conversion
+    function dateToLocalArray(date) {
+        return [
+            date.getFullYear(),
+            date.getMonth(),
+            date.getDate(),
+            date.getHours(),
+            date.getMinutes(),
+            date.getSeconds(),
+            date.getMilliseconds()
+        ];
+    }
+    function arrayToLocalDate(a) {
+        return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
+        a[3] || 0, a[4] || 0, a[5] || 0);
+    }
+    function dateToUtcArray(date) {
+        return [
+            date.getUTCFullYear(),
+            date.getUTCMonth(),
+            date.getUTCDate(),
+            date.getUTCHours(),
+            date.getUTCMinutes(),
+            date.getUTCSeconds(),
+            date.getUTCMilliseconds()
+        ];
+    }
+    function arrayToUtcDate(a) {
+        // according to web standards (and Safari), a month index is required.
+        // massage if only given a year.
+        if (a.length === 1) {
+            a = a.concat([0]);
+        }
+        return new Date(Date.UTC.apply(Date, a));
+    }
+    // Other Utils
+    function isValidDate(m) {
+        return !isNaN(m.valueOf());
+    }
+    function timeAsMs(m) {
+        return m.getUTCHours() * 1000 * 60 * 60 +
+            m.getUTCMinutes() * 1000 * 60 +
+            m.getUTCSeconds() * 1000 +
+            m.getUTCMilliseconds();
+    }
+
+    var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
+    var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
+    // Parsing and Creation
+    function createDuration(input, unit) {
+        var _a;
+        if (typeof input === 'string') {
+            return parseString(input);
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            return normalizeObject(input);
+        }
+        else if (typeof input === 'number') {
+            return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
+        }
+        else {
+            return null;
+        }
+    }
+    function parseString(s) {
+        var m = PARSE_RE.exec(s);
+        if (m) {
+            var sign = m[1] ? -1 : 1;
+            return {
+                years: 0,
+                months: 0,
+                days: sign * (m[2] ? parseInt(m[2], 10) : 0),
+                milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
+                    (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
+                    (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
+                    (m[6] ? parseInt(m[6], 10) : 0) // ms
+                )
+            };
+        }
+        return null;
+    }
+    function normalizeObject(obj) {
+        return {
+            years: obj.years || obj.year || 0,
+            months: obj.months || obj.month || 0,
+            days: (obj.days || obj.day || 0) +
+                getWeeksFromInput(obj) * 7,
+            milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
+                (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
+                (obj.seconds || obj.second || 0) * 1000 + // seconds
+                (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
+        };
+    }
+    function getWeeksFromInput(obj) {
+        return obj.weeks || obj.week || 0;
+    }
+    // Equality
+    function durationsEqual(d0, d1) {
+        return d0.years === d1.years &&
+            d0.months === d1.months &&
+            d0.days === d1.days &&
+            d0.milliseconds === d1.milliseconds;
+    }
+    function isSingleDay(dur) {
+        return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
+    }
+    // Simple Math
+    function addDurations(d0, d1) {
+        return {
+            years: d0.years + d1.years,
+            months: d0.months + d1.months,
+            days: d0.days + d1.days,
+            milliseconds: d0.milliseconds + d1.milliseconds
+        };
+    }
+    function subtractDurations(d1, d0) {
+        return {
+            years: d1.years - d0.years,
+            months: d1.months - d0.months,
+            days: d1.days - d0.days,
+            milliseconds: d1.milliseconds - d0.milliseconds
+        };
+    }
+    function multiplyDuration(d, n) {
+        return {
+            years: d.years * n,
+            months: d.months * n,
+            days: d.days * n,
+            milliseconds: d.milliseconds * n
+        };
+    }
+    // Conversions
+    // "Rough" because they are based on average-case Gregorian months/years
+    function asRoughYears(dur) {
+        return asRoughDays(dur) / 365;
+    }
+    function asRoughMonths(dur) {
+        return asRoughDays(dur) / 30;
+    }
+    function asRoughDays(dur) {
+        return asRoughMs(dur) / 864e5;
+    }
+    function asRoughMinutes(dur) {
+        return asRoughMs(dur) / (1000 * 60);
+    }
+    function asRoughSeconds(dur) {
+        return asRoughMs(dur) / 1000;
+    }
+    function asRoughMs(dur) {
+        return dur.years * (365 * 864e5) +
+            dur.months * (30 * 864e5) +
+            dur.days * 864e5 +
+            dur.milliseconds;
+    }
+    // Advanced Math
+    function wholeDivideDurations(numerator, denominator) {
+        var res = null;
+        for (var i = 0; i < INTERNAL_UNITS.length; i++) {
+            var unit = INTERNAL_UNITS[i];
+            if (denominator[unit]) {
+                var localRes = numerator[unit] / denominator[unit];
+                if (!isInt(localRes) || (res !== null && res !== localRes)) {
+                    return null;
+                }
+                res = localRes;
+            }
+            else if (numerator[unit]) {
+                // needs to divide by something but can't!
+                return null;
+            }
+        }
+        return res;
+    }
+    function greatestDurationDenominator(dur, dontReturnWeeks) {
+        var ms = dur.milliseconds;
+        if (ms) {
+            if (ms % 1000 !== 0) {
+                return { unit: 'millisecond', value: ms };
+            }
+            if (ms % (1000 * 60) !== 0) {
+                return { unit: 'second', value: ms / 1000 };
+            }
+            if (ms % (1000 * 60 * 60) !== 0) {
+                return { unit: 'minute', value: ms / (1000 * 60) };
+            }
+            if (ms) {
+                return { unit: 'hour', value: ms / (1000 * 60 * 60) };
+            }
+        }
+        if (dur.days) {
+            if (!dontReturnWeeks && dur.days % 7 === 0) {
+                return { unit: 'week', value: dur.days / 7 };
+            }
+            return { unit: 'day', value: dur.days };
+        }
+        if (dur.months) {
+            return { unit: 'month', value: dur.months };
+        }
+        if (dur.years) {
+            return { unit: 'year', value: dur.years };
+        }
+        return { unit: 'millisecond', value: 0 };
+    }
+
+    /* FullCalendar-specific DOM Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
+    // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
+    function compensateScroll(rowEl, scrollbarWidths) {
+        if (scrollbarWidths.left) {
+            applyStyle(rowEl, {
+                borderLeftWidth: 1,
+                marginLeft: scrollbarWidths.left - 1
+            });
+        }
+        if (scrollbarWidths.right) {
+            applyStyle(rowEl, {
+                borderRightWidth: 1,
+                marginRight: scrollbarWidths.right - 1
+            });
+        }
+    }
+    // Undoes compensateScroll and restores all borders/margins
+    function uncompensateScroll(rowEl) {
+        applyStyle(rowEl, {
+            marginLeft: '',
+            marginRight: '',
+            borderLeftWidth: '',
+            borderRightWidth: ''
+        });
+    }
+    // Make the mouse cursor express that an event is not allowed in the current area
+    function disableCursor() {
+        document.body.classList.add('fc-not-allowed');
+    }
+    // Returns the mouse cursor to its original look
+    function enableCursor() {
+        document.body.classList.remove('fc-not-allowed');
+    }
+    // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
+    // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
+    // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
+    // reduces the available height.
+    function distributeHeight(els, availableHeight, shouldRedistribute) {
+        // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
+        // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
+        var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
+        var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
+        var flexEls = []; // elements that are allowed to expand. array of DOM nodes
+        var flexOffsets = []; // amount of vertical space it takes up
+        var flexHeights = []; // actual css height
+        var usedHeight = 0;
+        undistributeHeight(els); // give all elements their natural height
+        // find elements that are below the recommended height (expandable).
+        // important to query for heights in a single first pass (to avoid reflow oscillation).
+        els.forEach(function (el, i) {
+            var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
+            var naturalOffset = computeHeightAndMargins(el);
+            if (naturalOffset < minOffset) {
+                flexEls.push(el);
+                flexOffsets.push(naturalOffset);
+                flexHeights.push(el.offsetHeight);
+            }
+            else {
+                // this element stretches past recommended height (non-expandable). mark the space as occupied.
+                usedHeight += naturalOffset;
+            }
+        });
+        // readjust the recommended height to only consider the height available to non-maxed-out rows.
+        if (shouldRedistribute) {
+            availableHeight -= usedHeight;
+            minOffset1 = Math.floor(availableHeight / flexEls.length);
+            minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
+        }
+        // assign heights to all expandable elements
+        flexEls.forEach(function (el, i) {
+            var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
+            var naturalOffset = flexOffsets[i];
+            var naturalHeight = flexHeights[i];
+            var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
+            if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
+                el.style.height = newHeight + 'px';
+            }
+        });
+    }
+    // Undoes distrubuteHeight, restoring all els to their natural height
+    function undistributeHeight(els) {
+        els.forEach(function (el) {
+            el.style.height = '';
+        });
+    }
+    // Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
+    // cells to be that width.
+    // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
+    function matchCellWidths(els) {
+        var maxInnerWidth = 0;
+        els.forEach(function (el) {
+            var innerEl = el.firstChild; // hopefully an element
+            if (innerEl instanceof HTMLElement) {
+                var innerWidth_1 = innerEl.offsetWidth;
+                if (innerWidth_1 > maxInnerWidth) {
+                    maxInnerWidth = innerWidth_1;
+                }
+            }
+        });
+        maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
+        els.forEach(function (el) {
+            el.style.width = maxInnerWidth + 'px';
+        });
+        return maxInnerWidth;
+    }
+    // Given one element that resides inside another,
+    // Subtracts the height of the inner element from the outer element.
+    function subtractInnerElHeight(outerEl, innerEl) {
+        // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
+        var reflowStyleProps = {
+            position: 'relative',
+            left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
+        };
+        applyStyle(outerEl, reflowStyleProps);
+        applyStyle(innerEl, reflowStyleProps);
+        var diff = outerEl.offsetHeight - innerEl.offsetHeight; // grab the dimensions
+        // undo hack
+        var resetStyleProps = { position: '', left: '' };
+        applyStyle(outerEl, resetStyleProps);
+        applyStyle(innerEl, resetStyleProps);
+        return diff;
+    }
+    /* Selection
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function preventSelection(el) {
+        el.classList.add('fc-unselectable');
+        el.addEventListener('selectstart', preventDefault);
+    }
+    function allowSelection(el) {
+        el.classList.remove('fc-unselectable');
+        el.removeEventListener('selectstart', preventDefault);
+    }
+    /* Context Menu
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function preventContextMenu(el) {
+        el.addEventListener('contextmenu', preventDefault);
+    }
+    function allowContextMenu(el) {
+        el.removeEventListener('contextmenu', preventDefault);
+    }
+    /* Object Ordering by Field
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function parseFieldSpecs(input) {
+        var specs = [];
+        var tokens = [];
+        var i;
+        var token;
+        if (typeof input === 'string') {
+            tokens = input.split(/\s*,\s*/);
+        }
+        else if (typeof input === 'function') {
+            tokens = [input];
+        }
+        else if (Array.isArray(input)) {
+            tokens = input;
+        }
+        for (i = 0; i < tokens.length; i++) {
+            token = tokens[i];
+            if (typeof token === 'string') {
+                specs.push(token.charAt(0) === '-' ?
+                    { field: token.substring(1), order: -1 } :
+                    { field: token, order: 1 });
+            }
+            else if (typeof token === 'function') {
+                specs.push({ func: token });
+            }
+        }
+        return specs;
+    }
+    function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
+        var i;
+        var cmp;
+        for (i = 0; i < fieldSpecs.length; i++) {
+            cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
+            if (cmp) {
+                return cmp;
+            }
+        }
+        return 0;
+    }
+    function compareByFieldSpec(obj0, obj1, fieldSpec) {
+        if (fieldSpec.func) {
+            return fieldSpec.func(obj0, obj1);
+        }
+        return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
+            * (fieldSpec.order || 1);
+    }
+    function flexibleCompare(a, b) {
+        if (!a && !b) {
+            return 0;
+        }
+        if (b == null) {
+            return -1;
+        }
+        if (a == null) {
+            return 1;
+        }
+        if (typeof a === 'string' || typeof b === 'string') {
+            return String(a).localeCompare(String(b));
+        }
+        return a - b;
+    }
+    /* String Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function capitaliseFirstLetter(str) {
+        return str.charAt(0).toUpperCase() + str.slice(1);
+    }
+    function padStart(val, len) {
+        var s = String(val);
+        return '000'.substr(0, len - s.length) + s;
+    }
+    /* Number Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function compareNumbers(a, b) {
+        return a - b;
+    }
+    function isInt(n) {
+        return n % 1 === 0;
+    }
+    /* Weird Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function applyAll(functions, thisObj, args) {
+        if (typeof functions === 'function') { // supplied a single function
+            functions = [functions];
+        }
+        if (functions) {
+            var i = void 0;
+            var ret = void 0;
+            for (i = 0; i < functions.length; i++) {
+                ret = functions[i].apply(thisObj, args) || ret;
+            }
+            return ret;
+        }
+    }
+    function firstDefined() {
+        var args = [];
+        for (var _i = 0; _i < arguments.length; _i++) {
+            args[_i] = arguments[_i];
+        }
+        for (var i = 0; i < args.length; i++) {
+            if (args[i] !== undefined) {
+                return args[i];
+            }
+        }
+    }
+    // Returns a function, that, as long as it continues to be invoked, will not
+    // be triggered. The function will be called after it stops being called for
+    // N milliseconds. If `immediate` is passed, trigger the function on the
+    // leading edge, instead of the trailing.
+    // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
+    function debounce(func, wait) {
+        var timeout;
+        var args;
+        var context;
+        var timestamp;
+        var result;
+        var later = function () {
+            var last = new Date().valueOf() - timestamp;
+            if (last < wait) {
+                timeout = setTimeout(later, wait - last);
+            }
+            else {
+                timeout = null;
+                result = func.apply(context, args);
+                context = args = null;
+            }
+        };
+        return function () {
+            context = this;
+            args = arguments;
+            timestamp = new Date().valueOf();
+            if (!timeout) {
+                timeout = setTimeout(later, wait);
+            }
+            return result;
+        };
+    }
+    // Number and Boolean are only types that defaults or not computed for
+    // TODO: write more comments
+    function refineProps(rawProps, processors, defaults, leftoverProps) {
+        if (defaults === void 0) { defaults = {}; }
+        var refined = {};
+        for (var key in processors) {
+            var processor = processors[key];
+            if (rawProps[key] !== undefined) {
+                // found
+                if (processor === Function) {
+                    refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
+                }
+                else if (processor) { // a refining function?
+                    refined[key] = processor(rawProps[key]);
+                }
+                else {
+                    refined[key] = rawProps[key];
+                }
+            }
+            else if (defaults[key] !== undefined) {
+                // there's an explicit default
+                refined[key] = defaults[key];
+            }
+            else {
+                // must compute a default
+                if (processor === String) {
+                    refined[key] = ''; // empty string is default for String
+                }
+                else if (!processor || processor === Number || processor === Boolean || processor === Function) {
+                    refined[key] = null; // assign null for other non-custom processor funcs
+                }
+                else {
+                    refined[key] = processor(null); // run the custom processor func
+                }
+            }
+        }
+        if (leftoverProps) {
+            for (var key in rawProps) {
+                if (processors[key] === undefined) {
+                    leftoverProps[key] = rawProps[key];
+                }
+            }
+        }
+        return refined;
+    }
+    /*
+    Get a snapshot of an object, so we can compare it to later revisions.
+    Intentionally only works with arrays, jaja
+    */
+    function freezeRaw(raw) {
+        if (Array.isArray(raw)) {
+            return Array.prototype.slice.call(raw);
+        }
+        return raw;
+    }
+    /* Date stuff that doesn't belong in datelib core
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // given a timed range, computes an all-day range that has the same exact duration,
+    // but whose start time is aligned with the start of the day.
+    function computeAlignedDayRange(timedRange) {
+        var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
+        var start = startOfDay(timedRange.start);
+        var end = addDays(start, dayCnt);
+        return { start: start, end: end };
+    }
+    // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
+    // TODO: give nextDayThreshold a default arg
+    function computeVisibleDayRange(timedRange, nextDayThreshold) {
+        if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
+        var startDay = null;
+        var endDay = null;
+        if (timedRange.end) {
+            endDay = startOfDay(timedRange.end);
+            var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
+            // If the end time is actually inclusively part of the next day and is equal to or
+            // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
+            // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
+            if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
+                endDay = addDays(endDay, 1);
+            }
+        }
+        if (timedRange.start) {
+            startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
+            // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
+            if (endDay && endDay <= startDay) {
+                endDay = addDays(startDay, 1);
+            }
+        }
+        return { start: startDay, end: endDay };
+    }
+    // spans from one day into another?
+    function isMultiDayRange(range) {
+        var visibleRange = computeVisibleDayRange(range);
+        return diffDays(visibleRange.start, visibleRange.end) > 1;
+    }
+    function diffDates(date0, date1, dateEnv, largeUnit) {
+        if (largeUnit === 'year') {
+            return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
+        }
+        else if (largeUnit === 'month') {
+            return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
+        }
+        else {
+            return diffDayAndTime(date0, date1); // returns a duration
+        }
+    }
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
+        for (var i = 0; i < recurringTypes.length; i++) {
+            var localLeftovers = {};
+            var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
+            if (parsed) {
+                var allDay = localLeftovers.allDay;
+                delete localLeftovers.allDay; // remove from leftovers
+                if (allDay == null) {
+                    allDay = allDayDefault;
+                    if (allDay == null) {
+                        allDay = parsed.allDayGuess;
+                        if (allDay == null) {
+                            allDay = false;
+                        }
+                    }
+                }
+                __assign(leftovers, localLeftovers);
+                return {
+                    allDay: allDay,
+                    duration: parsed.duration,
+                    typeData: parsed.typeData,
+                    typeId: i
+                };
+            }
+        }
+        return null;
+    }
+    /*
+    Event MUST have a recurringDef
+    */
+    function expandRecurringRanges(eventDef, framingRange, dateEnv, recurringTypes) {
+        var typeDef = recurringTypes[eventDef.recurringDef.typeId];
+        var markers = typeDef.expand(eventDef.recurringDef.typeData, framingRange, dateEnv);
+        // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
+        if (eventDef.allDay) {
+            markers = markers.map(startOfDay);
+        }
+        return markers;
+    }
+
+    // Merges an array of objects into a single object.
+    // The second argument allows for an array of property names who's object values will be merged together.
+    function mergeProps(propObjs, complexProps) {
+        var dest = {};
+        var i;
+        var name;
+        var complexObjs;
+        var j;
+        var val;
+        var props;
+        if (complexProps) {
+            for (i = 0; i < complexProps.length; i++) {
+                name = complexProps[i];
+                complexObjs = [];
+                // collect the trailing object values, stopping when a non-object is discovered
+                for (j = propObjs.length - 1; j >= 0; j--) {
+                    val = propObjs[j][name];
+                    if (typeof val === 'object' && val) { // non-null object
+                        complexObjs.unshift(val);
+                    }
+                    else if (val !== undefined) {
+                        dest[name] = val; // if there were no objects, this value will be used
+                        break;
+                    }
+                }
+                // if the trailing values were objects, use the merged value
+                if (complexObjs.length) {
+                    dest[name] = mergeProps(complexObjs);
+                }
+            }
+        }
+        // copy values into the destination, going from last to first
+        for (i = propObjs.length - 1; i >= 0; i--) {
+            props = propObjs[i];
+            for (name in props) {
+                if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
+                    dest[name] = props[name];
+                }
+            }
+        }
+        return dest;
+    }
+    function filterHash(hash, func) {
+        var filtered = {};
+        for (var key in hash) {
+            if (func(hash[key], key)) {
+                filtered[key] = hash[key];
+            }
+        }
+        return filtered;
+    }
+    function mapHash(hash, func) {
+        var newHash = {};
+        for (var key in hash) {
+            newHash[key] = func(hash[key], key);
+        }
+        return newHash;
+    }
+    function arrayToHash(a) {
+        var hash = {};
+        for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
+            var item = a_1[_i];
+            hash[item] = true;
+        }
+        return hash;
+    }
+    function hashValuesToArray(obj) {
+        var a = [];
+        for (var key in obj) {
+            a.push(obj[key]);
+        }
+        return a;
+    }
+
+    function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
+        var eventStore = createEmptyEventStore();
+        for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
+            var rawEvent = rawEvents_1[_i];
+            var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
+            if (tuple) {
+                eventTupleToStore(tuple, eventStore);
+            }
+        }
+        return eventStore;
+    }
+    function eventTupleToStore(tuple, eventStore) {
+        if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
+        eventStore.defs[tuple.def.defId] = tuple.def;
+        if (tuple.instance) {
+            eventStore.instances[tuple.instance.instanceId] = tuple.instance;
+        }
+        return eventStore;
+    }
+    function expandRecurring(eventStore, framingRange, calendar) {
+        var dateEnv = calendar.dateEnv;
+        var defs = eventStore.defs, instances = eventStore.instances;
+        // remove existing recurring instances
+        instances = filterHash(instances, function (instance) {
+            return !defs[instance.defId].recurringDef;
+        });
+        for (var defId in defs) {
+            var def = defs[defId];
+            if (def.recurringDef) {
+                var starts = expandRecurringRanges(def, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
+                var duration = def.recurringDef.duration;
+                if (!duration) {
+                    duration = def.allDay ?
+                        calendar.defaultAllDayEventDuration :
+                        calendar.defaultTimedEventDuration;
+                }
+                for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
+                    var start = starts_1[_i];
+                    var instance = createEventInstance(defId, {
+                        start: start,
+                        end: dateEnv.add(start, duration)
+                    });
+                    instances[instance.instanceId] = instance;
+                }
+            }
+        }
+        return { defs: defs, instances: instances };
+    }
+    // retrieves events that have the same groupId as the instance specified by `instanceId`
+    // or they are the same as the instance.
+    // why might instanceId not be in the store? an event from another calendar?
+    function getRelevantEvents(eventStore, instanceId) {
+        var instance = eventStore.instances[instanceId];
+        if (instance) {
+            var def_1 = eventStore.defs[instance.defId];
+            // get events/instances with same group
+            var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
+                return isEventDefsGrouped(def_1, lookDef);
+            });
+            // add the original
+            // TODO: wish we could use eventTupleToStore or something like it
+            newStore.defs[def_1.defId] = def_1;
+            newStore.instances[instance.instanceId] = instance;
+            return newStore;
+        }
+        return createEmptyEventStore();
+    }
+    function isEventDefsGrouped(def0, def1) {
+        return Boolean(def0.groupId && def0.groupId === def1.groupId);
+    }
+    function transformRawEvents(rawEvents, eventSource, calendar) {
+        var calEachTransform = calendar.opt('eventDataTransform');
+        var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
+        if (sourceEachTransform) {
+            rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
+        }
+        if (calEachTransform) {
+            rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
+        }
+        return rawEvents;
+    }
+    function transformEachRawEvent(rawEvents, func) {
+        var refinedEvents;
+        if (!func) {
+            refinedEvents = rawEvents;
+        }
+        else {
+            refinedEvents = [];
+            for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
+                var rawEvent = rawEvents_2[_i];
+                var refinedEvent = func(rawEvent);
+                if (refinedEvent) {
+                    refinedEvents.push(refinedEvent);
+                }
+                else if (refinedEvent == null) {
+                    refinedEvents.push(rawEvent);
+                } // if a different falsy value, do nothing
+            }
+        }
+        return refinedEvents;
+    }
+    function createEmptyEventStore() {
+        return { defs: {}, instances: {} };
+    }
+    function mergeEventStores(store0, store1) {
+        return {
+            defs: __assign({}, store0.defs, store1.defs),
+            instances: __assign({}, store0.instances, store1.instances)
+        };
+    }
+    function filterEventStoreDefs(eventStore, filterFunc) {
+        var defs = filterHash(eventStore.defs, filterFunc);
+        var instances = filterHash(eventStore.instances, function (instance) {
+            return defs[instance.defId]; // still exists?
+        });
+        return { defs: defs, instances: instances };
+    }
+
+    function parseRange(input, dateEnv) {
+        var start = null;
+        var end = null;
+        if (input.start) {
+            start = dateEnv.createMarker(input.start);
+        }
+        if (input.end) {
+            end = dateEnv.createMarker(input.end);
+        }
+        if (!start && !end) {
+            return null;
+        }
+        if (start && end && end < start) {
+            return null;
+        }
+        return { start: start, end: end };
+    }
+    // SIDE-EFFECT: will mutate ranges.
+    // Will return a new array result.
+    function invertRanges(ranges, constraintRange) {
+        var invertedRanges = [];
+        var start = constraintRange.start; // the end of the previous range. the start of the new range
+        var i;
+        var dateRange;
+        // ranges need to be in order. required for our date-walking algorithm
+        ranges.sort(compareRanges);
+        for (i = 0; i < ranges.length; i++) {
+            dateRange = ranges[i];
+            // add the span of time before the event (if there is any)
+            if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
+                invertedRanges.push({ start: start, end: dateRange.start });
+            }
+            if (dateRange.end > start) {
+                start = dateRange.end;
+            }
+        }
+        // add the span of time after the last event (if there is any)
+        if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
+            invertedRanges.push({ start: start, end: constraintRange.end });
+        }
+        return invertedRanges;
+    }
+    function compareRanges(range0, range1) {
+        return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
+    }
+    function intersectRanges(range0, range1) {
+        var start = range0.start;
+        var end = range0.end;
+        var newRange = null;
+        if (range1.start !== null) {
+            if (start === null) {
+                start = range1.start;
+            }
+            else {
+                start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
+            }
+        }
+        if (range1.end != null) {
+            if (end === null) {
+                end = range1.end;
+            }
+            else {
+                end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
+            }
+        }
+        if (start === null || end === null || start < end) {
+            newRange = { start: start, end: end };
+        }
+        return newRange;
+    }
+    function rangesEqual(range0, range1) {
+        return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
+            (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
+    }
+    function rangesIntersect(range0, range1) {
+        return (range0.end === null || range1.start === null || range0.end > range1.start) &&
+            (range0.start === null || range1.end === null || range0.start < range1.end);
+    }
+    function rangeContainsRange(outerRange, innerRange) {
+        return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
+            (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
+    }
+    function rangeContainsMarker(range, date) {
+        return (range.start === null || date >= range.start) &&
+            (range.end === null || date < range.end);
+    }
+    // If the given date is not within the given range, move it inside.
+    // (If it's past the end, make it one millisecond before the end).
+    function constrainMarkerToRange(date, range) {
+        if (range.start != null && date < range.start) {
+            return range.start;
+        }
+        if (range.end != null && date >= range.end) {
+            return new Date(range.end.valueOf() - 1);
+        }
+        return date;
+    }
+
+    function removeExact(array, exactVal) {
+        var removeCnt = 0;
+        var i = 0;
+        while (i < array.length) {
+            if (array[i] === exactVal) {
+                array.splice(i, 1);
+                removeCnt++;
+            }
+            else {
+                i++;
+            }
+        }
+        return removeCnt;
+    }
+    function isArraysEqual(a0, a1) {
+        var len = a0.length;
+        var i;
+        if (len !== a1.length) { // not array? or not same length?
+            return false;
+        }
+        for (i = 0; i < len; i++) {
+            if (a0[i] !== a1[i]) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    function memoize(workerFunc) {
+        var args;
+        var res;
+        return function () {
+            if (!args || !isArraysEqual(args, arguments)) {
+                args = arguments;
+                res = workerFunc.apply(this, arguments);
+            }
+            return res;
+        };
+    }
+    /*
+    always executes the workerFunc, but if the result is equal to the previous result,
+    return the previous result instead.
+    */
+    function memoizeOutput(workerFunc, equalityFunc) {
+        var cachedRes = null;
+        return function () {
+            var newRes = workerFunc.apply(this, arguments);
+            if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
+                cachedRes = newRes;
+            }
+            return cachedRes;
+        };
+    }
+
+    var EXTENDED_SETTINGS_AND_SEVERITIES = {
+        week: 3,
+        separator: 0,
+        omitZeroMinute: 0,
+        meridiem: 0,
+        omitCommas: 0
+    };
+    var STANDARD_DATE_PROP_SEVERITIES = {
+        timeZoneName: 7,
+        era: 6,
+        year: 5,
+        month: 4,
+        day: 2,
+        weekday: 2,
+        hour: 1,
+        minute: 1,
+        second: 1
+    };
+    var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
+    var COMMA_RE = /,/g; // we need re for globalness
+    var MULTI_SPACE_RE = /\s+/g;
+    var LTR_RE = /\u200e/g; // control character
+    var UTC_RE = /UTC|GMT/;
+    var NativeFormatter = /** @class */ (function () {
+        function NativeFormatter(formatSettings) {
+            var standardDateProps = {};
+            var extendedSettings = {};
+            var severity = 0;
+            for (var name_1 in formatSettings) {
+                if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
+                    extendedSettings[name_1] = formatSettings[name_1];
+                    severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
+                }
+                else {
+                    standardDateProps[name_1] = formatSettings[name_1];
+                    if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
+                        severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
+                    }
+                }
+            }
+            this.standardDateProps = standardDateProps;
+            this.extendedSettings = extendedSettings;
+            this.severity = severity;
+            this.buildFormattingFunc = memoize(buildFormattingFunc);
+        }
+        NativeFormatter.prototype.format = function (date, context) {
+            return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
+        };
+        NativeFormatter.prototype.formatRange = function (start, end, context) {
+            var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
+            var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
+            if (!diffSeverity) {
+                return this.format(start, context);
+            }
+            var biggestUnitForPartial = diffSeverity;
+            if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
+                (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
+                (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
+                (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
+                biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
+            }
+            var full0 = this.format(start, context);
+            var full1 = this.format(end, context);
+            if (full0 === full1) {
+                return full0;
+            }
+            var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
+            var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
+            var partial0 = partialFormattingFunc(start);
+            var partial1 = partialFormattingFunc(end);
+            var insertion = findCommonInsertion(full0, partial0, full1, partial1);
+            var separator = extendedSettings.separator || '';
+            if (insertion) {
+                return insertion.before + partial0 + separator + partial1 + insertion.after;
+            }
+            return full0 + separator + full1;
+        };
+        NativeFormatter.prototype.getLargestUnit = function () {
+            switch (this.severity) {
+                case 7:
+                case 6:
+                case 5:
+                    return 'year';
+                case 4:
+                    return 'month';
+                case 3:
+                    return 'week';
+                default:
+                    return 'day';
+            }
+        };
+        return NativeFormatter;
+    }());
+    function buildFormattingFunc(standardDateProps, extendedSettings, context) {
+        var standardDatePropCnt = Object.keys(standardDateProps).length;
+        if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
+            return function (date) {
+                return formatTimeZoneOffset(date.timeZoneOffset);
+            };
+        }
+        if (standardDatePropCnt === 0 && extendedSettings.week) {
+            return function (date) {
+                return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
+            };
+        }
+        return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
+    }
+    function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
+        standardDateProps = __assign({}, standardDateProps); // copy
+        extendedSettings = __assign({}, extendedSettings); // copy
+        sanitizeSettings(standardDateProps, extendedSettings);
+        standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
+        var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
+        var zeroFormat; // needed?
+        if (extendedSettings.omitZeroMinute) {
+            var zeroProps = __assign({}, standardDateProps);
+            delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
+            zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
+        }
+        return function (date) {
+            var marker = date.marker;
+            var format;
+            if (zeroFormat && !marker.getUTCMinutes()) {
+                format = zeroFormat;
+            }
+            else {
+                format = normalFormat;
+            }
+            var s = format.format(marker);
+            return postProcess(s, date, standardDateProps, extendedSettings, context);
+        };
+    }
+    function sanitizeSettings(standardDateProps, extendedSettings) {
+        // deal with a browser inconsistency where formatting the timezone
+        // requires that the hour/minute be present.
+        if (standardDateProps.timeZoneName) {
+            if (!standardDateProps.hour) {
+                standardDateProps.hour = '2-digit';
+            }
+            if (!standardDateProps.minute) {
+                standardDateProps.minute = '2-digit';
+            }
+        }
+        // only support short timezone names
+        if (standardDateProps.timeZoneName === 'long') {
+            standardDateProps.timeZoneName = 'short';
+        }
+        // if requesting to display seconds, MUST display minutes
+        if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
+            delete extendedSettings.omitZeroMinute;
+        }
+    }
+    function postProcess(s, date, standardDateProps, extendedSettings, context) {
+        s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
+        if (standardDateProps.timeZoneName === 'short') {
+            s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
+                'UTC' : // important to normalize for IE, which does "GMT"
+                formatTimeZoneOffset(date.timeZoneOffset));
+        }
+        if (extendedSettings.omitCommas) {
+            s = s.replace(COMMA_RE, '').trim();
+        }
+        if (extendedSettings.omitZeroMinute) {
+            s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
+        }
+        // ^ do anything that might create adjacent spaces before this point,
+        // because MERIDIEM_RE likes to eat up loading spaces
+        if (extendedSettings.meridiem === false) {
+            s = s.replace(MERIDIEM_RE, '').trim();
+        }
+        else if (extendedSettings.meridiem === 'narrow') { // a/p
+            s = s.replace(MERIDIEM_RE, function (m0, m1) {
+                return m1.toLocaleLowerCase();
+            });
+        }
+        else if (extendedSettings.meridiem === 'short') { // am/pm
+            s = s.replace(MERIDIEM_RE, function (m0, m1) {
+                return m1.toLocaleLowerCase() + 'm';
+            });
+        }
+        else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
+            s = s.replace(MERIDIEM_RE, function (m0) {
+                return m0.toLocaleLowerCase();
+            });
+        }
+        s = s.replace(MULTI_SPACE_RE, ' ');
+        s = s.trim();
+        return s;
+    }
+    function injectTzoStr(s, tzoStr) {
+        var replaced = false;
+        s = s.replace(UTC_RE, function () {
+            replaced = true;
+            return tzoStr;
+        });
+        // IE11 doesn't include UTC/GMT in the original string, so append to end
+        if (!replaced) {
+            s += ' ' + tzoStr;
+        }
+        return s;
+    }
+    function formatWeekNumber(num, weekLabel, locale, display) {
+        var parts = [];
+        if (display === 'narrow') {
+            parts.push(weekLabel);
+        }
+        else if (display === 'short') {
+            parts.push(weekLabel, ' ');
+        }
+        // otherwise, considered 'numeric'
+        parts.push(locale.simpleNumberFormat.format(num));
+        if (locale.options.isRtl) { // TODO: use control characters instead?
+            parts.reverse();
+        }
+        return parts.join('');
+    }
+    // Range Formatting Utils
+    // 0 = exactly the same
+    // 1 = different by time
+    // and bigger
+    function computeMarkerDiffSeverity(d0, d1, ca) {
+        if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
+            return 5;
+        }
+        if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
+            return 4;
+        }
+        if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
+            return 2;
+        }
+        if (timeAsMs(d0) !== timeAsMs(d1)) {
+            return 1;
+        }
+        return 0;
+    }
+    function computePartialFormattingOptions(options, biggestUnit) {
+        var partialOptions = {};
+        for (var name_2 in options) {
+            if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
+                STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
+                partialOptions[name_2] = options[name_2];
+            }
+        }
+        return partialOptions;
+    }
+    function findCommonInsertion(full0, partial0, full1, partial1) {
+        var i0 = 0;
+        while (i0 < full0.length) {
+            var found0 = full0.indexOf(partial0, i0);
+            if (found0 === -1) {
+                break;
+            }
+            var before0 = full0.substr(0, found0);
+            i0 = found0 + partial0.length;
+            var after0 = full0.substr(i0);
+            var i1 = 0;
+            while (i1 < full1.length) {
+                var found1 = full1.indexOf(partial1, i1);
+                if (found1 === -1) {
+                    break;
+                }
+                var before1 = full1.substr(0, found1);
+                i1 = found1 + partial1.length;
+                var after1 = full1.substr(i1);
+                if (before0 === before1 && after0 === after1) {
+                    return {
+                        before: before0,
+                        after: after0
+                    };
+                }
+            }
+        }
+        return null;
+    }
+
+    /*
+    TODO: fix the terminology of "formatter" vs "formatting func"
+    */
+    /*
+    At the time of instantiation, this object does not know which cmd-formatting system it will use.
+    It receives this at the time of formatting, as a setting.
+    */
+    var CmdFormatter = /** @class */ (function () {
+        function CmdFormatter(cmdStr, separator) {
+            this.cmdStr = cmdStr;
+            this.separator = separator;
+        }
+        CmdFormatter.prototype.format = function (date, context) {
+            return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
+        };
+        CmdFormatter.prototype.formatRange = function (start, end, context) {
+            return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
+        };
+        return CmdFormatter;
+    }());
+
+    var FuncFormatter = /** @class */ (function () {
+        function FuncFormatter(func) {
+            this.func = func;
+        }
+        FuncFormatter.prototype.format = function (date, context) {
+            return this.func(createVerboseFormattingArg(date, null, context));
+        };
+        FuncFormatter.prototype.formatRange = function (start, end, context) {
+            return this.func(createVerboseFormattingArg(start, end, context));
+        };
+        return FuncFormatter;
+    }());
+
+    // Formatter Object Creation
+    function createFormatter(input, defaultSeparator) {
+        if (typeof input === 'object' && input) { // non-null object
+            if (typeof defaultSeparator === 'string') {
+                input = __assign({ separator: defaultSeparator }, input);
+            }
+            return new NativeFormatter(input);
+        }
+        else if (typeof input === 'string') {
+            return new CmdFormatter(input, defaultSeparator);
+        }
+        else if (typeof input === 'function') {
+            return new FuncFormatter(input);
+        }
+    }
+    // String Utils
+    // timeZoneOffset is in minutes
+    function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
+        if (stripZeroTime === void 0) { stripZeroTime = false; }
+        var s = marker.toISOString();
+        s = s.replace('.000', '');
+        if (stripZeroTime) {
+            s = s.replace('T00:00:00Z', '');
+        }
+        if (s.length > 10) { // time part wasn't stripped, can add timezone info
+            if (timeZoneOffset == null) {
+                s = s.replace('Z', '');
+            }
+            else if (timeZoneOffset !== 0) {
+                s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
+            }
+            // otherwise, its UTC-0 and we want to keep the Z
+        }
+        return s;
+    }
+    function formatIsoTimeString(marker) {
+        return padStart(marker.getUTCHours(), 2) + ':' +
+            padStart(marker.getUTCMinutes(), 2) + ':' +
+            padStart(marker.getUTCSeconds(), 2);
+    }
+    function formatTimeZoneOffset(minutes, doIso) {
+        if (doIso === void 0) { doIso = false; }
+        var sign = minutes < 0 ? '-' : '+';
+        var abs = Math.abs(minutes);
+        var hours = Math.floor(abs / 60);
+        var mins = Math.round(abs % 60);
+        if (doIso) {
+            return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
+        }
+        else {
+            return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
+        }
+    }
+    // Arg Utils
+    function createVerboseFormattingArg(start, end, context, separator) {
+        var startInfo = expandZonedMarker(start, context.calendarSystem);
+        var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
+        return {
+            date: startInfo,
+            start: startInfo,
+            end: endInfo,
+            timeZone: context.timeZone,
+            localeCodes: context.locale.codes,
+            separator: separator
+        };
+    }
+    function expandZonedMarker(dateInfo, calendarSystem) {
+        var a = calendarSystem.markerToArray(dateInfo.marker);
+        return {
+            marker: dateInfo.marker,
+            timeZoneOffset: dateInfo.timeZoneOffset,
+            array: a,
+            year: a[0],
+            month: a[1],
+            day: a[2],
+            hour: a[3],
+            minute: a[4],
+            second: a[5],
+            millisecond: a[6]
+        };
+    }
+
+    var EventSourceApi = /** @class */ (function () {
+        function EventSourceApi(calendar, internalEventSource) {
+            this.calendar = calendar;
+            this.internalEventSource = internalEventSource;
+        }
+        EventSourceApi.prototype.remove = function () {
+            this.calendar.dispatch({
+                type: 'REMOVE_EVENT_SOURCE',
+                sourceId: this.internalEventSource.sourceId
+            });
+        };
+        EventSourceApi.prototype.refetch = function () {
+            this.calendar.dispatch({
+                type: 'FETCH_EVENT_SOURCES',
+                sourceIds: [this.internalEventSource.sourceId]
+            });
+        };
+        Object.defineProperty(EventSourceApi.prototype, "id", {
+            get: function () {
+                return this.internalEventSource.publicId;
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventSourceApi.prototype, "url", {
+            // only relevant to json-feed event sources
+            get: function () {
+                return this.internalEventSource.meta.url;
+            },
+            enumerable: true,
+            configurable: true
+        });
+        return EventSourceApi;
+    }());
+
+    var EventApi = /** @class */ (function () {
+        function EventApi(calendar, def, instance) {
+            this._calendar = calendar;
+            this._def = def;
+            this._instance = instance || null;
+        }
+        /*
+        TODO: make event struct more responsible for this
+        */
+        EventApi.prototype.setProp = function (name, val) {
+            var _a, _b;
+            if (name in DATE_PROPS) ;
+            else if (name in NON_DATE_PROPS) {
+                if (typeof NON_DATE_PROPS[name] === 'function') {
+                    val = NON_DATE_PROPS[name](val);
+                }
+                this.mutate({
+                    standardProps: (_a = {}, _a[name] = val, _a)
+                });
+            }
+            else if (name in UNSCOPED_EVENT_UI_PROPS) {
+                var ui = void 0;
+                if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
+                    val = UNSCOPED_EVENT_UI_PROPS[name](val);
+                }
+                if (name === 'color') {
+                    ui = { backgroundColor: val, borderColor: val };
+                }
+                else if (name === 'editable') {
+                    ui = { startEditable: val, durationEditable: val };
+                }
+                else {
+                    ui = (_b = {}, _b[name] = val, _b);
+                }
+                this.mutate({
+                    standardProps: { ui: ui }
+                });
+            }
+        };
+        EventApi.prototype.setExtendedProp = function (name, val) {
+            var _a;
+            this.mutate({
+                extendedProps: (_a = {}, _a[name] = val, _a)
+            });
+        };
+        EventApi.prototype.setStart = function (startInput, options) {
+            if (options === void 0) { options = {}; }
+            var dateEnv = this._calendar.dateEnv;
+            var start = dateEnv.createMarker(startInput);
+            if (start && this._instance) { // TODO: warning if parsed bad
+                var instanceRange = this._instance.range;
+                var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
+                var endDelta = null;
+                if (options.maintainDuration) {
+                    var origDuration = diffDates(instanceRange.start, instanceRange.end, dateEnv, options.granularity);
+                    var newDuration = diffDates(start, instanceRange.end, dateEnv, options.granularity);
+                    endDelta = subtractDurations(origDuration, newDuration);
+                }
+                this.mutate({ startDelta: startDelta, endDelta: endDelta });
+            }
+        };
+        EventApi.prototype.setEnd = function (endInput, options) {
+            if (options === void 0) { options = {}; }
+            var dateEnv = this._calendar.dateEnv;
+            var end;
+            if (endInput != null) {
+                end = dateEnv.createMarker(endInput);
+                if (!end) {
+                    return; // TODO: warning if parsed bad
+                }
+            }
+            if (this._instance) {
+                if (end) {
+                    var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
+                    this.mutate({ endDelta: endDelta });
+                }
+                else {
+                    this.mutate({ standardProps: { hasEnd: false } });
+                }
+            }
+        };
+        EventApi.prototype.setDates = function (startInput, endInput, options) {
+            if (options === void 0) { options = {}; }
+            var dateEnv = this._calendar.dateEnv;
+            var standardProps = { allDay: options.allDay };
+            var start = dateEnv.createMarker(startInput);
+            var end;
+            if (!start) {
+                return; // TODO: warning if parsed bad
+            }
+            if (endInput != null) {
+                end = dateEnv.createMarker(endInput);
+                if (!end) { // TODO: warning if parsed bad
+                    return;
+                }
+            }
+            if (this._instance) {
+                var instanceRange = this._instance.range;
+                // when computing the diff for an event being converted to all-day,
+                // compute diff off of the all-day values the way event-mutation does.
+                if (options.allDay === true) {
+                    instanceRange = computeAlignedDayRange(instanceRange);
+                }
+                var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
+                if (end) {
+                    var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
+                    this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
+                }
+                else {
+                    standardProps.hasEnd = false;
+                    this.mutate({ startDelta: startDelta, standardProps: standardProps });
+                }
+            }
+        };
+        EventApi.prototype.moveStart = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // TODO: warning if parsed bad
+                this.mutate({ startDelta: delta });
+            }
+        };
+        EventApi.prototype.moveEnd = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // TODO: warning if parsed bad
+                this.mutate({ endDelta: delta });
+            }
+        };
+        EventApi.prototype.moveDates = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // TODO: warning if parsed bad
+                this.mutate({ startDelta: delta, endDelta: delta });
+            }
+        };
+        EventApi.prototype.setAllDay = function (allDay, options) {
+            if (options === void 0) { options = {}; }
+            var standardProps = { allDay: allDay };
+            var maintainDuration = options.maintainDuration;
+            if (maintainDuration == null) {
+                maintainDuration = this._calendar.opt('allDayMaintainDuration');
+            }
+            if (this._def.allDay !== allDay) {
+                standardProps.hasEnd = maintainDuration;
+            }
+            this.mutate({ standardProps: standardProps });
+        };
+        EventApi.prototype.formatRange = function (formatInput) {
+            var dateEnv = this._calendar.dateEnv;
+            var instance = this._instance;
+            var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
+            if (this._def.hasEnd) {
+                return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
+                    forcedStartTzo: instance.forcedStartTzo,
+                    forcedEndTzo: instance.forcedEndTzo
+                });
+            }
+            else {
+                return dateEnv.format(instance.range.start, formatter, {
+                    forcedTzo: instance.forcedStartTzo
+                });
+            }
+        };
+        EventApi.prototype.mutate = function (mutation) {
+            var def = this._def;
+            var instance = this._instance;
+            if (instance) {
+                this._calendar.dispatch({
+                    type: 'MUTATE_EVENTS',
+                    instanceId: instance.instanceId,
+                    mutation: mutation,
+                    fromApi: true
+                });
+                var eventStore = this._calendar.state.eventStore;
+                this._def = eventStore.defs[def.defId];
+                this._instance = eventStore.instances[instance.instanceId];
+            }
+        };
+        EventApi.prototype.remove = function () {
+            this._calendar.dispatch({
+                type: 'REMOVE_EVENT_DEF',
+                defId: this._def.defId
+            });
+        };
+        Object.defineProperty(EventApi.prototype, "source", {
+            get: function () {
+                var sourceId = this._def.sourceId;
+                if (sourceId) {
+                    return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
+                }
+                return null;
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "start", {
+            get: function () {
+                return this._instance ?
+                    this._calendar.dateEnv.toDate(this._instance.range.start) :
+                    null;
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "end", {
+            get: function () {
+                return (this._instance && this._def.hasEnd) ?
+                    this._calendar.dateEnv.toDate(this._instance.range.end) :
+                    null;
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "id", {
+            // computable props that all access the def
+            // TODO: find a TypeScript-compatible way to do this at scale
+            get: function () { return this._def.publicId; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "groupId", {
+            get: function () { return this._def.groupId; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "allDay", {
+            get: function () { return this._def.allDay; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "title", {
+            get: function () { return this._def.title; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "url", {
+            get: function () { return this._def.url; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "rendering", {
+            get: function () { return this._def.rendering; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "startEditable", {
+            get: function () { return this._def.ui.startEditable; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "durationEditable", {
+            get: function () { return this._def.ui.durationEditable; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "constraint", {
+            get: function () { return this._def.ui.constraints[0] || null; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "overlap", {
+            get: function () { return this._def.ui.overlap; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "allow", {
+            get: function () { return this._def.ui.allows[0] || null; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "backgroundColor", {
+            get: function () { return this._def.ui.backgroundColor; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "borderColor", {
+            get: function () { return this._def.ui.borderColor; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "textColor", {
+            get: function () { return this._def.ui.textColor; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "classNames", {
+            // NOTE: user can't modify these because Object.freeze was called in event-def parsing
+            get: function () { return this._def.ui.classNames; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "extendedProps", {
+            get: function () { return this._def.extendedProps; },
+            enumerable: true,
+            configurable: true
+        });
+        return EventApi;
+    }());
+
+    /*
+    Specifying nextDayThreshold signals that all-day ranges should be sliced.
+    */
+    function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
+        var inverseBgByGroupId = {};
+        var inverseBgByDefId = {};
+        var defByGroupId = {};
+        var bgRanges = [];
+        var fgRanges = [];
+        var eventUis = compileEventUis(eventStore.defs, eventUiBases);
+        for (var defId in eventStore.defs) {
+            var def = eventStore.defs[defId];
+            if (def.rendering === 'inverse-background') {
+                if (def.groupId) {
+                    inverseBgByGroupId[def.groupId] = [];
+                    if (!defByGroupId[def.groupId]) {
+                        defByGroupId[def.groupId] = def;
+                    }
+                }
+                else {
+                    inverseBgByDefId[defId] = [];
+                }
+            }
+        }
+        for (var instanceId in eventStore.instances) {
+            var instance = eventStore.instances[instanceId];
+            var def = eventStore.defs[instance.defId];
+            var ui = eventUis[def.defId];
+            var origRange = instance.range;
+            var normalRange = (!def.allDay && nextDayThreshold) ?
+                computeVisibleDayRange(origRange, nextDayThreshold) :
+                origRange;
+            var slicedRange = intersectRanges(normalRange, framingRange);
+            if (slicedRange) {
+                if (def.rendering === 'inverse-background') {
+                    if (def.groupId) {
+                        inverseBgByGroupId[def.groupId].push(slicedRange);
+                    }
+                    else {
+                        inverseBgByDefId[instance.defId].push(slicedRange);
+                    }
+                }
+                else {
+                    (def.rendering === 'background' ? bgRanges : fgRanges).push({
+                        def: def,
+                        ui: ui,
+                        instance: instance,
+                        range: slicedRange,
+                        isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
+                        isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
+                    });
+                }
+            }
+        }
+        for (var groupId in inverseBgByGroupId) { // BY GROUP
+            var ranges = inverseBgByGroupId[groupId];
+            var invertedRanges = invertRanges(ranges, framingRange);
+            for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
+                var invertedRange = invertedRanges_1[_i];
+                var def = defByGroupId[groupId];
+                var ui = eventUis[def.defId];
+                bgRanges.push({
+                    def: def,
+                    ui: ui,
+                    instance: null,
+                    range: invertedRange,
+                    isStart: false,
+                    isEnd: false
+                });
+            }
+        }
+        for (var defId in inverseBgByDefId) {
+            var ranges = inverseBgByDefId[defId];
+            var invertedRanges = invertRanges(ranges, framingRange);
+            for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
+                var invertedRange = invertedRanges_2[_a];
+                bgRanges.push({
+                    def: eventStore.defs[defId],
+                    ui: eventUis[defId],
+                    instance: null,
+                    range: invertedRange,
+                    isStart: false,
+                    isEnd: false
+                });
+            }
+        }
+        return { bg: bgRanges, fg: fgRanges };
+    }
+    function hasBgRendering(def) {
+        return def.rendering === 'background' || def.rendering === 'inverse-background';
+    }
+    function filterSegsViaEls(view, segs, isMirror) {
+        if (view.hasPublicHandlers('eventRender')) {
+            segs = segs.filter(function (seg) {
+                var custom = view.publiclyTrigger('eventRender', [
+                    {
+                        event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance),
+                        isMirror: isMirror,
+                        isStart: seg.isStart,
+                        isEnd: seg.isEnd,
+                        // TODO: include seg.range once all components consistently generate it
+                        el: seg.el,
+                        view: view
+                    }
+                ]);
+                if (custom === false) { // means don't render at all
+                    return false;
+                }
+                else if (custom && custom !== true) {
+                    seg.el = custom;
+                }
+                return true;
+            });
+        }
+        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+            var seg = segs_1[_i];
+            setElSeg(seg.el, seg);
+        }
+        return segs;
+    }
+    function setElSeg(el, seg) {
+        el.fcSeg = seg;
+    }
+    function getElSeg(el) {
+        return el.fcSeg || null;
+    }
+    // event ui computation
+    function compileEventUis(eventDefs, eventUiBases) {
+        return mapHash(eventDefs, function (eventDef) {
+            return compileEventUi(eventDef, eventUiBases);
+        });
+    }
+    function compileEventUi(eventDef, eventUiBases) {
+        var uis = [];
+        if (eventUiBases['']) {
+            uis.push(eventUiBases['']);
+        }
+        if (eventUiBases[eventDef.defId]) {
+            uis.push(eventUiBases[eventDef.defId]);
+        }
+        uis.push(eventDef.ui);
+        return combineEventUis(uis);
+    }
+
+    // applies the mutation to ALL defs/instances within the event store
+    function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
+        var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
+        var dest = createEmptyEventStore();
+        for (var defId in eventStore.defs) {
+            var def = eventStore.defs[defId];
+            dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
+        }
+        for (var instanceId in eventStore.instances) {
+            var instance = eventStore.instances[instanceId];
+            var def = dest.defs[instance.defId]; // important to grab the newly modified def
+            dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
+        }
+        return dest;
+    }
+    function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
+        var standardProps = mutation.standardProps || {};
+        // if hasEnd has not been specified, guess a good value based on deltas.
+        // if duration will change, there's no way the default duration will persist,
+        // and thus, we need to mark the event as having a real end
+        if (standardProps.hasEnd == null &&
+            eventConfig.durationEditable &&
+            willDeltasAffectDuration(eventConfig.startEditable ? mutation.startDelta : null, mutation.endDelta || null)) {
+            standardProps.hasEnd = true; // TODO: is this mutation okay?
+        }
+        var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
+        if (mutation.extendedProps) {
+            copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
+        }
+        for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
+            var applier = appliers_1[_i];
+            applier(copy, mutation, calendar);
+        }
+        if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
+            copy.hasEnd = true;
+        }
+        return copy;
+    }
+    function willDeltasAffectDuration(startDelta, endDelta) {
+        if (startDelta && !asRoughMs(startDelta)) {
+            startDelta = null;
+        }
+        if (endDelta && !asRoughMs(endDelta)) {
+            endDelta = null;
+        }
+        if (!startDelta && !endDelta) {
+            return false;
+        }
+        if (Boolean(startDelta) !== Boolean(endDelta)) {
+            return true;
+        }
+        return !durationsEqual(startDelta, endDelta);
+    }
+    function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
+    eventConfig, mutation, calendar) {
+        var dateEnv = calendar.dateEnv;
+        var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
+        var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
+        var copy = __assign({}, eventInstance);
+        if (forceAllDay) {
+            copy.range = computeAlignedDayRange(copy.range);
+        }
+        if (mutation.startDelta && eventConfig.startEditable) {
+            copy.range = {
+                start: dateEnv.add(copy.range.start, mutation.startDelta),
+                end: copy.range.end
+            };
+        }
+        if (clearEnd) {
+            copy.range = {
+                start: copy.range.start,
+                end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
+            };
+        }
+        else if (mutation.endDelta &&
+            (eventConfig.durationEditable ||
+                !willDeltasAffectDuration(// TODO: nonDRY logic above
+                eventConfig.startEditable ? mutation.startDelta : null, mutation.endDelta))) {
+            copy.range = {
+                start: copy.range.start,
+                end: dateEnv.add(copy.range.end, mutation.endDelta)
+            };
+        }
+        // in case event was all-day but the supplied deltas were not
+        // better util for this?
+        if (eventDef.allDay) {
+            copy.range = {
+                start: startOfDay(copy.range.start),
+                end: startOfDay(copy.range.end)
+            };
+        }
+        // handle invalid durations
+        if (copy.range.end < copy.range.start) {
+            copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
+        }
+        return copy;
+    }
+
+    function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
+        switch (action.type) {
+            case 'RECEIVE_EVENTS': // raw
+                return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
+            case 'ADD_EVENTS': // already parsed, but not expanded
+                return addEvent(eventStore, action.eventStore, // new ones
+                dateProfile ? dateProfile.activeRange : null, calendar);
+            case 'MERGE_EVENTS': // already parsed and expanded
+                return mergeEventStores(eventStore, action.eventStore);
+            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+            case 'NEXT':
+            case 'SET_DATE':
+            case 'SET_VIEW_TYPE':
+                if (dateProfile) {
+                    return expandRecurring(eventStore, dateProfile.activeRange, calendar);
+                }
+                else {
+                    return eventStore;
+                }
+            case 'CHANGE_TIMEZONE':
+                return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
+            case 'MUTATE_EVENTS':
+                return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
+            case 'REMOVE_EVENT_INSTANCES':
+                return excludeInstances(eventStore, action.instances);
+            case 'REMOVE_EVENT_DEF':
+                return filterEventStoreDefs(eventStore, function (eventDef) {
+                    return eventDef.defId !== action.defId;
+                });
+            case 'REMOVE_EVENT_SOURCE':
+                return excludeEventsBySourceId(eventStore, action.sourceId);
+            case 'REMOVE_ALL_EVENT_SOURCES':
+                return filterEventStoreDefs(eventStore, function (eventDef) {
+                    return !eventDef.sourceId; // only keep events with no source id
+                });
+            case 'REMOVE_ALL_EVENTS':
+                return createEmptyEventStore();
+            case 'RESET_EVENTS':
+                return {
+                    defs: eventStore.defs,
+                    instances: eventStore.instances
+                };
+            default:
+                return eventStore;
+        }
+    }
+    function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
+        if (eventSource && // not already removed
+            fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
+        ) {
+            var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
+            if (fetchRange) {
+                subset = expandRecurring(subset, fetchRange, calendar);
+            }
+            return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
+        }
+        return eventStore;
+    }
+    function addEvent(eventStore, subset, expandRange, calendar) {
+        if (expandRange) {
+            subset = expandRecurring(subset, expandRange, calendar);
+        }
+        return mergeEventStores(eventStore, subset);
+    }
+    function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
+        var defs = eventStore.defs;
+        var instances = mapHash(eventStore.instances, function (instance) {
+            var def = defs[instance.defId];
+            if (def.allDay || def.recurringDef) {
+                return instance; // isn't dependent on timezone
+            }
+            else {
+                return __assign({}, instance, { range: {
+                        start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
+                        end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
+                    }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
+            }
+        });
+        return { defs: defs, instances: instances };
+    }
+    function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
+        var relevant = getRelevantEvents(eventStore, instanceId);
+        var eventConfigBase = fromApi ?
+            { '': {
+                    startEditable: true,
+                    durationEditable: true,
+                    constraints: [],
+                    overlap: null,
+                    allows: [],
+                    backgroundColor: '',
+                    borderColor: '',
+                    textColor: '',
+                    classNames: []
+                } } :
+            calendar.eventUiBases;
+        relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
+        return mergeEventStores(eventStore, relevant);
+    }
+    function excludeEventsBySourceId(eventStore, sourceId) {
+        return filterEventStoreDefs(eventStore, function (eventDef) {
+            return eventDef.sourceId !== sourceId;
+        });
+    }
+    // QUESTION: why not just return instances? do a general object-property-exclusion util
+    function excludeInstances(eventStore, removals) {
+        return {
+            defs: eventStore.defs,
+            instances: filterHash(eventStore.instances, function (instance) {
+                return !removals[instance.instanceId];
+            })
+        };
+    }
+
+    // high-level segmenting-aware tester functions
+    // ------------------------------------------------------------------------------------------------------------------------
+    function isInteractionValid(interaction, calendar) {
+        return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
+    }
+    function isDateSelectionValid(dateSelection, calendar) {
+        return isNewPropsValid({ dateSelection: dateSelection }, calendar);
+    }
+    function isNewPropsValid(newProps, calendar) {
+        var view = calendar.view;
+        var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
+        return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
+    }
+    function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
+        if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
+        if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
+            return false;
+        }
+        if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
+            return false;
+        }
+        return true;
+    }
+    // Moving Event Validation
+    // ------------------------------------------------------------------------------------------------------------------------
+    function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
+        var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
+        var subjectEventStore = interaction.mutatedEvents;
+        var subjectDefs = subjectEventStore.defs;
+        var subjectInstances = subjectEventStore.instances;
+        var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
+            state.eventUiBases :
+            { '': calendar.selectionConfig } // if not a real event, validate as a selection
+        );
+        if (filterConfig) {
+            subjectConfigs = mapHash(subjectConfigs, filterConfig);
+        }
+        var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
+        var otherDefs = otherEventStore.defs;
+        var otherInstances = otherEventStore.instances;
+        var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
+        for (var subjectInstanceId in subjectInstances) {
+            var subjectInstance = subjectInstances[subjectInstanceId];
+            var subjectRange = subjectInstance.range;
+            var subjectConfig = subjectConfigs[subjectInstance.defId];
+            var subjectDef = subjectDefs[subjectInstance.defId];
+            // constraint
+            if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
+                return false;
+            }
+            // overlap
+            var overlapFunc = calendar.opt('eventOverlap');
+            if (typeof overlapFunc !== 'function') {
+                overlapFunc = null;
+            }
+            for (var otherInstanceId in otherInstances) {
+                var otherInstance = otherInstances[otherInstanceId];
+                // intersect! evaluate
+                if (rangesIntersect(subjectRange, otherInstance.range)) {
+                    var otherOverlap = otherConfigs[otherInstance.defId].overlap;
+                    // consider the other event's overlap. only do this if the subject event is a "real" event
+                    if (otherOverlap === false && interaction.isEvent) {
+                        return false;
+                    }
+                    if (subjectConfig.overlap === false) {
+                        return false;
+                    }
+                    if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
+                    new EventApi(calendar, subjectDef, subjectInstance) // moving event
+                    )) {
+                        return false;
+                    }
+                }
+            }
+            // allow (a function)
+            for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
+                var subjectAllow = _a[_i];
+                var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
+                var origDef = state.eventStore.defs[subjectDef.defId];
+                var origInstance = state.eventStore.instances[subjectInstanceId];
+                var eventApi = void 0;
+                if (origDef) { // was previously in the calendar
+                    eventApi = new EventApi(calendar, origDef, origInstance);
+                }
+                else { // was an external event
+                    eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
+                }
+                if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+    // Date Selection Validation
+    // ------------------------------------------------------------------------------------------------------------------------
+    function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
+        var relevantEventStore = state.eventStore;
+        var relevantDefs = relevantEventStore.defs;
+        var relevantInstances = relevantEventStore.instances;
+        var selection = state.dateSelection;
+        var selectionRange = selection.range;
+        var selectionConfig = calendar.selectionConfig;
+        if (filterConfig) {
+            selectionConfig = filterConfig(selectionConfig);
+        }
+        // constraint
+        if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
+            return false;
+        }
+        // overlap
+        var overlapFunc = calendar.opt('selectOverlap');
+        if (typeof overlapFunc !== 'function') {
+            overlapFunc = null;
+        }
+        for (var relevantInstanceId in relevantInstances) {
+            var relevantInstance = relevantInstances[relevantInstanceId];
+            // intersect! evaluate
+            if (rangesIntersect(selectionRange, relevantInstance.range)) {
+                if (selectionConfig.overlap === false) {
+                    return false;
+                }
+                if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
+                    return false;
+                }
+            }
+        }
+        // allow (a function)
+        for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
+            var selectionAllow = _a[_i];
+            var fullDateSpan = __assign({}, dateSpanMeta, selection);
+            if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    // Constraint Utils
+    // ------------------------------------------------------------------------------------------------------------------------
+    function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
+        for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
+            var constraint = constraints_1[_i];
+            if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
+    otherEventStore, // for if constraint is an even group ID
+    businessHoursUnexpanded, // for if constraint is 'businessHours'
+    calendar // for expanding businesshours
+    ) {
+        if (constraint === 'businessHours') {
+            return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
+        }
+        else if (typeof constraint === 'string') { // an group ID
+            return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
+                return eventDef.groupId === constraint;
+            }));
+        }
+        else if (typeof constraint === 'object' && constraint) { // non-null object
+            return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
+        }
+        return []; // if it's false
+    }
+    // TODO: move to event-store file?
+    function eventStoreToRanges(eventStore) {
+        var instances = eventStore.instances;
+        var ranges = [];
+        for (var instanceId in instances) {
+            ranges.push(instances[instanceId].range);
+        }
+        return ranges;
+    }
+    // TODO: move to geom file?
+    function anyRangesContainRange(outerRanges, innerRange) {
+        for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
+            var outerRange = outerRanges_1[_i];
+            if (rangeContainsRange(outerRange, innerRange)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    // Parsing
+    // ------------------------------------------------------------------------------------------------------------------------
+    function normalizeConstraint(input, calendar) {
+        if (Array.isArray(input)) {
+            return parseEvents(input, '', calendar, true); // allowOpenRange=true
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            return parseEvents([input], '', calendar, true); // allowOpenRange=true
+        }
+        else if (input != null) {
+            return String(input);
+        }
+        else {
+            return null;
+        }
+    }
+
+    function htmlEscape(s) {
+        return (s + '').replace(/&/g, '&amp;')
+            .replace(/</g, '&lt;')
+            .replace(/>/g, '&gt;')
+            .replace(/'/g, '&#039;')
+            .replace(/"/g, '&quot;')
+            .replace(/\n/g, '<br />');
+    }
+    // Given a hash of CSS properties, returns a string of CSS.
+    // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
+    function cssToStr(cssProps) {
+        var statements = [];
+        for (var name_1 in cssProps) {
+            var val = cssProps[name_1];
+            if (val != null && val !== '') {
+                statements.push(name_1 + ':' + val);
+            }
+        }
+        return statements.join(';');
+    }
+    // Given an object hash of HTML attribute names to values,
+    // generates a string that can be injected between < > in HTML
+    function attrsToStr(attrs) {
+        var parts = [];
+        for (var name_2 in attrs) {
+            var val = attrs[name_2];
+            if (val != null) {
+                parts.push(name_2 + '="' + htmlEscape(val) + '"');
+            }
+        }
+        return parts.join(' ');
+    }
+    function parseClassName(raw) {
+        if (Array.isArray(raw)) {
+            return raw;
+        }
+        else if (typeof raw === 'string') {
+            return raw.split(/\s+/);
+        }
+        else {
+            return [];
+        }
+    }
+
+    var UNSCOPED_EVENT_UI_PROPS = {
+        editable: Boolean,
+        startEditable: Boolean,
+        durationEditable: Boolean,
+        constraint: null,
+        overlap: null,
+        allow: null,
+        className: parseClassName,
+        classNames: parseClassName,
+        color: String,
+        backgroundColor: String,
+        borderColor: String,
+        textColor: String
+    };
+    function processUnscopedUiProps(rawProps, calendar, leftovers) {
+        var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
+        var constraint = normalizeConstraint(props.constraint, calendar);
+        return {
+            startEditable: props.startEditable != null ? props.startEditable : props.editable,
+            durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
+            constraints: constraint != null ? [constraint] : [],
+            overlap: props.overlap,
+            allows: props.allow != null ? [props.allow] : [],
+            backgroundColor: props.backgroundColor || props.color,
+            borderColor: props.borderColor || props.color,
+            textColor: props.textColor,
+            classNames: props.classNames.concat(props.className)
+        };
+    }
+    function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
+        var rawUnscoped = {};
+        var wasFound = {};
+        for (var key in UNSCOPED_EVENT_UI_PROPS) {
+            var scopedKey = prefix + capitaliseFirstLetter(key);
+            rawUnscoped[key] = rawScoped[scopedKey];
+            wasFound[scopedKey] = true;
+        }
+        if (prefix === 'event') {
+            rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
+        }
+        if (leftovers) {
+            for (var key in rawScoped) {
+                if (!wasFound[key]) {
+                    leftovers[key] = rawScoped[key];
+                }
+            }
+        }
+        return processUnscopedUiProps(rawUnscoped, calendar);
+    }
+    var EMPTY_EVENT_UI = {
+        startEditable: null,
+        durationEditable: null,
+        constraints: [],
+        overlap: null,
+        allows: [],
+        backgroundColor: '',
+        borderColor: '',
+        textColor: '',
+        classNames: []
+    };
+    // prevent against problems with <2 args!
+    function combineEventUis(uis) {
+        return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
+    }
+    function combineTwoEventUis(item0, item1) {
+        return {
+            startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
+            durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
+            constraints: item0.constraints.concat(item1.constraints),
+            overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
+            allows: item0.allows.concat(item1.allows),
+            backgroundColor: item1.backgroundColor || item0.backgroundColor,
+            borderColor: item1.borderColor || item0.borderColor,
+            textColor: item1.textColor || item0.textColor,
+            classNames: item0.classNames.concat(item1.classNames)
+        };
+    }
+
+    var NON_DATE_PROPS = {
+        id: String,
+        groupId: String,
+        title: String,
+        url: String,
+        rendering: String,
+        extendedProps: null
+    };
+    var DATE_PROPS = {
+        start: null,
+        date: null,
+        end: null,
+        allDay: null
+    };
+    var uid = 0;
+    function parseEvent(raw, sourceId, calendar, allowOpenRange) {
+        var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
+        var leftovers0 = {};
+        var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
+        allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
+        );
+        if (recurringRes) {
+            var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
+            def.recurringDef = {
+                typeId: recurringRes.typeId,
+                typeData: recurringRes.typeData,
+                duration: recurringRes.duration
+            };
+            return { def: def, instance: null };
+        }
+        else {
+            var leftovers1 = {};
+            var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
+            if (singleRes) {
+                var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
+                var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
+                return { def: def, instance: instance };
+            }
+        }
+        return null;
+    }
+    /*
+    Will NOT populate extendedProps with the leftover properties.
+    Will NOT populate date-related props.
+    The EventNonDateInput has been normalized (id => publicId, etc).
+    */
+    function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
+        var leftovers = {};
+        var def = pluckNonDateProps(raw, calendar, leftovers);
+        def.defId = String(uid++);
+        def.sourceId = sourceId;
+        def.allDay = allDay;
+        def.hasEnd = hasEnd;
+        for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
+            var eventDefParser = _a[_i];
+            var newLeftovers = {};
+            eventDefParser(def, leftovers, newLeftovers);
+            leftovers = newLeftovers;
+        }
+        def.extendedProps = __assign(leftovers, def.extendedProps || {});
+        // help out EventApi from having user modify props
+        Object.freeze(def.ui.classNames);
+        Object.freeze(def.extendedProps);
+        return def;
+    }
+    function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
+        return {
+            instanceId: String(uid++),
+            defId: defId,
+            range: range,
+            forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
+            forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
+        };
+    }
+    function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
+        var props = pluckDateProps(raw, leftovers);
+        var allDay = props.allDay;
+        var startMeta;
+        var startMarker = null;
+        var hasEnd = false;
+        var endMeta;
+        var endMarker = null;
+        startMeta = calendar.dateEnv.createMarkerMeta(props.start);
+        if (startMeta) {
+            startMarker = startMeta.marker;
+        }
+        else if (!allowOpenRange) {
+            return null;
+        }
+        if (props.end != null) {
+            endMeta = calendar.dateEnv.createMarkerMeta(props.end);
+        }
+        if (allDay == null) {
+            if (allDayDefault != null) {
+                allDay = allDayDefault;
+            }
+            else {
+                // fall back to the date props LAST
+                allDay = (!startMeta || startMeta.isTimeUnspecified) &&
+                    (!endMeta || endMeta.isTimeUnspecified);
+            }
+        }
+        if (allDay && startMarker) {
+            startMarker = startOfDay(startMarker);
+        }
+        if (endMeta) {
+            endMarker = endMeta.marker;
+            if (allDay) {
+                endMarker = startOfDay(endMarker);
+            }
+            if (startMarker && endMarker <= startMarker) {
+                endMarker = null;
+            }
+        }
+        if (endMarker) {
+            hasEnd = true;
+        }
+        else if (!allowOpenRange) {
+            hasEnd = calendar.opt('forceEventDuration') || false;
+            endMarker = calendar.dateEnv.add(startMarker, allDay ?
+                calendar.defaultAllDayEventDuration :
+                calendar.defaultTimedEventDuration);
+        }
+        return {
+            allDay: allDay,
+            hasEnd: hasEnd,
+            range: { start: startMarker, end: endMarker },
+            forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
+            forcedEndTzo: endMeta ? endMeta.forcedTzo : null
+        };
+    }
+    function pluckDateProps(raw, leftovers) {
+        var props = refineProps(raw, DATE_PROPS, {}, leftovers);
+        props.start = (props.start !== null) ? props.start : props.date;
+        delete props.date;
+        return props;
+    }
+    function pluckNonDateProps(raw, calendar, leftovers) {
+        var preLeftovers = {};
+        var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
+        var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
+        props.publicId = props.id;
+        delete props.id;
+        props.ui = ui;
+        return props;
+    }
+    function computeIsAllDayDefault(sourceId, calendar) {
+        var res = null;
+        if (sourceId) {
+            var source = calendar.state.eventSources[sourceId];
+            res = source.allDayDefault;
+        }
+        if (res == null) {
+            res = calendar.opt('allDayDefault');
+        }
+        return res;
+    }
+
+    var DEF_DEFAULTS = {
+        startTime: '09:00',
+        endTime: '17:00',
+        daysOfWeek: [1, 2, 3, 4, 5],
+        rendering: 'inverse-background',
+        classNames: 'fc-nonbusiness',
+        groupId: '_businessHours' // so multiple defs get grouped
+    };
+    /*
+    TODO: pass around as EventDefHash!!!
+    */
+    function parseBusinessHours(input, calendar) {
+        return parseEvents(refineInputs(input), '', calendar);
+    }
+    function refineInputs(input) {
+        var rawDefs;
+        if (input === true) {
+            rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
+        }
+        else if (Array.isArray(input)) {
+            // if specifying an array, every sub-definition NEEDS a day-of-week
+            rawDefs = input.filter(function (rawDef) {
+                return rawDef.daysOfWeek;
+            });
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            rawDefs = [input];
+        }
+        else { // is probably false
+            rawDefs = [];
+        }
+        rawDefs = rawDefs.map(function (rawDef) {
+            return __assign({}, DEF_DEFAULTS, rawDef);
+        });
+        return rawDefs;
+    }
+
+    function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
+        if (dependencies === void 0) { dependencies = []; }
+        var dependents = [];
+        var thisContext;
+        var prevArgs;
+        function unrender() {
+            if (prevArgs) {
+                for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
+                    var dependent = dependents_1[_i];
+                    dependent.unrender();
+                }
+                if (unrenderFunc) {
+                    unrenderFunc.apply(thisContext, prevArgs);
+                }
+                prevArgs = null;
+            }
+        }
+        function res() {
+            if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
+                unrender();
+                thisContext = this;
+                prevArgs = arguments;
+                renderFunc.apply(this, arguments);
+            }
+        }
+        res.dependents = dependents;
+        res.unrender = unrender;
+        for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
+            var dependency = dependencies_1[_i];
+            dependency.dependents.push(res);
+        }
+        return res;
+    }
+
+    function isValuesSimilar(val0, val1, depth) {
+        if (depth === void 0) { depth = 1; }
+        if (val0 === val1) {
+            return true;
+        }
+        else if (Array.isArray(val0) && Array.isArray(val1)) {
+            return isArraysSimilar(val0, val1, depth);
+        }
+        else if (typeof val0 === 'object' && val0 && typeof val1 === 'object' && val1) { // non-null objects
+            return isObjectsSimilar(val0, val1, depth);
+        }
+        else {
+            return false;
+        }
+    }
+    function isArraysSimilar(a0, a1, depth) {
+        if (depth === void 0) { depth = 1; }
+        if (a0 === a1) {
+            return true;
+        }
+        else if (depth > 0) {
+            if (a0.length !== a1.length) {
+                return false;
+            }
+            else {
+                for (var i = 0; i < a0.length; i++) {
+                    if (!isValuesSimilar(a0[i], a1[i], depth - 1)) {
+                        return false;
+                    }
+                }
+                return true;
+            }
+        }
+        else {
+            return false;
+        }
+    }
+    function isObjectsSimilar(obj0, obj1, depth) {
+        if (depth === void 0) { depth = 1; }
+        if (obj0 === obj1) {
+            return true;
+        }
+        else if (depth > 0) {
+            for (var prop in obj0) {
+                if (!(prop in obj1)) {
+                    return false;
+                }
+            }
+            for (var prop in obj1) {
+                if (!(prop in obj0)) {
+                    return false;
+                }
+                else {
+                    if (!isValuesSimilar(obj0[prop], obj1[prop], depth - 1)) {
+                        return false;
+                    }
+                }
+            }
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+    function computeChangedProps(obj0, obj1, depth) {
+        if (depth === void 0) { depth = 1; }
+        var res = {};
+        for (var prop in obj1) {
+            if (!(prop in obj0) ||
+                !isValuesSimilar(obj0[prop], obj1[prop], depth - 1)) {
+                res[prop] = obj1[prop];
+            }
+        }
+        return res;
+    }
+    function anyKeysRemoved(obj0, obj1) {
+        for (var prop in obj0) {
+            if (!(prop in obj1)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
+    var Splitter = /** @class */ (function () {
+        function Splitter() {
+            this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
+            this.splitDateSelection = memoize(this._splitDateSpan);
+            this.splitEventStore = memoize(this._splitEventStore);
+            this.splitIndividualUi = memoize(this._splitIndividualUi);
+            this.splitEventDrag = memoize(this._splitInteraction);
+            this.splitEventResize = memoize(this._splitInteraction);
+            this.eventUiBuilders = {}; // TODO: typescript protection
+        }
+        Splitter.prototype.splitProps = function (props) {
+            var _this = this;
+            var keyInfos = this.getKeyInfo(props);
+            var defKeys = this.getKeysForEventDefs(props.eventStore);
+            var dateSelections = this.splitDateSelection(props.dateSelection);
+            var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
+            var eventStores = this.splitEventStore(props.eventStore, defKeys);
+            var eventDrags = this.splitEventDrag(props.eventDrag);
+            var eventResizes = this.splitEventResize(props.eventResize);
+            var splitProps = {};
+            this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
+                return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
+            });
+            for (var key in keyInfos) {
+                var keyInfo = keyInfos[key];
+                var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
+                var buildEventUi = this.eventUiBuilders[key];
+                splitProps[key] = {
+                    businessHours: keyInfo.businessHours || props.businessHours,
+                    dateSelection: dateSelections[key] || null,
+                    eventStore: eventStore,
+                    eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
+                    eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
+                    eventDrag: eventDrags[key] || null,
+                    eventResize: eventResizes[key] || null
+                };
+            }
+            return splitProps;
+        };
+        Splitter.prototype._splitDateSpan = function (dateSpan) {
+            var dateSpans = {};
+            if (dateSpan) {
+                var keys = this.getKeysForDateSpan(dateSpan);
+                for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
+                    var key = keys_1[_i];
+                    dateSpans[key] = dateSpan;
+                }
+            }
+            return dateSpans;
+        };
+        Splitter.prototype._getKeysForEventDefs = function (eventStore) {
+            var _this = this;
+            return mapHash(eventStore.defs, function (eventDef) {
+                return _this.getKeysForEventDef(eventDef);
+            });
+        };
+        Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
+            var defs = eventStore.defs, instances = eventStore.instances;
+            var splitStores = {};
+            for (var defId in defs) {
+                for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
+                    var key = _a[_i];
+                    if (!splitStores[key]) {
+                        splitStores[key] = createEmptyEventStore();
+                    }
+                    splitStores[key].defs[defId] = defs[defId];
+                }
+            }
+            for (var instanceId in instances) {
+                var instance = instances[instanceId];
+                for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
+                    var key = _c[_b];
+                    if (splitStores[key]) { // must have already been created
+                        splitStores[key].instances[instanceId] = instance;
+                    }
+                }
+            }
+            return splitStores;
+        };
+        Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
+            var splitHashes = {};
+            for (var defId in eventUiBases) {
+                if (defId) { // not the '' key
+                    for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
+                        var key = _a[_i];
+                        if (!splitHashes[key]) {
+                            splitHashes[key] = {};
+                        }
+                        splitHashes[key][defId] = eventUiBases[defId];
+                    }
+                }
+            }
+            return splitHashes;
+        };
+        Splitter.prototype._splitInteraction = function (interaction) {
+            var splitStates = {};
+            if (interaction) {
+                var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
+                );
+                // can't rely on defKeys because event data is mutated
+                var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
+                var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
+                var populate = function (key) {
+                    if (!splitStates[key]) {
+                        splitStates[key] = {
+                            affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
+                            mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
+                            isEvent: interaction.isEvent,
+                            origSeg: interaction.origSeg
+                        };
+                    }
+                };
+                for (var key in affectedStores_1) {
+                    populate(key);
+                }
+                for (var key in mutatedStores_1) {
+                    populate(key);
+                }
+            }
+            return splitStates;
+        };
+        return Splitter;
+    }());
+    function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
+        var baseParts = [];
+        if (allUi) {
+            baseParts.push(allUi);
+        }
+        if (eventUiForKey) {
+            baseParts.push(eventUiForKey);
+        }
+        var stuff = {
+            '': combineEventUis(baseParts)
+        };
+        if (individualUi) {
+            __assign(stuff, individualUi);
+        }
+        return stuff;
+    }
+
+    // Generates HTML for an anchor to another view into the calendar.
+    // Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
+    // `gotoOptions` can either be a DateMarker, or an object with the form:
+    // { date, type, forceOff }
+    // `type` is a view-type like "day" or "week". default value is "day".
+    // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
+    function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
+        var dateEnv = component.dateEnv;
+        var date;
+        var type;
+        var forceOff;
+        var finalOptions;
+        if (gotoOptions instanceof Date) {
+            date = gotoOptions; // a single date-like input
+        }
+        else {
+            date = gotoOptions.date;
+            type = gotoOptions.type;
+            forceOff = gotoOptions.forceOff;
+        }
+        finalOptions = {
+            date: dateEnv.formatIso(date, { omitTime: true }),
+            type: type || 'day'
+        };
+        if (typeof attrs === 'string') {
+            innerHtml = attrs;
+            attrs = null;
+        }
+        attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
+        innerHtml = innerHtml || '';
+        if (!forceOff && component.opt('navLinks')) {
+            return '<a' + attrs +
+                ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
+                innerHtml +
+                '</a>';
+        }
+        else {
+            return '<span' + attrs + '>' +
+                innerHtml +
+                '</span>';
+        }
+    }
+    function getAllDayHtml(component) {
+        return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText'));
+    }
+    // Computes HTML classNames for a single-day element
+    function getDayClasses(date, dateProfile, context, noThemeHighlight) {
+        var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv;
+        var classes = [];
+        var todayStart;
+        var todayEnd;
+        if (!rangeContainsMarker(dateProfile.activeRange, date)) {
+            classes.push('fc-disabled-day');
+        }
+        else {
+            classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
+            if (view.opt('monthMode') &&
+                dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
+                classes.push('fc-other-month');
+            }
+            todayStart = startOfDay(calendar.getNow());
+            todayEnd = addDays(todayStart, 1);
+            if (date < todayStart) {
+                classes.push('fc-past');
+            }
+            else if (date >= todayEnd) {
+                classes.push('fc-future');
+            }
+            else {
+                classes.push('fc-today');
+                if (noThemeHighlight !== true) {
+                    classes.push(theme.getClass('today'));
+                }
+            }
+        }
+        return classes;
+    }
+
+    // given a function that resolves a result asynchronously.
+    // the function can either call passed-in success and failure callbacks,
+    // or it can return a promise.
+    // if you need to pass additional params to func, bind them first.
+    function unpromisify(func, success, failure) {
+        // guard against success/failure callbacks being called more than once
+        // and guard against a promise AND callback being used together.
+        var isResolved = false;
+        var wrappedSuccess = function () {
+            if (!isResolved) {
+                isResolved = true;
+                success.apply(this, arguments);
+            }
+        };
+        var wrappedFailure = function () {
+            if (!isResolved) {
+                isResolved = true;
+                if (failure) {
+                    failure.apply(this, arguments);
+                }
+            }
+        };
+        var res = func(wrappedSuccess, wrappedFailure);
+        if (res && typeof res.then === 'function') {
+            res.then(wrappedSuccess, wrappedFailure);
+        }
+    }
+
+    var Mixin = /** @class */ (function () {
+        function Mixin() {
+        }
+        // mix into a CLASS
+        Mixin.mixInto = function (destClass) {
+            this.mixIntoObj(destClass.prototype);
+        };
+        // mix into ANY object
+        Mixin.mixIntoObj = function (destObj) {
+            var _this = this;
+            Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
+                if (!destObj[name]) { // if destination doesn't already define it
+                    destObj[name] = _this.prototype[name];
+                }
+            });
+        };
+        /*
+        will override existing methods
+        TODO: remove! not used anymore
+        */
+        Mixin.mixOver = function (destClass) {
+            var _this = this;
+            Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
+                destClass.prototype[name] = _this.prototype[name];
+            });
+        };
+        return Mixin;
+    }());
+
+    /*
+    USAGE:
+      import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
+    in class:
+      on: EmitterInterface['on']
+      one: EmitterInterface['one']
+      off: EmitterInterface['off']
+      trigger: EmitterInterface['trigger']
+      triggerWith: EmitterInterface['triggerWith']
+      hasHandlers: EmitterInterface['hasHandlers']
+    after class:
+      EmitterMixin.mixInto(TheClass)
+    */
+    var EmitterMixin = /** @class */ (function (_super) {
+        __extends(EmitterMixin, _super);
+        function EmitterMixin() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        EmitterMixin.prototype.on = function (type, handler) {
+            addToHash(this._handlers || (this._handlers = {}), type, handler);
+            return this; // for chaining
+        };
+        // todo: add comments
+        EmitterMixin.prototype.one = function (type, handler) {
+            addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
+            return this; // for chaining
+        };
+        EmitterMixin.prototype.off = function (type, handler) {
+            if (this._handlers) {
+                removeFromHash(this._handlers, type, handler);
+            }
+            if (this._oneHandlers) {
+                removeFromHash(this._oneHandlers, type, handler);
+            }
+            return this; // for chaining
+        };
+        EmitterMixin.prototype.trigger = function (type) {
+            var args = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                args[_i - 1] = arguments[_i];
+            }
+            this.triggerWith(type, this, args);
+            return this; // for chaining
+        };
+        EmitterMixin.prototype.triggerWith = function (type, context, args) {
+            if (this._handlers) {
+                applyAll(this._handlers[type], context, args);
+            }
+            if (this._oneHandlers) {
+                applyAll(this._oneHandlers[type], context, args);
+                delete this._oneHandlers[type]; // will never fire again
+            }
+            return this; // for chaining
+        };
+        EmitterMixin.prototype.hasHandlers = function (type) {
+            return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
+                (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
+        };
+        return EmitterMixin;
+    }(Mixin));
+    function addToHash(hash, type, handler) {
+        (hash[type] || (hash[type] = []))
+            .push(handler);
+    }
+    function removeFromHash(hash, type, handler) {
+        if (handler) {
+            if (hash[type]) {
+                hash[type] = hash[type].filter(function (func) {
+                    return func !== handler;
+                });
+            }
+        }
+        else {
+            delete hash[type]; // remove all handler funcs for this type
+        }
+    }
+
+    /*
+    Records offset information for a set of elements, relative to an origin element.
+    Can record the left/right OR the top/bottom OR both.
+    Provides methods for querying the cache by position.
+    */
+    var PositionCache = /** @class */ (function () {
+        function PositionCache(originEl, els, isHorizontal, isVertical) {
+            this.originEl = originEl;
+            this.els = els;
+            this.isHorizontal = isHorizontal;
+            this.isVertical = isVertical;
+        }
+        // Queries the els for coordinates and stores them.
+        // Call this method before using and of the get* methods below.
+        PositionCache.prototype.build = function () {
+            var originEl = this.originEl;
+            var originClientRect = this.originClientRect =
+                originEl.getBoundingClientRect(); // relative to viewport top-left
+            if (this.isHorizontal) {
+                this.buildElHorizontals(originClientRect.left);
+            }
+            if (this.isVertical) {
+                this.buildElVerticals(originClientRect.top);
+            }
+        };
+        // Populates the left/right internal coordinate arrays
+        PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
+            var lefts = [];
+            var rights = [];
+            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
+                var el = _a[_i];
+                var rect = el.getBoundingClientRect();
+                lefts.push(rect.left - originClientLeft);
+                rights.push(rect.right - originClientLeft);
+            }
+            this.lefts = lefts;
+            this.rights = rights;
+        };
+        // Populates the top/bottom internal coordinate arrays
+        PositionCache.prototype.buildElVerticals = function (originClientTop) {
+            var tops = [];
+            var bottoms = [];
+            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
+                var el = _a[_i];
+                var rect = el.getBoundingClientRect();
+                tops.push(rect.top - originClientTop);
+                bottoms.push(rect.bottom - originClientTop);
+            }
+            this.tops = tops;
+            this.bottoms = bottoms;
+        };
+        // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
+        // If no intersection is made, returns undefined.
+        PositionCache.prototype.leftToIndex = function (leftPosition) {
+            var lefts = this.lefts;
+            var rights = this.rights;
+            var len = lefts.length;
+            var i;
+            for (i = 0; i < len; i++) {
+                if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
+                    return i;
+                }
+            }
+        };
+        // Given a top offset (from document top), returns the index of the el that it vertically intersects.
+        // If no intersection is made, returns undefined.
+        PositionCache.prototype.topToIndex = function (topPosition) {
+            var tops = this.tops;
+            var bottoms = this.bottoms;
+            var len = tops.length;
+            var i;
+            for (i = 0; i < len; i++) {
+                if (topPosition >= tops[i] && topPosition < bottoms[i]) {
+                    return i;
+                }
+            }
+        };
+        // Gets the width of the element at the given index
+        PositionCache.prototype.getWidth = function (leftIndex) {
+            return this.rights[leftIndex] - this.lefts[leftIndex];
+        };
+        // Gets the height of the element at the given index
+        PositionCache.prototype.getHeight = function (topIndex) {
+            return this.bottoms[topIndex] - this.tops[topIndex];
+        };
+        return PositionCache;
+    }());
+
+    /*
+    An object for getting/setting scroll-related information for an element.
+    Internally, this is done very differently for window versus DOM element,
+    so this object serves as a common interface.
+    */
+    var ScrollController = /** @class */ (function () {
+        function ScrollController() {
+        }
+        ScrollController.prototype.getMaxScrollTop = function () {
+            return this.getScrollHeight() - this.getClientHeight();
+        };
+        ScrollController.prototype.getMaxScrollLeft = function () {
+            return this.getScrollWidth() - this.getClientWidth();
+        };
+        ScrollController.prototype.canScrollVertically = function () {
+            return this.getMaxScrollTop() > 0;
+        };
+        ScrollController.prototype.canScrollHorizontally = function () {
+            return this.getMaxScrollLeft() > 0;
+        };
+        ScrollController.prototype.canScrollUp = function () {
+            return this.getScrollTop() > 0;
+        };
+        ScrollController.prototype.canScrollDown = function () {
+            return this.getScrollTop() < this.getMaxScrollTop();
+        };
+        ScrollController.prototype.canScrollLeft = function () {
+            return this.getScrollLeft() > 0;
+        };
+        ScrollController.prototype.canScrollRight = function () {
+            return this.getScrollLeft() < this.getMaxScrollLeft();
+        };
+        return ScrollController;
+    }());
+    var ElementScrollController = /** @class */ (function (_super) {
+        __extends(ElementScrollController, _super);
+        function ElementScrollController(el) {
+            var _this = _super.call(this) || this;
+            _this.el = el;
+            return _this;
+        }
+        ElementScrollController.prototype.getScrollTop = function () {
+            return this.el.scrollTop;
+        };
+        ElementScrollController.prototype.getScrollLeft = function () {
+            return this.el.scrollLeft;
+        };
+        ElementScrollController.prototype.setScrollTop = function (top) {
+            this.el.scrollTop = top;
+        };
+        ElementScrollController.prototype.setScrollLeft = function (left) {
+            this.el.scrollLeft = left;
+        };
+        ElementScrollController.prototype.getScrollWidth = function () {
+            return this.el.scrollWidth;
+        };
+        ElementScrollController.prototype.getScrollHeight = function () {
+            return this.el.scrollHeight;
+        };
+        ElementScrollController.prototype.getClientHeight = function () {
+            return this.el.clientHeight;
+        };
+        ElementScrollController.prototype.getClientWidth = function () {
+            return this.el.clientWidth;
+        };
+        return ElementScrollController;
+    }(ScrollController));
+    var WindowScrollController = /** @class */ (function (_super) {
+        __extends(WindowScrollController, _super);
+        function WindowScrollController() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        WindowScrollController.prototype.getScrollTop = function () {
+            return window.pageYOffset;
+        };
+        WindowScrollController.prototype.getScrollLeft = function () {
+            return window.pageXOffset;
+        };
+        WindowScrollController.prototype.setScrollTop = function (n) {
+            window.scroll(window.pageXOffset, n);
+        };
+        WindowScrollController.prototype.setScrollLeft = function (n) {
+            window.scroll(n, window.pageYOffset);
+        };
+        WindowScrollController.prototype.getScrollWidth = function () {
+            return document.documentElement.scrollWidth;
+        };
+        WindowScrollController.prototype.getScrollHeight = function () {
+            return document.documentElement.scrollHeight;
+        };
+        WindowScrollController.prototype.getClientHeight = function () {
+            return document.documentElement.clientHeight;
+        };
+        WindowScrollController.prototype.getClientWidth = function () {
+            return document.documentElement.clientWidth;
+        };
+        return WindowScrollController;
+    }(ScrollController));
+
+    /*
+    Embodies a div that has potential scrollbars
+    */
+    var ScrollComponent = /** @class */ (function (_super) {
+        __extends(ScrollComponent, _super);
+        function ScrollComponent(overflowX, overflowY) {
+            var _this = _super.call(this, createElement('div', {
+                className: 'fc-scroller'
+            })) || this;
+            _this.overflowX = overflowX;
+            _this.overflowY = overflowY;
+            _this.applyOverflow();
+            return _this;
+        }
+        // sets to natural height, unlocks overflow
+        ScrollComponent.prototype.clear = function () {
+            this.setHeight('auto');
+            this.applyOverflow();
+        };
+        ScrollComponent.prototype.destroy = function () {
+            removeElement(this.el);
+        };
+        // Overflow
+        // -----------------------------------------------------------------------------------------------------------------
+        ScrollComponent.prototype.applyOverflow = function () {
+            applyStyle(this.el, {
+                overflowX: this.overflowX,
+                overflowY: this.overflowY
+            });
+        };
+        // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
+        // Useful for preserving scrollbar widths regardless of future resizes.
+        // Can pass in scrollbarWidths for optimization.
+        ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
+            var overflowX = this.overflowX;
+            var overflowY = this.overflowY;
+            scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
+            if (overflowX === 'auto') {
+                overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
+                    this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
+                ) ? 'scroll' : 'hidden';
+            }
+            if (overflowY === 'auto') {
+                overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
+                    this.canScrollVertically() // OR scrolling pane with massless scrollbars?
+                ) ? 'scroll' : 'hidden';
+            }
+            applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
+        };
+        ScrollComponent.prototype.setHeight = function (height) {
+            applyStyleProp(this.el, 'height', height);
+        };
+        ScrollComponent.prototype.getScrollbarWidths = function () {
+            var edges = computeEdges(this.el);
+            return {
+                left: edges.scrollbarLeft,
+                right: edges.scrollbarRight,
+                bottom: edges.scrollbarBottom
+            };
+        };
+        return ScrollComponent;
+    }(ElementScrollController));
+
+    var Theme = /** @class */ (function () {
+        function Theme(calendarOptions) {
+            this.calendarOptions = calendarOptions;
+            this.processIconOverride();
+        }
+        Theme.prototype.processIconOverride = function () {
+            if (this.iconOverrideOption) {
+                this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
+            }
+        };
+        Theme.prototype.setIconOverride = function (iconOverrideHash) {
+            var iconClassesCopy;
+            var buttonName;
+            if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
+                iconClassesCopy = __assign({}, this.iconClasses);
+                for (buttonName in iconOverrideHash) {
+                    iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
+                }
+                this.iconClasses = iconClassesCopy;
+            }
+            else if (iconOverrideHash === false) {
+                this.iconClasses = {};
+            }
+        };
+        Theme.prototype.applyIconOverridePrefix = function (className) {
+            var prefix = this.iconOverridePrefix;
+            if (prefix && className.indexOf(prefix) !== 0) { // if not already present
+                className = prefix + className;
+            }
+            return className;
+        };
+        Theme.prototype.getClass = function (key) {
+            return this.classes[key] || '';
+        };
+        Theme.prototype.getIconClass = function (buttonName) {
+            var className = this.iconClasses[buttonName];
+            if (className) {
+                return this.baseIconClass + ' ' + className;
+            }
+            return '';
+        };
+        Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
+            var className;
+            if (this.iconOverrideCustomButtonOption) {
+                className = customButtonProps[this.iconOverrideCustomButtonOption];
+                if (className) {
+                    return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
+                }
+            }
+            return '';
+        };
+        return Theme;
+    }());
+    Theme.prototype.classes = {};
+    Theme.prototype.iconClasses = {};
+    Theme.prototype.baseIconClass = '';
+    Theme.prototype.iconOverridePrefix = '';
+
+    var guid = 0;
+    var Component = /** @class */ (function () {
+        function Component(context, isView) {
+            // HACK to populate view at top of component instantiation call chain
+            if (isView) {
+                context.view = this;
+            }
+            this.uid = String(guid++);
+            this.context = context;
+            this.dateEnv = context.dateEnv;
+            this.theme = context.theme;
+            this.view = context.view;
+            this.calendar = context.calendar;
+            this.isRtl = this.opt('dir') === 'rtl';
+        }
+        Component.addEqualityFuncs = function (newFuncs) {
+            this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
+        };
+        Component.prototype.opt = function (name) {
+            return this.context.options[name];
+        };
+        Component.prototype.receiveProps = function (props) {
+            var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
+            this.props = comboProps;
+            if (anyChanges) {
+                this.render(comboProps);
+            }
+        };
+        Component.prototype.render = function (props) {
+        };
+        // after destroy is called, this component won't ever be used again
+        Component.prototype.destroy = function () {
+        };
+        return Component;
+    }());
+    Component.prototype.equalityFuncs = {};
+    /*
+    Reuses old values when equal. If anything is unequal, returns newProps as-is.
+    Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
+    */
+    function recycleProps(oldProps, newProps, equalityFuncs) {
+        var comboProps = {}; // some old, some new
+        var anyChanges = false;
+        for (var key in newProps) {
+            if (key in oldProps && (oldProps[key] === newProps[key] ||
+                (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
+                // equal to old? use old prop
+                comboProps[key] = oldProps[key];
+            }
+            else {
+                comboProps[key] = newProps[key];
+                anyChanges = true;
+            }
+        }
+        for (var key in oldProps) {
+            if (!(key in newProps)) {
+                anyChanges = true;
+                break;
+            }
+        }
+        return { anyChanges: anyChanges, comboProps: comboProps };
+    }
+
+    /*
+    PURPOSES:
+    - hook up to fg, fill, and mirror renderers
+    - interface for dragging and hits
+    */
+    var DateComponent = /** @class */ (function (_super) {
+        __extends(DateComponent, _super);
+        function DateComponent(context, el, isView) {
+            var _this = _super.call(this, context, isView) || this;
+            _this.el = el;
+            return _this;
+        }
+        DateComponent.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            removeElement(this.el);
+        };
+        // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror)
+        //
+        // Event Drag-n-Drop Rendering (for both events and external elements)
+        // ---------------------------------------------------------------------------------------------------------------
+        /*
+        renderEventDragSegs(state: EventSegUiInteractionState) {
+          if (state) {
+            let { isEvent, segs, sourceSeg } = state
+      
+            if (this.eventRenderer) {
+              this.eventRenderer.hideByHash(state.affectedInstances)
+            }
+      
+            // if the user is dragging something that is considered an event with real event data,
+            // and this component likes to do drag mirrors OR the component where the seg came from
+            // likes to do drag mirrors, then render a drag mirror.
+            if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) {
+              if (this.mirrorRenderer) {
+                this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg })
+              }
+            }
+      
+            // if it would be impossible to render a drag mirror OR this component likes to render
+            // highlights, then render a highlight.
+            if (!isEvent || this.doesDragHighlight) {
+              if (this.fillRenderer) {
+                this.fillRenderer.renderSegs('highlight', segs)
+              }
+            }
+          }
+        }
+        */
+        // Hit System
+        // -----------------------------------------------------------------------------------------------------------------
+        DateComponent.prototype.buildPositionCaches = function () {
+        };
+        DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
+            return null; // this should be abstract
+        };
+        // Validation
+        // -----------------------------------------------------------------------------------------------------------------
+        DateComponent.prototype.isInteractionValid = function (interaction) {
+            var calendar = this.calendar;
+            var dateProfile = this.props.dateProfile; // HACK
+            var instances = interaction.mutatedEvents.instances;
+            if (dateProfile) { // HACK for DayTile
+                for (var instanceId in instances) {
+                    if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
+                        return false;
+                    }
+                }
+            }
+            return isInteractionValid(interaction, calendar);
+        };
+        DateComponent.prototype.isDateSelectionValid = function (selection) {
+            var dateProfile = this.props.dateProfile; // HACK
+            if (dateProfile && // HACK for DayTile
+                !rangeContainsRange(dateProfile.validRange, selection.range)) {
+                return false;
+            }
+            return isDateSelectionValid(selection, this.calendar);
+        };
+        // Triggering
+        // -----------------------------------------------------------------------------------------------------------------
+        // TODO: move to Calendar
+        DateComponent.prototype.publiclyTrigger = function (name, args) {
+            var calendar = this.calendar;
+            return calendar.publiclyTrigger(name, args);
+        };
+        DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) {
+            var calendar = this.calendar;
+            return calendar.publiclyTriggerAfterSizing(name, args);
+        };
+        DateComponent.prototype.hasPublicHandlers = function (name) {
+            var calendar = this.calendar;
+            return calendar.hasPublicHandlers(name);
+        };
+        DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) {
+            var calendar = this.calendar;
+            if (this.hasPublicHandlers('eventPositioned')) {
+                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                    var seg = segs_1[_i];
+                    this.publiclyTriggerAfterSizing('eventPositioned', [
+                        {
+                            event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
+                            isMirror: isMirrors,
+                            isStart: seg.isStart,
+                            isEnd: seg.isEnd,
+                            el: seg.el,
+                            view: this // ?
+                        }
+                    ]);
+                }
+            }
+            if (!calendar.state.loadingLevel) { // avoid initial empty state while pending
+                calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
+            }
+        };
+        DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) {
+            var calendar = this.calendar;
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                calendar.trigger('eventElRemove', seg.el);
+            }
+            if (this.hasPublicHandlers('eventDestroy')) {
+                for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) {
+                    var seg = segs_3[_a];
+                    this.publiclyTrigger('eventDestroy', [
+                        {
+                            event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
+                            isMirror: isMirrors,
+                            el: seg.el,
+                            view: this // ?
+                        }
+                    ]);
+                }
+            }
+        };
+        // Pointer Interaction Utils
+        // -----------------------------------------------------------------------------------------------------------------
+        DateComponent.prototype.isValidSegDownEl = function (el) {
+            return !this.props.eventDrag && // HACK
+                !this.props.eventResize && // HACK
+                !elementClosest(el, '.fc-mirror') &&
+                (this.isPopover() || !this.isInPopover(el));
+            // ^above line ensures we don't detect a seg interaction within a nested component.
+            // it's a HACK because it only supports a popover as the nested component.
+        };
+        DateComponent.prototype.isValidDateDownEl = function (el) {
+            var segEl = elementClosest(el, this.fgSegSelector);
+            return (!segEl || segEl.classList.contains('fc-mirror')) &&
+                !elementClosest(el, '.fc-more') && // a "more.." link
+                !elementClosest(el, 'a[data-goto]') && // a clickable nav link
+                !this.isInPopover(el);
+        };
+        DateComponent.prototype.isPopover = function () {
+            return this.el.classList.contains('fc-popover');
+        };
+        DateComponent.prototype.isInPopover = function (el) {
+            return Boolean(elementClosest(el, '.fc-popover'));
+        };
+        return DateComponent;
+    }(Component));
+    DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
+    DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
+
+    var uid$1 = 0;
+    function createPlugin(input) {
+        return {
+            id: String(uid$1++),
+            deps: input.deps || [],
+            reducers: input.reducers || [],
+            eventDefParsers: input.eventDefParsers || [],
+            eventDragMutationMassagers: input.eventDragMutationMassagers || [],
+            eventDefMutationAppliers: input.eventDefMutationAppliers || [],
+            dateSelectionTransformers: input.dateSelectionTransformers || [],
+            datePointTransforms: input.datePointTransforms || [],
+            dateSpanTransforms: input.dateSpanTransforms || [],
+            views: input.views || {},
+            viewPropsTransformers: input.viewPropsTransformers || [],
+            isPropsValid: input.isPropsValid || null,
+            externalDefTransforms: input.externalDefTransforms || [],
+            eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
+            viewContainerModifiers: input.viewContainerModifiers || [],
+            eventDropTransformers: input.eventDropTransformers || [],
+            componentInteractions: input.componentInteractions || [],
+            calendarInteractions: input.calendarInteractions || [],
+            themeClasses: input.themeClasses || {},
+            eventSourceDefs: input.eventSourceDefs || [],
+            cmdFormatter: input.cmdFormatter,
+            recurringTypes: input.recurringTypes || [],
+            namedTimeZonedImpl: input.namedTimeZonedImpl,
+            defaultView: input.defaultView || '',
+            elementDraggingImpl: input.elementDraggingImpl,
+            optionChangeHandlers: input.optionChangeHandlers || {}
+        };
+    }
+    var PluginSystem = /** @class */ (function () {
+        function PluginSystem() {
+            this.hooks = {
+                reducers: [],
+                eventDefParsers: [],
+                eventDragMutationMassagers: [],
+                eventDefMutationAppliers: [],
+                dateSelectionTransformers: [],
+                datePointTransforms: [],
+                dateSpanTransforms: [],
+                views: {},
+                viewPropsTransformers: [],
+                isPropsValid: null,
+                externalDefTransforms: [],
+                eventResizeJoinTransforms: [],
+                viewContainerModifiers: [],
+                eventDropTransformers: [],
+                componentInteractions: [],
+                calendarInteractions: [],
+                themeClasses: {},
+                eventSourceDefs: [],
+                cmdFormatter: null,
+                recurringTypes: [],
+                namedTimeZonedImpl: null,
+                defaultView: '',
+                elementDraggingImpl: null,
+                optionChangeHandlers: {}
+            };
+            this.addedHash = {};
+        }
+        PluginSystem.prototype.add = function (plugin) {
+            if (!this.addedHash[plugin.id]) {
+                this.addedHash[plugin.id] = true;
+                for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
+                    var dep = _a[_i];
+                    this.add(dep);
+                }
+                this.hooks = combineHooks(this.hooks, plugin);
+            }
+        };
+        return PluginSystem;
+    }());
+    function combineHooks(hooks0, hooks1) {
+        return {
+            reducers: hooks0.reducers.concat(hooks1.reducers),
+            eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
+            eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
+            eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
+            dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
+            datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
+            dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
+            views: __assign({}, hooks0.views, hooks1.views),
+            viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
+            isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
+            externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
+            eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
+            viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
+            eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
+            calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
+            componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
+            themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
+            eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
+            cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
+            recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
+            namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
+            defaultView: hooks0.defaultView || hooks1.defaultView,
+            elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
+            optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
+        };
+    }
+
+    var eventSourceDef = {
+        ignoreRange: true,
+        parseMeta: function (raw) {
+            if (Array.isArray(raw)) { // short form
+                return raw;
+            }
+            else if (Array.isArray(raw.events)) {
+                return raw.events;
+            }
+            return null;
+        },
+        fetch: function (arg, success) {
+            success({
+                rawEvents: arg.eventSource.meta
+            });
+        }
+    };
+    var ArrayEventSourcePlugin = createPlugin({
+        eventSourceDefs: [eventSourceDef]
+    });
+
+    var eventSourceDef$1 = {
+        parseMeta: function (raw) {
+            if (typeof raw === 'function') { // short form
+                return raw;
+            }
+            else if (typeof raw.events === 'function') {
+                return raw.events;
+            }
+            return null;
+        },
+        fetch: function (arg, success, failure) {
+            var dateEnv = arg.calendar.dateEnv;
+            var func = arg.eventSource.meta;
+            unpromisify(func.bind(null, {
+                start: dateEnv.toDate(arg.range.start),
+                end: dateEnv.toDate(arg.range.end),
+                startStr: dateEnv.formatIso(arg.range.start),
+                endStr: dateEnv.formatIso(arg.range.end),
+                timeZone: dateEnv.timeZone
+            }), function (rawEvents) {
+                success({ rawEvents: rawEvents }); // needs an object response
+            }, failure // send errorObj directly to failure callback
+            );
+        }
+    };
+    var FuncEventSourcePlugin = createPlugin({
+        eventSourceDefs: [eventSourceDef$1]
+    });
+
+    function requestJson(method, url, params, successCallback, failureCallback) {
+        method = method.toUpperCase();
+        var body = null;
+        if (method === 'GET') {
+            url = injectQueryStringParams(url, params);
+        }
+        else {
+            body = encodeParams(params);
+        }
+        var xhr = new XMLHttpRequest();
+        xhr.open(method, url, true);
+        if (method !== 'GET') {
+            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+        }
+        xhr.onload = function () {
+            if (xhr.status >= 200 && xhr.status < 400) {
+                try {
+                    var res = JSON.parse(xhr.responseText);
+                    successCallback(res, xhr);
+                }
+                catch (err) {
+                    failureCallback('Failure parsing JSON', xhr);
+                }
+            }
+            else {
+                failureCallback('Request failed', xhr);
+            }
+        };
+        xhr.onerror = function () {
+            failureCallback('Request failed', xhr);
+        };
+        xhr.send(body);
+    }
+    function injectQueryStringParams(url, params) {
+        return url +
+            (url.indexOf('?') === -1 ? '?' : '&') +
+            encodeParams(params);
+    }
+    function encodeParams(params) {
+        var parts = [];
+        for (var key in params) {
+            parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
+        }
+        return parts.join('&');
+    }
+
+    var eventSourceDef$2 = {
+        parseMeta: function (raw) {
+            if (typeof raw === 'string') { // short form
+                raw = { url: raw };
+            }
+            else if (!raw || typeof raw !== 'object' || !raw.url) {
+                return null;
+            }
+            return {
+                url: raw.url,
+                method: (raw.method || 'GET').toUpperCase(),
+                extraParams: raw.extraParams,
+                startParam: raw.startParam,
+                endParam: raw.endParam,
+                timeZoneParam: raw.timeZoneParam
+            };
+        },
+        fetch: function (arg, success, failure) {
+            var meta = arg.eventSource.meta;
+            var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
+            requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
+                success({ rawEvents: rawEvents, xhr: xhr });
+            }, function (errorMessage, xhr) {
+                failure({ message: errorMessage, xhr: xhr });
+            });
+        }
+    };
+    var JsonFeedEventSourcePlugin = createPlugin({
+        eventSourceDefs: [eventSourceDef$2]
+    });
+    function buildRequestParams(meta, range, calendar) {
+        var dateEnv = calendar.dateEnv;
+        var startParam;
+        var endParam;
+        var timeZoneParam;
+        var customRequestParams;
+        var params = {};
+        startParam = meta.startParam;
+        if (startParam == null) {
+            startParam = calendar.opt('startParam');
+        }
+        endParam = meta.endParam;
+        if (endParam == null) {
+            endParam = calendar.opt('endParam');
+        }
+        timeZoneParam = meta.timeZoneParam;
+        if (timeZoneParam == null) {
+            timeZoneParam = calendar.opt('timeZoneParam');
+        }
+        // retrieve any outbound GET/POST data from the options
+        if (typeof meta.extraParams === 'function') {
+            // supplied as a function that returns a key/value object
+            customRequestParams = meta.extraParams();
+        }
+        else {
+            // probably supplied as a straight key/value object
+            customRequestParams = meta.extraParams || {};
+        }
+        __assign(params, customRequestParams);
+        params[startParam] = dateEnv.formatIso(range.start);
+        params[endParam] = dateEnv.formatIso(range.end);
+        if (dateEnv.timeZone !== 'local') {
+            params[timeZoneParam] = dateEnv.timeZone;
+        }
+        return params;
+    }
+
+    var recurring = {
+        parse: function (rawEvent, leftoverProps, dateEnv) {
+            var createMarker = dateEnv.createMarker.bind(dateEnv);
+            var processors = {
+                daysOfWeek: null,
+                startTime: createDuration,
+                endTime: createDuration,
+                startRecur: createMarker,
+                endRecur: createMarker
+            };
+            var props = refineProps(rawEvent, processors, {}, leftoverProps);
+            var anyValid = false;
+            for (var propName in props) {
+                if (props[propName] != null) {
+                    anyValid = true;
+                    break;
+                }
+            }
+            if (anyValid) {
+                return {
+                    allDayGuess: Boolean(!props.startTime && !props.endTime),
+                    duration: (props.startTime && props.endTime) ?
+                        subtractDurations(props.endTime, props.startTime) :
+                        null,
+                    typeData: props // doesn't need endTime anymore but oh well
+                };
+            }
+            return null;
+        },
+        expand: function (typeData, framingRange, dateEnv) {
+            var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
+            if (clippedFramingRange) {
+                return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
+            }
+            else {
+                return [];
+            }
+        }
+    };
+    var SimpleRecurrencePlugin = createPlugin({
+        recurringTypes: [recurring]
+    });
+    function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
+        var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
+        var dayMarker = startOfDay(framingRange.start);
+        var endMarker = framingRange.end;
+        var instanceStarts = [];
+        while (dayMarker < endMarker) {
+            var instanceStart 
+            // if everyday, or this particular day-of-week
+            = void 0;
+            // if everyday, or this particular day-of-week
+            if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
+                if (startTime) {
+                    instanceStart = dateEnv.add(dayMarker, startTime);
+                }
+                else {
+                    instanceStart = dayMarker;
+                }
+                instanceStarts.push(instanceStart);
+            }
+            dayMarker = addDays(dayMarker, 1);
+        }
+        return instanceStarts;
+    }
+
+    var DefaultOptionChangeHandlers = createPlugin({
+        optionChangeHandlers: {
+            events: function (events, calendar) {
+                handleEventSources([events], calendar);
+            },
+            eventSources: handleEventSources,
+            plugins: handlePlugins
+        }
+    });
+    function handleEventSources(inputs, calendar) {
+        var unfoundSources = hashValuesToArray(calendar.state.eventSources);
+        var newInputs = [];
+        for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
+            var input = inputs_1[_i];
+            var inputFound = false;
+            for (var i = 0; i < unfoundSources.length; i++) {
+                if (isValuesSimilar(unfoundSources[i]._raw, input, 2)) {
+                    unfoundSources.splice(i, 1); // delete
+                    inputFound = true;
+                    break;
+                }
+            }
+            if (!inputFound) {
+                newInputs.push(input);
+            }
+        }
+        for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
+            var unfoundSource = unfoundSources_1[_a];
+            calendar.dispatch({
+                type: 'REMOVE_EVENT_SOURCE',
+                sourceId: unfoundSource.sourceId
+            });
+        }
+        for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
+            var newInput = newInputs_1[_b];
+            calendar.addEventSource(newInput);
+        }
+    }
+    // shortcoming: won't remove plugins
+    function handlePlugins(inputs, calendar) {
+        calendar.addPluginInputs(inputs); // will gracefully handle duplicates
+    }
+
+    var config = {}; // TODO: make these options
+    var globalDefaults = {
+        defaultRangeSeparator: ' - ',
+        titleRangeSeparator: ' \u2013 ',
+        defaultTimedEventDuration: '01:00:00',
+        defaultAllDayEventDuration: { day: 1 },
+        forceEventDuration: false,
+        nextDayThreshold: '00:00:00',
+        // display
+        columnHeader: true,
+        defaultView: '',
+        aspectRatio: 1.35,
+        header: {
+            left: 'title',
+            center: '',
+            right: 'today prev,next'
+        },
+        weekends: true,
+        weekNumbers: false,
+        weekNumberCalculation: 'local',
+        editable: false,
+        // nowIndicator: false,
+        scrollTime: '06:00:00',
+        minTime: '00:00:00',
+        maxTime: '24:00:00',
+        showNonCurrentDates: true,
+        // event ajax
+        lazyFetching: true,
+        startParam: 'start',
+        endParam: 'end',
+        timeZoneParam: 'timeZone',
+        timeZone: 'local',
+        // allDayDefault: undefined,
+        // locale
+        locales: [],
+        locale: '',
+        // dir: will get this from the default locale
+        // buttonIcons: null,
+        // allows setting a min-height to the event segment to prevent short events overlapping each other
+        timeGridEventMinHeight: 0,
+        themeSystem: 'standard',
+        // eventResizableFromStart: false,
+        dragRevertDuration: 500,
+        dragScroll: true,
+        allDayMaintainDuration: false,
+        // selectable: false,
+        unselectAuto: true,
+        // selectMinDistance: 0,
+        dropAccept: '*',
+        eventOrder: 'start,-duration,allDay,title',
+        // ^ if start tie, longer events go before shorter. final tie-breaker is title text
+        // rerenderDelay: null,
+        eventLimit: false,
+        eventLimitClick: 'popover',
+        dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
+        handleWindowResize: true,
+        windowResizeDelay: 100,
+        longPressDelay: 1000,
+        eventDragMinDistance: 5 // only applies to mouse
+    };
+    var rtlDefaults = {
+        header: {
+            left: 'next,prev today',
+            center: '',
+            right: 'title'
+        },
+        buttonIcons: {
+            // TODO: make RTL support the responibility of the theme
+            prev: 'fc-icon-chevron-right',
+            next: 'fc-icon-chevron-left',
+            prevYear: 'fc-icon-chevrons-right',
+            nextYear: 'fc-icon-chevrons-left'
+        }
+    };
+    var complexOptions = [
+        'header',
+        'footer',
+        'buttonText',
+        'buttonIcons'
+    ];
+    // Merges an array of option objects into a single object
+    function mergeOptions(optionObjs) {
+        return mergeProps(optionObjs, complexOptions);
+    }
+    // TODO: move this stuff to a "plugin"-related file...
+    var INTERNAL_PLUGINS = [
+        ArrayEventSourcePlugin,
+        FuncEventSourcePlugin,
+        JsonFeedEventSourcePlugin,
+        SimpleRecurrencePlugin,
+        DefaultOptionChangeHandlers
+    ];
+    function refinePluginDefs(pluginInputs) {
+        var plugins = [];
+        for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
+            var pluginInput = pluginInputs_1[_i];
+            if (typeof pluginInput === 'string') {
+                var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
+                if (!window[globalName]) {
+                    console.warn('Plugin file not loaded for ' + pluginInput);
+                }
+                else {
+                    plugins.push(window[globalName].default); // is an ES6 module
+                }
+            }
+            else {
+                plugins.push(pluginInput);
+            }
+        }
+        return INTERNAL_PLUGINS.concat(plugins);
+    }
+
+    var RAW_EN_LOCALE = {
+        code: 'en',
+        week: {
+            dow: 0,
+            doy: 4 // 4 days need to be within the year to be considered the first week
+        },
+        dir: 'ltr',
+        buttonText: {
+            prev: 'prev',
+            next: 'next',
+            prevYear: 'prev year',
+            nextYear: 'next year',
+            year: 'year',
+            today: 'today',
+            month: 'month',
+            week: 'week',
+            day: 'day',
+            list: 'list'
+        },
+        weekLabel: 'W',
+        allDayText: 'all-day',
+        eventLimitText: 'more',
+        noEventsMessage: 'No events to display'
+    };
+    function parseRawLocales(explicitRawLocales) {
+        var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
+        var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
+        var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
+        var allRawLocales = globalArray.concat(// globalArray is low prio
+        hashValuesToArray(globalObject), // medium prio
+        explicitRawLocales // highest prio
+        );
+        var rawLocaleMap = {
+            en: RAW_EN_LOCALE // necessary?
+        };
+        for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
+            var rawLocale = allRawLocales_1[_i];
+            rawLocaleMap[rawLocale.code] = rawLocale;
+        }
+        return {
+            map: rawLocaleMap,
+            defaultCode: defaultCode
+        };
+    }
+    function buildLocale(inputSingular, available) {
+        if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
+            return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
+        }
+        else {
+            return queryLocale(inputSingular, available);
+        }
+    }
+    function queryLocale(codeArg, available) {
+        var codes = [].concat(codeArg || []); // will convert to array
+        var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
+        return parseLocale(codeArg, codes, raw);
+    }
+    function queryRawLocale(codes, available) {
+        for (var i = 0; i < codes.length; i++) {
+            var parts = codes[i].toLocaleLowerCase().split('-');
+            for (var j = parts.length; j > 0; j--) {
+                var simpleId = parts.slice(0, j).join('-');
+                if (available[simpleId]) {
+                    return available[simpleId];
+                }
+            }
+        }
+        return null;
+    }
+    function parseLocale(codeArg, codes, raw) {
+        var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
+        delete merged.code; // don't want this part of the options
+        var week = merged.week;
+        delete merged.week;
+        return {
+            codeArg: codeArg,
+            codes: codes,
+            week: week,
+            simpleNumberFormat: new Intl.NumberFormat(codeArg),
+            options: merged
+        };
+    }
+
+    var OptionsManager = /** @class */ (function () {
+        function OptionsManager(overrides) {
+            this.overrides = __assign({}, overrides); // make a copy
+            this.dynamicOverrides = {};
+            this.compute();
+        }
+        OptionsManager.prototype.add = function (props) {
+            __assign(this.overrides, props);
+            this.compute();
+        };
+        OptionsManager.prototype.addDynamic = function (props) {
+            __assign(this.dynamicOverrides, props);
+            this.compute();
+        };
+        OptionsManager.prototype.reset = function (props) {
+            this.overrides = props;
+            this.compute();
+        };
+        // Computes the flattened options hash for the calendar and assigns to `this.options`.
+        // Assumes this.overrides and this.dynamicOverrides have already been initialized.
+        OptionsManager.prototype.compute = function () {
+            // TODO: not a very efficient system
+            var locales = firstDefined(// explicit locale option given?
+            this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
+            var locale = firstDefined(// explicit locales option given?
+            this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
+            var available = parseRawLocales(locales);
+            var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
+            var dir = firstDefined(// based on options computed so far, is direction RTL?
+            this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
+            var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
+            this.dirDefaults = dirDefaults;
+            this.localeDefaults = localeDefaults;
+            this.computed = mergeOptions([
+                globalDefaults,
+                dirDefaults,
+                localeDefaults,
+                this.overrides,
+                this.dynamicOverrides
+            ]);
+        };
+        return OptionsManager;
+    }());
+
+    var calendarSystemClassMap = {};
+    function registerCalendarSystem(name, theClass) {
+        calendarSystemClassMap[name] = theClass;
+    }
+    function createCalendarSystem(name) {
+        return new calendarSystemClassMap[name]();
+    }
+    var GregorianCalendarSystem = /** @class */ (function () {
+        function GregorianCalendarSystem() {
+        }
+        GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
+            return d.getUTCFullYear();
+        };
+        GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
+            return d.getUTCMonth();
+        };
+        GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
+            return d.getUTCDate();
+        };
+        GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
+            return arrayToUtcDate(arr);
+        };
+        GregorianCalendarSystem.prototype.markerToArray = function (marker) {
+            return dateToUtcArray(marker);
+        };
+        return GregorianCalendarSystem;
+    }());
+    registerCalendarSystem('gregory', GregorianCalendarSystem);
+
+    var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
+    function parse(str) {
+        var m = ISO_RE.exec(str);
+        if (m) {
+            var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
+            if (isValidDate(marker)) {
+                var timeZoneOffset = null;
+                if (m[13]) {
+                    timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
+                        Number(m[18] || 0));
+                }
+                return {
+                    marker: marker,
+                    isTimeUnspecified: !m[6],
+                    timeZoneOffset: timeZoneOffset
+                };
+            }
+        }
+        return null;
+    }
+
+    var DateEnv = /** @class */ (function () {
+        function DateEnv(settings) {
+            var timeZone = this.timeZone = settings.timeZone;
+            var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
+            if (settings.namedTimeZoneImpl && isNamedTimeZone) {
+                this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
+            }
+            this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
+            this.calendarSystem = createCalendarSystem(settings.calendarSystem);
+            this.locale = settings.locale;
+            this.weekDow = settings.locale.week.dow;
+            this.weekDoy = settings.locale.week.doy;
+            if (settings.weekNumberCalculation === 'ISO') {
+                this.weekDow = 1;
+                this.weekDoy = 4;
+            }
+            else if (typeof settings.firstDay === 'number') {
+                this.weekDow = settings.firstDay;
+            }
+            if (typeof settings.weekNumberCalculation === 'function') {
+                this.weekNumberFunc = settings.weekNumberCalculation;
+            }
+            this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
+            this.cmdFormatter = settings.cmdFormatter;
+        }
+        // Creating / Parsing
+        DateEnv.prototype.createMarker = function (input) {
+            var meta = this.createMarkerMeta(input);
+            if (meta === null) {
+                return null;
+            }
+            return meta.marker;
+        };
+        DateEnv.prototype.createNowMarker = function () {
+            if (this.canComputeOffset) {
+                return this.timestampToMarker(new Date().valueOf());
+            }
+            else {
+                // if we can't compute the current date val for a timezone,
+                // better to give the current local date vals than UTC
+                return arrayToUtcDate(dateToLocalArray(new Date()));
+            }
+        };
+        DateEnv.prototype.createMarkerMeta = function (input) {
+            if (typeof input === 'string') {
+                return this.parse(input);
+            }
+            var marker = null;
+            if (typeof input === 'number') {
+                marker = this.timestampToMarker(input);
+            }
+            else if (input instanceof Date) {
+                input = input.valueOf();
+                if (!isNaN(input)) {
+                    marker = this.timestampToMarker(input);
+                }
+            }
+            else if (Array.isArray(input)) {
+                marker = arrayToUtcDate(input);
+            }
+            if (marker === null || !isValidDate(marker)) {
+                return null;
+            }
+            return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
+        };
+        DateEnv.prototype.parse = function (s) {
+            var parts = parse(s);
+            if (parts === null) {
+                return null;
+            }
+            var marker = parts.marker;
+            var forcedTzo = null;
+            if (parts.timeZoneOffset !== null) {
+                if (this.canComputeOffset) {
+                    marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
+                }
+                else {
+                    forcedTzo = parts.timeZoneOffset;
+                }
+            }
+            return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
+        };
+        // Accessors
+        DateEnv.prototype.getYear = function (marker) {
+            return this.calendarSystem.getMarkerYear(marker);
+        };
+        DateEnv.prototype.getMonth = function (marker) {
+            return this.calendarSystem.getMarkerMonth(marker);
+        };
+        // Adding / Subtracting
+        DateEnv.prototype.add = function (marker, dur) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[0] += dur.years;
+            a[1] += dur.months;
+            a[2] += dur.days;
+            a[6] += dur.milliseconds;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        DateEnv.prototype.subtract = function (marker, dur) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[0] -= dur.years;
+            a[1] -= dur.months;
+            a[2] -= dur.days;
+            a[6] -= dur.milliseconds;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        DateEnv.prototype.addYears = function (marker, n) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[0] += n;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        DateEnv.prototype.addMonths = function (marker, n) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[1] += n;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        // Diffing Whole Units
+        DateEnv.prototype.diffWholeYears = function (m0, m1) {
+            var calendarSystem = this.calendarSystem;
+            if (timeAsMs(m0) === timeAsMs(m1) &&
+                calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
+                calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
+                return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
+            }
+            return null;
+        };
+        DateEnv.prototype.diffWholeMonths = function (m0, m1) {
+            var calendarSystem = this.calendarSystem;
+            if (timeAsMs(m0) === timeAsMs(m1) &&
+                calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
+                return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
+                    (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
+            }
+            return null;
+        };
+        // Range / Duration
+        DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
+            var n = this.diffWholeYears(m0, m1);
+            if (n !== null) {
+                return { unit: 'year', value: n };
+            }
+            n = this.diffWholeMonths(m0, m1);
+            if (n !== null) {
+                return { unit: 'month', value: n };
+            }
+            n = diffWholeWeeks(m0, m1);
+            if (n !== null) {
+                return { unit: 'week', value: n };
+            }
+            n = diffWholeDays(m0, m1);
+            if (n !== null) {
+                return { unit: 'day', value: n };
+            }
+            n = diffHours(m0, m1);
+            if (isInt(n)) {
+                return { unit: 'hour', value: n };
+            }
+            n = diffMinutes(m0, m1);
+            if (isInt(n)) {
+                return { unit: 'minute', value: n };
+            }
+            n = diffSeconds(m0, m1);
+            if (isInt(n)) {
+                return { unit: 'second', value: n };
+            }
+            return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
+        };
+        DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
+            // TODO: can use greatestWholeUnit
+            var diff;
+            if (d.years) {
+                diff = this.diffWholeYears(m0, m1);
+                if (diff !== null) {
+                    return diff / asRoughYears(d);
+                }
+            }
+            if (d.months) {
+                diff = this.diffWholeMonths(m0, m1);
+                if (diff !== null) {
+                    return diff / asRoughMonths(d);
+                }
+            }
+            if (d.days) {
+                diff = diffWholeDays(m0, m1);
+                if (diff !== null) {
+                    return diff / asRoughDays(d);
+                }
+            }
+            return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
+        };
+        // Start-Of
+        DateEnv.prototype.startOf = function (m, unit) {
+            if (unit === 'year') {
+                return this.startOfYear(m);
+            }
+            else if (unit === 'month') {
+                return this.startOfMonth(m);
+            }
+            else if (unit === 'week') {
+                return this.startOfWeek(m);
+            }
+            else if (unit === 'day') {
+                return startOfDay(m);
+            }
+            else if (unit === 'hour') {
+                return startOfHour(m);
+            }
+            else if (unit === 'minute') {
+                return startOfMinute(m);
+            }
+            else if (unit === 'second') {
+                return startOfSecond(m);
+            }
+        };
+        DateEnv.prototype.startOfYear = function (m) {
+            return this.calendarSystem.arrayToMarker([
+                this.calendarSystem.getMarkerYear(m)
+            ]);
+        };
+        DateEnv.prototype.startOfMonth = function (m) {
+            return this.calendarSystem.arrayToMarker([
+                this.calendarSystem.getMarkerYear(m),
+                this.calendarSystem.getMarkerMonth(m)
+            ]);
+        };
+        DateEnv.prototype.startOfWeek = function (m) {
+            return this.calendarSystem.arrayToMarker([
+                this.calendarSystem.getMarkerYear(m),
+                this.calendarSystem.getMarkerMonth(m),
+                m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
+            ]);
+        };
+        // Week Number
+        DateEnv.prototype.computeWeekNumber = function (marker) {
+            if (this.weekNumberFunc) {
+                return this.weekNumberFunc(this.toDate(marker));
+            }
+            else {
+                return weekOfYear(marker, this.weekDow, this.weekDoy);
+            }
+        };
+        // TODO: choke on timeZoneName: long
+        DateEnv.prototype.format = function (marker, formatter, dateOptions) {
+            if (dateOptions === void 0) { dateOptions = {}; }
+            return formatter.format({
+                marker: marker,
+                timeZoneOffset: dateOptions.forcedTzo != null ?
+                    dateOptions.forcedTzo :
+                    this.offsetForMarker(marker)
+            }, this);
+        };
+        DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
+            if (dateOptions === void 0) { dateOptions = {}; }
+            if (dateOptions.isEndExclusive) {
+                end = addMs(end, -1);
+            }
+            return formatter.formatRange({
+                marker: start,
+                timeZoneOffset: dateOptions.forcedStartTzo != null ?
+                    dateOptions.forcedStartTzo :
+                    this.offsetForMarker(start)
+            }, {
+                marker: end,
+                timeZoneOffset: dateOptions.forcedEndTzo != null ?
+                    dateOptions.forcedEndTzo :
+                    this.offsetForMarker(end)
+            }, this);
+        };
+        DateEnv.prototype.formatIso = function (marker, extraOptions) {
+            if (extraOptions === void 0) { extraOptions = {}; }
+            var timeZoneOffset = null;
+            if (!extraOptions.omitTimeZoneOffset) {
+                if (extraOptions.forcedTzo != null) {
+                    timeZoneOffset = extraOptions.forcedTzo;
+                }
+                else {
+                    timeZoneOffset = this.offsetForMarker(marker);
+                }
+            }
+            return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
+        };
+        // TimeZone
+        DateEnv.prototype.timestampToMarker = function (ms) {
+            if (this.timeZone === 'local') {
+                return arrayToUtcDate(dateToLocalArray(new Date(ms)));
+            }
+            else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
+                return new Date(ms);
+            }
+            else {
+                return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
+            }
+        };
+        DateEnv.prototype.offsetForMarker = function (m) {
+            if (this.timeZone === 'local') {
+                return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
+            }
+            else if (this.timeZone === 'UTC') {
+                return 0;
+            }
+            else if (this.namedTimeZoneImpl) {
+                return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
+            }
+            return null;
+        };
+        // Conversion
+        DateEnv.prototype.toDate = function (m, forcedTzo) {
+            if (this.timeZone === 'local') {
+                return arrayToLocalDate(dateToUtcArray(m));
+            }
+            else if (this.timeZone === 'UTC') {
+                return new Date(m.valueOf()); // make sure it's a copy
+            }
+            else if (!this.namedTimeZoneImpl) {
+                return new Date(m.valueOf() - (forcedTzo || 0));
+            }
+            else {
+                return new Date(m.valueOf() -
+                    this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
+                );
+            }
+        };
+        return DateEnv;
+    }());
+
+    var SIMPLE_SOURCE_PROPS = {
+        id: String,
+        allDayDefault: Boolean,
+        eventDataTransform: Function,
+        success: Function,
+        failure: Function
+    };
+    var uid$2 = 0;
+    function doesSourceNeedRange(eventSource, calendar) {
+        var defs = calendar.pluginSystem.hooks.eventSourceDefs;
+        return !defs[eventSource.sourceDefId].ignoreRange;
+    }
+    function parseEventSource(raw, calendar) {
+        var defs = calendar.pluginSystem.hooks.eventSourceDefs;
+        for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
+            var def = defs[i];
+            var meta = def.parseMeta(raw);
+            if (meta) {
+                var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
+                res._raw = freezeRaw(raw);
+                return res;
+            }
+        }
+        return null;
+    }
+    function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
+        var leftovers0 = {};
+        var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
+        var leftovers1 = {};
+        var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
+        props.isFetching = false;
+        props.latestFetchId = '';
+        props.fetchRange = null;
+        props.publicId = String(raw.id || '');
+        props.sourceId = String(uid$2++);
+        props.sourceDefId = sourceDefId;
+        props.meta = meta;
+        props.ui = ui;
+        props.extendedProps = leftovers1;
+        return props;
+    }
+
+    function reduceEventSources (eventSources, action, dateProfile, calendar) {
+        switch (action.type) {
+            case 'ADD_EVENT_SOURCES': // already parsed
+                return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
+            case 'REMOVE_EVENT_SOURCE':
+                return removeSource(eventSources, action.sourceId);
+            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+            case 'NEXT':
+            case 'SET_DATE':
+            case 'SET_VIEW_TYPE':
+                if (dateProfile) {
+                    return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
+                }
+                else {
+                    return eventSources;
+                }
+            case 'FETCH_EVENT_SOURCES':
+            case 'CHANGE_TIMEZONE':
+                return fetchSourcesByIds(eventSources, action.sourceIds ?
+                    arrayToHash(action.sourceIds) :
+                    excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
+            case 'RECEIVE_EVENTS':
+            case 'RECEIVE_EVENT_ERROR':
+                return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
+            case 'REMOVE_ALL_EVENT_SOURCES':
+                return {};
+            default:
+                return eventSources;
+        }
+    }
+    var uid$3 = 0;
+    function addSources(eventSourceHash, sources, fetchRange, calendar) {
+        var hash = {};
+        for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
+            var source = sources_1[_i];
+            hash[source.sourceId] = source;
+        }
+        if (fetchRange) {
+            hash = fetchDirtySources(hash, fetchRange, calendar);
+        }
+        return __assign({}, eventSourceHash, hash);
+    }
+    function removeSource(eventSourceHash, sourceId) {
+        return filterHash(eventSourceHash, function (eventSource) {
+            return eventSource.sourceId !== sourceId;
+        });
+    }
+    function fetchDirtySources(sourceHash, fetchRange, calendar) {
+        return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
+            return isSourceDirty(eventSource, fetchRange, calendar);
+        }), fetchRange, calendar);
+    }
+    function isSourceDirty(eventSource, fetchRange, calendar) {
+        if (!doesSourceNeedRange(eventSource, calendar)) {
+            return !eventSource.latestFetchId;
+        }
+        else {
+            return !calendar.opt('lazyFetching') ||
+                !eventSource.fetchRange ||
+                fetchRange.start < eventSource.fetchRange.start ||
+                fetchRange.end > eventSource.fetchRange.end;
+        }
+    }
+    function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
+        var nextSources = {};
+        for (var sourceId in prevSources) {
+            var source = prevSources[sourceId];
+            if (sourceIdHash[sourceId]) {
+                nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
+            }
+            else {
+                nextSources[sourceId] = source;
+            }
+        }
+        return nextSources;
+    }
+    function fetchSource(eventSource, fetchRange, calendar) {
+        var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
+        var fetchId = String(uid$3++);
+        sourceDef.fetch({
+            eventSource: eventSource,
+            calendar: calendar,
+            range: fetchRange
+        }, function (res) {
+            var rawEvents = res.rawEvents;
+            var calSuccess = calendar.opt('eventSourceSuccess');
+            var calSuccessRes;
+            var sourceSuccessRes;
+            if (eventSource.success) {
+                sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
+            }
+            if (calSuccess) {
+                calSuccessRes = calSuccess(rawEvents, res.xhr);
+            }
+            rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
+            calendar.dispatch({
+                type: 'RECEIVE_EVENTS',
+                sourceId: eventSource.sourceId,
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                rawEvents: rawEvents
+            });
+        }, function (error) {
+            var callFailure = calendar.opt('eventSourceFailure');
+            console.warn(error.message, error);
+            if (eventSource.failure) {
+                eventSource.failure(error);
+            }
+            if (callFailure) {
+                callFailure(error);
+            }
+            calendar.dispatch({
+                type: 'RECEIVE_EVENT_ERROR',
+                sourceId: eventSource.sourceId,
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                error: error
+            });
+        });
+        return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
+    }
+    function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
+        var _a;
+        var eventSource = sourceHash[sourceId];
+        if (eventSource && // not already removed
+            fetchId === eventSource.latestFetchId) {
+            return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a));
+        }
+        return sourceHash;
+    }
+    function excludeStaticSources(eventSources, calendar) {
+        return filterHash(eventSources, function (eventSource) {
+            return doesSourceNeedRange(eventSource, calendar);
+        });
+    }
+
+    var DateProfileGenerator = /** @class */ (function () {
+        function DateProfileGenerator(viewSpec, calendar) {
+            this.viewSpec = viewSpec;
+            this.options = viewSpec.options;
+            this.dateEnv = calendar.dateEnv;
+            this.calendar = calendar;
+            this.initHiddenDays();
+        }
+        /* Date Range Computation
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Builds a structure with info about what the dates/ranges will be for the "prev" view.
+        DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
+            var dateEnv = this.dateEnv;
+            var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
+            currentDateProfile.dateIncrement);
+            return this.build(prevDate, -1);
+        };
+        // Builds a structure with info about what the dates/ranges will be for the "next" view.
+        DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
+            var dateEnv = this.dateEnv;
+            var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
+            currentDateProfile.dateIncrement);
+            return this.build(nextDate, 1);
+        };
+        // Builds a structure holding dates/ranges for rendering around the given date.
+        // Optional direction param indicates whether the date is being incremented/decremented
+        // from its previous value. decremented = -1, incremented = 1 (default).
+        DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
+            if (forceToValid === void 0) { forceToValid = false; }
+            var validRange;
+            var minTime = null;
+            var maxTime = null;
+            var currentInfo;
+            var isRangeAllDay;
+            var renderRange;
+            var activeRange;
+            var isValid;
+            validRange = this.buildValidRange();
+            validRange = this.trimHiddenDays(validRange);
+            if (forceToValid) {
+                currentDate = constrainMarkerToRange(currentDate, validRange);
+            }
+            currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
+            isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
+            renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
+            renderRange = this.trimHiddenDays(renderRange);
+            activeRange = renderRange;
+            if (!this.options.showNonCurrentDates) {
+                activeRange = intersectRanges(activeRange, currentInfo.range);
+            }
+            minTime = createDuration(this.options.minTime);
+            maxTime = createDuration(this.options.maxTime);
+            activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
+            activeRange = intersectRanges(activeRange, validRange); // might return null
+            // it's invalid if the originally requested date is not contained,
+            // or if the range is completely outside of the valid range.
+            isValid = rangesIntersect(currentInfo.range, validRange);
+            return {
+                // constraint for where prev/next operations can go and where events can be dragged/resized to.
+                // an object with optional start and end properties.
+                validRange: validRange,
+                // range the view is formally responsible for.
+                // for example, a month view might have 1st-31st, excluding padded dates
+                currentRange: currentInfo.range,
+                // name of largest unit being displayed, like "month" or "week"
+                currentRangeUnit: currentInfo.unit,
+                isRangeAllDay: isRangeAllDay,
+                // dates that display events and accept drag-n-drop
+                // will be `null` if no dates accept events
+                activeRange: activeRange,
+                // date range with a rendered skeleton
+                // includes not-active days that need some sort of DOM
+                renderRange: renderRange,
+                // Duration object that denotes the first visible time of any given day
+                minTime: minTime,
+                // Duration object that denotes the exclusive visible end time of any given day
+                maxTime: maxTime,
+                isValid: isValid,
+                // how far the current date will move for a prev/next operation
+                dateIncrement: this.buildDateIncrement(currentInfo.duration)
+                // pass a fallback (might be null) ^
+            };
+        };
+        // Builds an object with optional start/end properties.
+        // Indicates the minimum/maximum dates to display.
+        // not responsible for trimming hidden days.
+        DateProfileGenerator.prototype.buildValidRange = function () {
+            return this.getRangeOption('validRange', this.calendar.getNow()) ||
+                { start: null, end: null }; // completely open-ended
+        };
+        // Builds a structure with info about the "current" range, the range that is
+        // highlighted as being the current month for example.
+        // See build() for a description of `direction`.
+        // Guaranteed to have `range` and `unit` properties. `duration` is optional.
+        DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
+            var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
+            var duration = null;
+            var unit = null;
+            var range = null;
+            var dayCount;
+            if (viewSpec.duration) {
+                duration = viewSpec.duration;
+                unit = viewSpec.durationUnit;
+                range = this.buildRangeFromDuration(date, direction, duration, unit);
+            }
+            else if ((dayCount = this.options.dayCount)) {
+                unit = 'day';
+                range = this.buildRangeFromDayCount(date, direction, dayCount);
+            }
+            else if ((range = this.buildCustomVisibleRange(date))) {
+                unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
+            }
+            else {
+                duration = this.getFallbackDuration();
+                unit = greatestDurationDenominator(duration).unit;
+                range = this.buildRangeFromDuration(date, direction, duration, unit);
+            }
+            return { duration: duration, unit: unit, range: range };
+        };
+        DateProfileGenerator.prototype.getFallbackDuration = function () {
+            return createDuration({ day: 1 });
+        };
+        // Returns a new activeRange to have time values (un-ambiguate)
+        // minTime or maxTime causes the range to expand.
+        DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
+            var dateEnv = this.dateEnv;
+            var start = range.start;
+            var end = range.end;
+            if (this.viewSpec.class.prototype.usesMinMaxTime) {
+                // expand active range if minTime is negative (why not when positive?)
+                if (asRoughDays(minTime) < 0) {
+                    start = startOfDay(start); // necessary?
+                    start = dateEnv.add(start, minTime);
+                }
+                // expand active range if maxTime is beyond one day (why not when positive?)
+                if (asRoughDays(maxTime) > 1) {
+                    end = startOfDay(end); // necessary?
+                    end = addDays(end, -1);
+                    end = dateEnv.add(end, maxTime);
+                }
+            }
+            return { start: start, end: end };
+        };
+        // Builds the "current" range when it is specified as an explicit duration.
+        // `unit` is the already-computed greatestDurationDenominator unit of duration.
+        DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
+            var dateEnv = this.dateEnv;
+            var alignment = this.options.dateAlignment;
+            var dateIncrementInput;
+            var dateIncrementDuration;
+            var start;
+            var end;
+            var res;
+            // compute what the alignment should be
+            if (!alignment) {
+                dateIncrementInput = this.options.dateIncrement;
+                if (dateIncrementInput) {
+                    dateIncrementDuration = createDuration(dateIncrementInput);
+                    // use the smaller of the two units
+                    if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
+                        alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
+                    }
+                    else {
+                        alignment = unit;
+                    }
+                }
+                else {
+                    alignment = unit;
+                }
+            }
+            // if the view displays a single day or smaller
+            if (asRoughDays(duration) <= 1) {
+                if (this.isHiddenDay(start)) {
+                    start = this.skipHiddenDays(start, direction);
+                    start = startOfDay(start);
+                }
+            }
+            function computeRes() {
+                start = dateEnv.startOf(date, alignment);
+                end = dateEnv.add(start, duration);
+                res = { start: start, end: end };
+            }
+            computeRes();
+            // if range is completely enveloped by hidden days, go past the hidden days
+            if (!this.trimHiddenDays(res)) {
+                date = this.skipHiddenDays(date, direction);
+                computeRes();
+            }
+            return res;
+        };
+        // Builds the "current" range when a dayCount is specified.
+        DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
+            var dateEnv = this.dateEnv;
+            var customAlignment = this.options.dateAlignment;
+            var runningCount = 0;
+            var start = date;
+            var end;
+            if (customAlignment) {
+                start = dateEnv.startOf(start, customAlignment);
+            }
+            start = startOfDay(start);
+            start = this.skipHiddenDays(start, direction);
+            end = start;
+            do {
+                end = addDays(end, 1);
+                if (!this.isHiddenDay(end)) {
+                    runningCount++;
+                }
+            } while (runningCount < dayCount);
+            return { start: start, end: end };
+        };
+        // Builds a normalized range object for the "visible" range,
+        // which is a way to define the currentRange and activeRange at the same time.
+        DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
+            var dateEnv = this.dateEnv;
+            var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
+            if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
+                return null;
+            }
+            return visibleRange;
+        };
+        // Computes the range that will represent the element/cells for *rendering*,
+        // but which may have voided days/times.
+        // not responsible for trimming hidden days.
+        DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
+            return currentRange;
+        };
+        // Compute the duration value that should be added/substracted to the current date
+        // when a prev/next operation happens.
+        DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
+            var dateIncrementInput = this.options.dateIncrement;
+            var customAlignment;
+            if (dateIncrementInput) {
+                return createDuration(dateIncrementInput);
+            }
+            else if ((customAlignment = this.options.dateAlignment)) {
+                return createDuration(1, customAlignment);
+            }
+            else if (fallback) {
+                return fallback;
+            }
+            else {
+                return createDuration({ days: 1 });
+            }
+        };
+        // Arguments after name will be forwarded to a hypothetical function value
+        // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
+        // Always clone your objects if you fear mutation.
+        DateProfileGenerator.prototype.getRangeOption = function (name) {
+            var otherArgs = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                otherArgs[_i - 1] = arguments[_i];
+            }
+            var val = this.options[name];
+            if (typeof val === 'function') {
+                val = val.apply(null, otherArgs);
+            }
+            if (val) {
+                val = parseRange(val, this.dateEnv);
+            }
+            if (val) {
+                val = computeVisibleDayRange(val);
+            }
+            return val;
+        };
+        /* Hidden Days
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Initializes internal variables related to calculating hidden days-of-week
+        DateProfileGenerator.prototype.initHiddenDays = function () {
+            var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
+            var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
+            var dayCnt = 0;
+            var i;
+            if (this.options.weekends === false) {
+                hiddenDays.push(0, 6); // 0=sunday, 6=saturday
+            }
+            for (i = 0; i < 7; i++) {
+                if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
+                    dayCnt++;
+                }
+            }
+            if (!dayCnt) {
+                throw new Error('invalid hiddenDays'); // all days were hidden? bad.
+            }
+            this.isHiddenDayHash = isHiddenDayHash;
+        };
+        // Remove days from the beginning and end of the range that are computed as hidden.
+        // If the whole range is trimmed off, returns null
+        DateProfileGenerator.prototype.trimHiddenDays = function (range) {
+            var start = range.start;
+            var end = range.end;
+            if (start) {
+                start = this.skipHiddenDays(start);
+            }
+            if (end) {
+                end = this.skipHiddenDays(end, -1, true);
+            }
+            if (start == null || end == null || start < end) {
+                return { start: start, end: end };
+            }
+            return null;
+        };
+        // Is the current day hidden?
+        // `day` is a day-of-week index (0-6), or a Date (used for UTC)
+        DateProfileGenerator.prototype.isHiddenDay = function (day) {
+            if (day instanceof Date) {
+                day = day.getUTCDay();
+            }
+            return this.isHiddenDayHash[day];
+        };
+        // Incrementing the current day until it is no longer a hidden day, returning a copy.
+        // DOES NOT CONSIDER validRange!
+        // If the initial value of `date` is not a hidden day, don't do anything.
+        // Pass `isExclusive` as `true` if you are dealing with an end date.
+        // `inc` defaults to `1` (increment one day forward each time)
+        DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
+            if (inc === void 0) { inc = 1; }
+            if (isExclusive === void 0) { isExclusive = false; }
+            while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
+                date = addDays(date, inc);
+            }
+            return date;
+        };
+        return DateProfileGenerator;
+    }());
+    // TODO: find a way to avoid comparing DateProfiles. it's tedious
+    function isDateProfilesEqual(p0, p1) {
+        return rangesEqual(p0.activeRange, p1.activeRange) &&
+            rangesEqual(p0.validRange, p1.validRange) &&
+            durationsEqual(p0.minTime, p1.minTime) &&
+            durationsEqual(p0.maxTime, p1.maxTime);
+    }
+
+    function reduce (state, action, calendar) {
+        var viewType = reduceViewType(state.viewType, action);
+        var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
+        var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
+        var nextState = __assign({}, state, { viewType: viewType,
+            dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
+        for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
+            var reducerFunc = _a[_i];
+            nextState = reducerFunc(nextState, action, calendar);
+        }
+        // console.log(action.type, nextState)
+        return nextState;
+    }
+    function reduceViewType(currentViewType, action) {
+        switch (action.type) {
+            case 'SET_VIEW_TYPE':
+                return action.viewType;
+            default:
+                return currentViewType;
+        }
+    }
+    function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
+        var newDateProfile;
+        switch (action.type) {
+            case 'PREV':
+                newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
+                break;
+            case 'NEXT':
+                newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
+                break;
+            case 'SET_DATE':
+                if (!currentDateProfile.activeRange ||
+                    !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
+                    newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
+                    );
+                }
+                break;
+            case 'SET_VIEW_TYPE':
+                var generator = calendar.dateProfileGenerators[viewType];
+                if (!generator) {
+                    throw new Error(viewType ?
+                        'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
+                        'No available FullCalendar view plugins.');
+                }
+                newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
+                );
+                break;
+        }
+        if (newDateProfile &&
+            newDateProfile.isValid &&
+            !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
+            return newDateProfile;
+        }
+        else {
+            return currentDateProfile;
+        }
+    }
+    function reduceCurrentDate(currentDate, action, dateProfile) {
+        switch (action.type) {
+            case 'PREV':
+            case 'NEXT':
+                if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
+                    return dateProfile.currentRange.start;
+                }
+                else {
+                    return currentDate;
+                }
+            case 'SET_DATE':
+            case 'SET_VIEW_TYPE':
+                var newDate = action.dateMarker || currentDate;
+                if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
+                    return dateProfile.currentRange.start;
+                }
+                else {
+                    return newDate;
+                }
+            default:
+                return currentDate;
+        }
+    }
+    function reduceDateSelection(currentSelection, action, calendar) {
+        switch (action.type) {
+            case 'SELECT_DATES':
+                return action.selection;
+            case 'UNSELECT_DATES':
+                return null;
+            default:
+                return currentSelection;
+        }
+    }
+    function reduceSelectedEvent(currentInstanceId, action) {
+        switch (action.type) {
+            case 'SELECT_EVENT':
+                return action.eventInstanceId;
+            case 'UNSELECT_EVENT':
+                return '';
+            default:
+                return currentInstanceId;
+        }
+    }
+    function reduceEventDrag(currentDrag, action, sources, calendar) {
+        switch (action.type) {
+            case 'SET_EVENT_DRAG':
+                var newDrag = action.state;
+                return {
+                    affectedEvents: newDrag.affectedEvents,
+                    mutatedEvents: newDrag.mutatedEvents,
+                    isEvent: newDrag.isEvent,
+                    origSeg: newDrag.origSeg
+                };
+            case 'UNSET_EVENT_DRAG':
+                return null;
+            default:
+                return currentDrag;
+        }
+    }
+    function reduceEventResize(currentResize, action, sources, calendar) {
+        switch (action.type) {
+            case 'SET_EVENT_RESIZE':
+                var newResize = action.state;
+                return {
+                    affectedEvents: newResize.affectedEvents,
+                    mutatedEvents: newResize.mutatedEvents,
+                    isEvent: newResize.isEvent,
+                    origSeg: newResize.origSeg
+                };
+            case 'UNSET_EVENT_RESIZE':
+                return null;
+            default:
+                return currentResize;
+        }
+    }
+    function computeLoadingLevel(eventSources) {
+        var cnt = 0;
+        for (var sourceId in eventSources) {
+            if (eventSources[sourceId].isFetching) {
+                cnt++;
+            }
+        }
+        return cnt;
+    }
+
+    var STANDARD_PROPS = {
+        start: null,
+        end: null,
+        allDay: Boolean
+    };
+    function parseDateSpan(raw, dateEnv, defaultDuration) {
+        var span = parseOpenDateSpan(raw, dateEnv);
+        var range = span.range;
+        if (!range.start) {
+            return null;
+        }
+        if (!range.end) {
+            if (defaultDuration == null) {
+                return null;
+            }
+            else {
+                range.end = dateEnv.add(range.start, defaultDuration);
+            }
+        }
+        return span;
+    }
+    /*
+    TODO: somehow combine with parseRange?
+    Will return null if the start/end props were present but parsed invalidly.
+    */
+    function parseOpenDateSpan(raw, dateEnv) {
+        var leftovers = {};
+        var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
+        var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
+        var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
+        var allDay = standardProps.allDay;
+        if (allDay == null) {
+            allDay = (startMeta && startMeta.isTimeUnspecified) &&
+                (!endMeta || endMeta.isTimeUnspecified);
+        }
+        // use this leftover object as the selection object
+        leftovers.range = {
+            start: startMeta ? startMeta.marker : null,
+            end: endMeta ? endMeta.marker : null
+        };
+        leftovers.allDay = allDay;
+        return leftovers;
+    }
+    function isDateSpansEqual(span0, span1) {
+        return rangesEqual(span0.range, span1.range) &&
+            span0.allDay === span1.allDay &&
+            isSpanPropsEqual(span0, span1);
+    }
+    // the NON-DATE-RELATED props
+    function isSpanPropsEqual(span0, span1) {
+        for (var propName in span1) {
+            if (propName !== 'range' && propName !== 'allDay') {
+                if (span0[propName] !== span1[propName]) {
+                    return false;
+                }
+            }
+        }
+        // are there any props that span0 has that span1 DOESN'T have?
+        // both have range/allDay, so no need to special-case.
+        for (var propName in span0) {
+            if (!(propName in span1)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    function buildDateSpanApi(span, dateEnv) {
+        return {
+            start: dateEnv.toDate(span.range.start),
+            end: dateEnv.toDate(span.range.end),
+            startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
+            endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
+            allDay: span.allDay
+        };
+    }
+    function buildDatePointApi(span, dateEnv) {
+        return {
+            date: dateEnv.toDate(span.range.start),
+            dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
+            allDay: span.allDay
+        };
+    }
+    function fabricateEventRange(dateSpan, eventUiBases, calendar) {
+        var def = parseEventDef({ editable: false }, '', // sourceId
+        dateSpan.allDay, true, // hasEnd
+        calendar);
+        return {
+            def: def,
+            ui: compileEventUi(def, eventUiBases),
+            instance: createEventInstance(def.defId, dateSpan.range),
+            range: dateSpan.range,
+            isStart: true,
+            isEnd: true
+        };
+    }
+
+    function compileViewDefs(defaultConfigs, overrideConfigs) {
+        var hash = {};
+        var viewType;
+        for (viewType in defaultConfigs) {
+            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+        }
+        for (viewType in overrideConfigs) {
+            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+        }
+        return hash;
+    }
+    function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
+        if (hash[viewType]) {
+            return hash[viewType];
+        }
+        var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+        if (viewDef) {
+            hash[viewType] = viewDef;
+        }
+        return viewDef;
+    }
+    function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
+        var defaultConfig = defaultConfigs[viewType];
+        var overrideConfig = overrideConfigs[viewType];
+        var queryProp = function (name) {
+            return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
+                ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
+        };
+        var theClass = queryProp('class');
+        var superType = queryProp('superType');
+        if (!superType && theClass) {
+            superType =
+                findViewNameBySubclass(theClass, overrideConfigs) ||
+                    findViewNameBySubclass(theClass, defaultConfigs);
+        }
+        var superDef = superType ? ensureViewDef(superType, hash, defaultConfigs, overrideConfigs) : null;
+        if (!theClass && superDef) {
+            theClass = superDef.class;
+        }
+        if (!theClass) {
+            return null; // don't throw a warning, might be settings for a single-unit view
+        }
+        return {
+            type: viewType,
+            class: theClass,
+            defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
+            overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
+        };
+    }
+    function findViewNameBySubclass(viewSubclass, configs) {
+        var superProto = Object.getPrototypeOf(viewSubclass.prototype);
+        for (var viewType in configs) {
+            var parsed = configs[viewType];
+            // need DIRECT subclass, so instanceof won't do it
+            if (parsed.class && parsed.class.prototype === superProto) {
+                return viewType;
+            }
+        }
+        return '';
+    }
+
+    function parseViewConfigs(inputs) {
+        return mapHash(inputs, parseViewConfig);
+    }
+    var VIEW_DEF_PROPS = {
+        type: String,
+        class: null
+    };
+    function parseViewConfig(input) {
+        if (typeof input === 'function') {
+            input = { class: input };
+        }
+        var options = {};
+        var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
+        return {
+            superType: props.type,
+            class: props.class,
+            options: options
+        };
+    }
+
+    function buildViewSpecs(defaultInputs, optionsManager) {
+        var defaultConfigs = parseViewConfigs(defaultInputs);
+        var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
+        var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
+        return mapHash(viewDefs, function (viewDef) {
+            return buildViewSpec(viewDef, overrideConfigs, optionsManager);
+        });
+    }
+    function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
+        var durationInput = viewDef.overrides.duration ||
+            viewDef.defaults.duration ||
+            optionsManager.dynamicOverrides.duration ||
+            optionsManager.overrides.duration;
+        var duration = null;
+        var durationUnit = '';
+        var singleUnit = '';
+        var singleUnitOverrides = {};
+        if (durationInput) {
+            duration = createDuration(durationInput);
+            if (duration) { // valid?
+                var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
+                durationUnit = denom.unit;
+                if (denom.value === 1) {
+                    singleUnit = durationUnit;
+                    singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
+                }
+            }
+        }
+        var queryButtonText = function (options) {
+            var buttonTextMap = options.buttonText || {};
+            var buttonTextKey = viewDef.defaults.buttonTextKey;
+            if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
+                return buttonTextMap[buttonTextKey];
+            }
+            if (buttonTextMap[viewDef.type] != null) {
+                return buttonTextMap[viewDef.type];
+            }
+            if (buttonTextMap[singleUnit] != null) {
+                return buttonTextMap[singleUnit];
+            }
+        };
+        return {
+            type: viewDef.type,
+            class: viewDef.class,
+            duration: duration,
+            durationUnit: durationUnit,
+            singleUnit: singleUnit,
+            options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
+            buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
+                queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
+                viewDef.overrides.buttonText,
+            buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
+                queryButtonText(optionsManager.dirDefaults) ||
+                viewDef.defaults.buttonText ||
+                queryButtonText(globalDefaults) ||
+                viewDef.type // fall back to given view name
+        };
+    }
+
+    var Toolbar = /** @class */ (function (_super) {
+        __extends(Toolbar, _super);
+        function Toolbar(context, extraClassName) {
+            var _this = _super.call(this, context) || this;
+            _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
+            _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
+            _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
+            _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
+            _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
+            _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
+            _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
+            return _this;
+        }
+        Toolbar.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this._renderLayout.unrender(); // should unrender everything else
+            removeElement(this.el);
+        };
+        Toolbar.prototype.render = function (props) {
+            this._renderLayout(props.layout);
+            this._updateTitle(props.title);
+            this._updateActiveButton(props.activeButton);
+            this._updateToday(props.isTodayEnabled);
+            this._updatePrev(props.isPrevEnabled);
+            this._updateNext(props.isNextEnabled);
+        };
+        Toolbar.prototype.renderLayout = function (layout) {
+            var el = this.el;
+            this.viewsWithButtons = [];
+            appendToElement(el, this.renderSection('left', layout.left));
+            appendToElement(el, this.renderSection('center', layout.center));
+            appendToElement(el, this.renderSection('right', layout.right));
+        };
+        Toolbar.prototype.unrenderLayout = function () {
+            this.el.innerHTML = '';
+        };
+        Toolbar.prototype.renderSection = function (position, buttonStr) {
+            var _this = this;
+            var _a = this, theme = _a.theme, calendar = _a.calendar;
+            var optionsManager = calendar.optionsManager;
+            var viewSpecs = calendar.viewSpecs;
+            var sectionEl = createElement('div', { className: 'fc-' + position });
+            var calendarCustomButtons = optionsManager.computed.customButtons || {};
+            var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
+            var calendarButtonText = optionsManager.computed.buttonText || {};
+            if (buttonStr) {
+                buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
+                    var groupChildren = [];
+                    var isOnlyButtons = true;
+                    var groupEl;
+                    buttonGroupStr.split(',').forEach(function (buttonName, j) {
+                        var customButtonProps;
+                        var viewSpec;
+                        var buttonClick;
+                        var buttonIcon; // only one of these will be set
+                        var buttonText; // "
+                        var buttonInnerHtml;
+                        var buttonClasses;
+                        var buttonEl;
+                        var buttonAriaAttr;
+                        if (buttonName === 'title') {
+                            groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
+                            isOnlyButtons = false;
+                        }
+                        else {
+                            if ((customButtonProps = calendarCustomButtons[buttonName])) {
+                                buttonClick = function (ev) {
+                                    if (customButtonProps.click) {
+                                        customButtonProps.click.call(buttonEl, ev);
+                                    }
+                                };
+                                (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
+                                    (buttonIcon = theme.getIconClass(buttonName)) ||
+                                    (buttonText = customButtonProps.text);
+                            }
+                            else if ((viewSpec = viewSpecs[buttonName])) {
+                                _this.viewsWithButtons.push(buttonName);
+                                buttonClick = function () {
+                                    calendar.changeView(buttonName);
+                                };
+                                (buttonText = viewSpec.buttonTextOverride) ||
+                                    (buttonIcon = theme.getIconClass(buttonName)) ||
+                                    (buttonText = viewSpec.buttonTextDefault);
+                            }
+                            else if (calendar[buttonName]) { // a calendar method
+                                buttonClick = function () {
+                                    calendar[buttonName]();
+                                };
+                                (buttonText = calendarButtonTextOverrides[buttonName]) ||
+                                    (buttonIcon = theme.getIconClass(buttonName)) ||
+                                    (buttonText = calendarButtonText[buttonName]);
+                                //            ^ everything else is considered default
+                            }
+                            if (buttonClick) {
+                                buttonClasses = [
+                                    'fc-' + buttonName + '-button',
+                                    theme.getClass('button')
+                                ];
+                                if (buttonText) {
+                                    buttonInnerHtml = htmlEscape(buttonText);
+                                    buttonAriaAttr = '';
+                                }
+                                else if (buttonIcon) {
+                                    buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
+                                    buttonAriaAttr = ' aria-label="' + buttonName + '"';
+                                }
+                                buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
+                                '<button type="button" class="' + buttonClasses.join(' ') + '"' +
+                                    buttonAriaAttr +
+                                    '>' + buttonInnerHtml + '</button>');
+                                buttonEl.addEventListener('click', buttonClick);
+                                groupChildren.push(buttonEl);
+                            }
+                        }
+                    });
+                    if (groupChildren.length > 1) {
+                        groupEl = document.createElement('div');
+                        var buttonGroupClassName = theme.getClass('buttonGroup');
+                        if (isOnlyButtons && buttonGroupClassName) {
+                            groupEl.classList.add(buttonGroupClassName);
+                        }
+                        appendToElement(groupEl, groupChildren);
+                        sectionEl.appendChild(groupEl);
+                    }
+                    else {
+                        appendToElement(sectionEl, groupChildren); // 1 or 0 children
+                    }
+                });
+            }
+            return sectionEl;
+        };
+        Toolbar.prototype.updateToday = function (isTodayEnabled) {
+            this.toggleButtonEnabled('today', isTodayEnabled);
+        };
+        Toolbar.prototype.updatePrev = function (isPrevEnabled) {
+            this.toggleButtonEnabled('prev', isPrevEnabled);
+        };
+        Toolbar.prototype.updateNext = function (isNextEnabled) {
+            this.toggleButtonEnabled('next', isNextEnabled);
+        };
+        Toolbar.prototype.updateTitle = function (text) {
+            findElements(this.el, 'h2').forEach(function (titleEl) {
+                titleEl.innerText = text;
+            });
+        };
+        Toolbar.prototype.updateActiveButton = function (buttonName) {
+            var className = this.theme.getClass('buttonActive');
+            findElements(this.el, 'button').forEach(function (buttonEl) {
+                if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
+                    buttonEl.classList.add(className);
+                }
+                else {
+                    buttonEl.classList.remove(className);
+                }
+            });
+        };
+        Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
+            findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
+                buttonEl.disabled = !bool;
+            });
+        };
+        return Toolbar;
+    }(Component));
+
+    var CalendarComponent = /** @class */ (function (_super) {
+        __extends(CalendarComponent, _super);
+        function CalendarComponent(context, el) {
+            var _this = _super.call(this, context) || this;
+            _this._renderToolbars = memoizeRendering(_this.renderToolbars);
+            _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
+            _this.el = el;
+            prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' }));
+            var calendar = _this.calendar;
+            for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
+                var modifyViewContainer = _a[_i];
+                modifyViewContainer(_this.contentEl, calendar);
+            }
+            _this.toggleElClassNames(true);
+            _this.computeTitle = memoize(computeTitle);
+            _this.parseBusinessHours = memoize(function (input) {
+                return parseBusinessHours(input, _this.calendar);
+            });
+            return _this;
+        }
+        CalendarComponent.prototype.destroy = function () {
+            if (this.header) {
+                this.header.destroy();
+            }
+            if (this.footer) {
+                this.footer.destroy();
+            }
+            if (this.view) {
+                this.view.destroy();
+            }
+            removeElement(this.contentEl);
+            this.toggleElClassNames(false);
+            _super.prototype.destroy.call(this);
+        };
+        CalendarComponent.prototype.toggleElClassNames = function (bool) {
+            var classList = this.el.classList;
+            var dirClassName = 'fc-' + this.opt('dir');
+            var themeClassName = this.theme.getClass('widget');
+            if (bool) {
+                classList.add('fc');
+                classList.add(dirClassName);
+                classList.add(themeClassName);
+            }
+            else {
+                classList.remove('fc');
+                classList.remove(dirClassName);
+                classList.remove(themeClassName);
+            }
+        };
+        CalendarComponent.prototype.render = function (props) {
+            this.freezeHeight();
+            var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
+            this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title);
+            this.renderView(props, title);
+            this.updateSize();
+            this.thawHeight();
+        };
+        CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) {
+            var headerLayout = this.opt('header');
+            var footerLayout = this.opt('footer');
+            var now = this.calendar.getNow();
+            var todayInfo = dateProfileGenerator.build(now);
+            var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
+            var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
+            var toolbarProps = {
+                title: title,
+                activeButton: viewSpec.type,
+                isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
+                isPrevEnabled: prevInfo.isValid,
+                isNextEnabled: nextInfo.isValid
+            };
+            if (headerLayout) {
+                if (!this.header) {
+                    this.header = new Toolbar(this.context, 'fc-header-toolbar');
+                    prependToElement(this.el, this.header.el);
+                }
+                this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps));
+            }
+            else if (this.header) {
+                this.header.destroy();
+                this.header = null;
+            }
+            if (footerLayout) {
+                if (!this.footer) {
+                    this.footer = new Toolbar(this.context, 'fc-footer-toolbar');
+                    appendToElement(this.el, this.footer.el);
+                }
+                this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps));
+            }
+            else if (this.footer) {
+                this.footer.destroy();
+                this.footer = null;
+            }
+        };
+        CalendarComponent.prototype.renderView = function (props, title) {
+            var view = this.view;
+            var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
+            if (!view || view.viewSpec !== viewSpec) {
+                if (view) {
+                    view.destroy();
+                }
+                view = this.view = new viewSpec['class']({
+                    calendar: this.calendar,
+                    view: null,
+                    dateEnv: this.dateEnv,
+                    theme: this.theme,
+                    options: viewSpec.options
+                }, viewSpec, dateProfileGenerator, this.contentEl);
+            }
+            else {
+                view.addScroll(view.queryScroll());
+            }
+            view.title = title; // for the API
+            var viewProps = {
+                dateProfile: props.dateProfile,
+                businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
+                eventStore: props.eventStore,
+                eventUiBases: props.eventUiBases,
+                dateSelection: props.dateSelection,
+                eventSelection: props.eventSelection,
+                eventDrag: props.eventDrag,
+                eventResize: props.eventResize
+            };
+            var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);
+            for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
+                var transformer = transformers_1[_i];
+                __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view));
+            }
+            view.receiveProps(viewProps);
+        };
+        // Sizing
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarComponent.prototype.updateSize = function (isResize) {
+            if (isResize === void 0) { isResize = false; }
+            var view = this.view;
+            if (isResize) {
+                view.addScroll(view.queryScroll());
+            }
+            if (isResize || this.isHeightAuto == null) {
+                this.computeHeightVars();
+            }
+            view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
+            view.updateNowIndicator(); // we need to guarantee this will run after updateSize
+            view.popScroll(isResize);
+        };
+        CalendarComponent.prototype.computeHeightVars = function () {
+            var calendar = this.calendar; // yuck. need to handle dynamic options
+            var heightInput = calendar.opt('height');
+            var contentHeightInput = calendar.opt('contentHeight');
+            this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
+            if (typeof contentHeightInput === 'number') { // exists and not 'auto'
+                this.viewHeight = contentHeightInput;
+            }
+            else if (typeof contentHeightInput === 'function') { // exists and is a function
+                this.viewHeight = contentHeightInput();
+            }
+            else if (typeof heightInput === 'number') { // exists and not 'auto'
+                this.viewHeight = heightInput - this.queryToolbarsHeight();
+            }
+            else if (typeof heightInput === 'function') { // exists and is a function
+                this.viewHeight = heightInput() - this.queryToolbarsHeight();
+            }
+            else if (heightInput === 'parent') { // set to height of parent element
+                this.viewHeight = this.el.parentNode.offsetHeight - this.queryToolbarsHeight();
+            }
+            else {
+                this.viewHeight = Math.round(this.contentEl.offsetWidth /
+                    Math.max(calendar.opt('aspectRatio'), .5));
+            }
+        };
+        CalendarComponent.prototype.queryToolbarsHeight = function () {
+            var height = 0;
+            if (this.header) {
+                height += computeHeightAndMargins(this.header.el);
+            }
+            if (this.footer) {
+                height += computeHeightAndMargins(this.footer.el);
+            }
+            return height;
+        };
+        // Height "Freezing"
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarComponent.prototype.freezeHeight = function () {
+            applyStyle(this.el, {
+                height: this.el.offsetHeight,
+                overflow: 'hidden'
+            });
+        };
+        CalendarComponent.prototype.thawHeight = function () {
+            applyStyle(this.el, {
+                height: '',
+                overflow: ''
+            });
+        };
+        return CalendarComponent;
+    }(Component));
+    // Title and Date Formatting
+    // -----------------------------------------------------------------------------------------------------------------
+    // Computes what the title at the top of the calendar should be for this view
+    function computeTitle(dateProfile, viewOptions) {
+        var range;
+        // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
+        if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
+            range = dateProfile.currentRange;
+        }
+        else { // for day units or smaller, use the actual day range
+            range = dateProfile.activeRange;
+        }
+        return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
+    }
+    // Generates the format string that should be used to generate the title for the current date range.
+    // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
+    function computeTitleFormat(dateProfile) {
+        var currentRangeUnit = dateProfile.currentRangeUnit;
+        if (currentRangeUnit === 'year') {
+            return { year: 'numeric' };
+        }
+        else if (currentRangeUnit === 'month') {
+            return { year: 'numeric', month: 'long' }; // like "September 2014"
+        }
+        else {
+            var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
+            if (days !== null && days > 1) {
+                // multi-day range. shorter, like "Sep 9 - 10 2014"
+                return { year: 'numeric', month: 'short', day: 'numeric' };
+            }
+            else {
+                // one day. longer, like "September 9 2014"
+                return { year: 'numeric', month: 'long', day: 'numeric' };
+            }
+        }
+    }
+    // Plugin
+    // -----------------------------------------------------------------------------------------------------------------
+    function buildViewPropTransformers(theClasses) {
+        return theClasses.map(function (theClass) {
+            return new theClass();
+        });
+    }
+
+    var Interaction = /** @class */ (function () {
+        function Interaction(settings) {
+            this.component = settings.component;
+        }
+        Interaction.prototype.destroy = function () {
+        };
+        return Interaction;
+    }());
+    function parseInteractionSettings(component, input) {
+        return {
+            component: component,
+            el: input.el,
+            useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
+        };
+    }
+    function interactionSettingsToStore(settings) {
+        var _a;
+        return _a = {},
+            _a[settings.component.uid] = settings,
+            _a;
+    }
+    // global state
+    var interactionSettingsStore = {};
+
+    /*
+    Detects when the user clicks on an event within a DateComponent
+    */
+    var EventClicking = /** @class */ (function (_super) {
+        __extends(EventClicking, _super);
+        function EventClicking(settings) {
+            var _this = _super.call(this, settings) || this;
+            _this.handleSegClick = function (ev, segEl) {
+                var component = _this.component;
+                var seg = getElSeg(segEl);
+                if (seg && // might be the <div> surrounding the more link
+                    component.isValidSegDownEl(ev.target)) {
+                    // our way to simulate a link click for elements that can't be <a> tags
+                    // grab before trigger fired in case trigger trashes DOM thru rerendering
+                    var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
+                    var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
+                    component.publiclyTrigger('eventClick', [
+                        {
+                            el: segEl,
+                            event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance),
+                            jsEvent: ev,
+                            view: component.view
+                        }
+                    ]);
+                    if (url && !ev.defaultPrevented) {
+                        window.location.href = url;
+                    }
+                }
+            };
+            var component = settings.component;
+            _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
+            return _this;
+        }
+        return EventClicking;
+    }(Interaction));
+
+    /*
+    Triggers events and adds/removes core classNames when the user's pointer
+    enters/leaves event-elements of a component.
+    */
+    var EventHovering = /** @class */ (function (_super) {
+        __extends(EventHovering, _super);
+        function EventHovering(settings) {
+            var _this = _super.call(this, settings) || this;
+            // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
+            _this.handleEventElRemove = function (el) {
+                if (el === _this.currentSegEl) {
+                    _this.handleSegLeave(null, _this.currentSegEl);
+                }
+            };
+            _this.handleSegEnter = function (ev, segEl) {
+                if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
+                    segEl.classList.add('fc-allow-mouse-resize');
+                    _this.currentSegEl = segEl;
+                    _this.triggerEvent('eventMouseEnter', ev, segEl);
+                }
+            };
+            _this.handleSegLeave = function (ev, segEl) {
+                if (_this.currentSegEl) {
+                    segEl.classList.remove('fc-allow-mouse-resize');
+                    _this.currentSegEl = null;
+                    _this.triggerEvent('eventMouseLeave', ev, segEl);
+                }
+            };
+            var component = settings.component;
+            _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
+            component.calendar.on('eventElRemove', _this.handleEventElRemove);
+            return _this;
+        }
+        EventHovering.prototype.destroy = function () {
+            this.removeHoverListeners();
+            this.component.calendar.off('eventElRemove', this.handleEventElRemove);
+        };
+        EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
+            var component = this.component;
+            var seg = getElSeg(segEl);
+            if (!ev || component.isValidSegDownEl(ev.target)) {
+                component.publiclyTrigger(publicEvName, [
+                    {
+                        el: segEl,
+                        event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance),
+                        jsEvent: ev,
+                        view: component.view
+                    }
+                ]);
+            }
+        };
+        return EventHovering;
+    }(Interaction));
+
+    var StandardTheme = /** @class */ (function (_super) {
+        __extends(StandardTheme, _super);
+        function StandardTheme() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        return StandardTheme;
+    }(Theme));
+    StandardTheme.prototype.classes = {
+        widget: 'fc-unthemed',
+        widgetHeader: 'fc-widget-header',
+        widgetContent: 'fc-widget-content',
+        buttonGroup: 'fc-button-group',
+        button: 'fc-button fc-button-primary',
+        buttonActive: 'fc-button-active',
+        popoverHeader: 'fc-widget-header',
+        popoverContent: 'fc-widget-content',
+        // day grid
+        headerRow: 'fc-widget-header',
+        dayRow: 'fc-widget-content',
+        // list view
+        listView: 'fc-widget-content'
+    };
+    StandardTheme.prototype.baseIconClass = 'fc-icon';
+    StandardTheme.prototype.iconClasses = {
+        close: 'fc-icon-x',
+        prev: 'fc-icon-chevron-left',
+        next: 'fc-icon-chevron-right',
+        prevYear: 'fc-icon-chevrons-left',
+        nextYear: 'fc-icon-chevrons-right'
+    };
+    StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
+    StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
+    StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
+
+    var Calendar = /** @class */ (function () {
+        function Calendar(el, overrides) {
+            var _this = this;
+            this.parseRawLocales = memoize(parseRawLocales);
+            this.buildLocale = memoize(buildLocale);
+            this.buildDateEnv = memoize(buildDateEnv);
+            this.buildTheme = memoize(buildTheme);
+            this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
+            this.buildSelectionConfig = memoize(this._buildSelectionConfig);
+            this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isObjectsSimilar);
+            this.buildEventUiBases = memoize(buildEventUiBases);
+            this.interactionsStore = {};
+            this.actionQueue = [];
+            this.isReducing = false;
+            // isDisplaying: boolean = false // installed in DOM? accepting renders?
+            this.needsRerender = false; // needs a render?
+            this.needsFullRerender = false;
+            this.isRendering = false; // currently in the executeRender function?
+            this.renderingPauseDepth = 0;
+            this.buildDelayedRerender = memoize(buildDelayedRerender);
+            this.afterSizingTriggers = {};
+            this.isViewUpdated = false;
+            this.isDatesUpdated = false;
+            this.isEventsUpdated = false;
+            this.el = el;
+            this.optionsManager = new OptionsManager(overrides || {});
+            this.pluginSystem = new PluginSystem();
+            // only do once. don't do in handleOptions. because can't remove plugins
+            this.addPluginInputs(this.optionsManager.computed.plugins || []);
+            this.handleOptions(this.optionsManager.computed);
+            this.publiclyTrigger('_init'); // for tests
+            this.hydrate();
+            this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
+                .map(function (calendarInteractionClass) {
+                return new calendarInteractionClass(_this);
+            });
+        }
+        Calendar.prototype.addPluginInputs = function (pluginInputs) {
+            var pluginDefs = refinePluginDefs(pluginInputs);
+            for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
+                var pluginDef = pluginDefs_1[_i];
+                this.pluginSystem.add(pluginDef);
+            }
+        };
+        Object.defineProperty(Calendar.prototype, "view", {
+            // public API
+            get: function () {
+                return this.component ? this.component.view : null;
+            },
+            enumerable: true,
+            configurable: true
+        });
+        // Public API for rendering
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.render = function () {
+            if (!this.component) {
+                this.renderableEventStore = createEmptyEventStore();
+                this.bindHandlers();
+                this.executeRender();
+            }
+            else {
+                this.requestRerender(true);
+            }
+        };
+        Calendar.prototype.destroy = function () {
+            if (this.component) {
+                this.unbindHandlers();
+                this.component.destroy(); // don't null-out. in case API needs access
+                this.component = null; // umm ???
+                for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
+                    var interaction = _a[_i];
+                    interaction.destroy();
+                }
+                this.publiclyTrigger('_destroyed');
+            }
+        };
+        // Handlers
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.bindHandlers = function () {
+            var _this = this;
+            // event delegation for nav links
+            this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
+                var gotoOptions = anchorEl.getAttribute('data-goto');
+                gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
+                var dateEnv = _this.dateEnv;
+                var dateMarker = dateEnv.createMarker(gotoOptions.date);
+                var viewType = gotoOptions.type;
+                // property like "navLinkDayClick". might be a string or a function
+                var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
+                if (typeof customAction === 'function') {
+                    customAction(dateEnv.toDate(dateMarker), ev);
+                }
+                else {
+                    if (typeof customAction === 'string') {
+                        viewType = customAction;
+                    }
+                    _this.zoomTo(dateMarker, viewType);
+                }
+            });
+            if (this.opt('handleWindowResize')) {
+                window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
+                this.windowResize.bind(this), this.opt('windowResizeDelay')));
+            }
+        };
+        Calendar.prototype.unbindHandlers = function () {
+            this.removeNavLinkListener();
+            if (this.windowResizeProxy) {
+                window.removeEventListener('resize', this.windowResizeProxy);
+                this.windowResizeProxy = null;
+            }
+        };
+        // Dispatcher
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.hydrate = function () {
+            var _this = this;
+            this.state = this.buildInitialState();
+            var rawSources = this.opt('eventSources') || [];
+            var singleRawSource = this.opt('events');
+            var sources = []; // parsed
+            if (singleRawSource) {
+                rawSources.unshift(singleRawSource);
+            }
+            for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
+                var rawSource = rawSources_1[_i];
+                var source = parseEventSource(rawSource, this);
+                if (source) {
+                    sources.push(source);
+                }
+            }
+            this.batchRendering(function () {
+                _this.dispatch({ type: 'INIT' }); // pass in sources here?
+                _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
+                _this.dispatch({
+                    type: 'SET_VIEW_TYPE',
+                    viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
+                });
+            });
+        };
+        Calendar.prototype.buildInitialState = function () {
+            return {
+                viewType: null,
+                loadingLevel: 0,
+                eventSourceLoadingLevel: 0,
+                currentDate: this.getInitialDate(),
+                dateProfile: null,
+                eventSources: {},
+                eventStore: createEmptyEventStore(),
+                dateSelection: null,
+                eventSelection: '',
+                eventDrag: null,
+                eventResize: null
+            };
+        };
+        Calendar.prototype.dispatch = function (action) {
+            this.actionQueue.push(action);
+            if (!this.isReducing) {
+                this.isReducing = true;
+                var oldState = this.state;
+                while (this.actionQueue.length) {
+                    this.state = this.reduce(this.state, this.actionQueue.shift(), this);
+                }
+                var newState = this.state;
+                this.isReducing = false;
+                if (!oldState.loadingLevel && newState.loadingLevel) {
+                    this.publiclyTrigger('loading', [true]);
+                }
+                else if (oldState.loadingLevel && !newState.loadingLevel) {
+                    this.publiclyTrigger('loading', [false]);
+                }
+                var view = this.component && this.component.view;
+                if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) {
+                    if (oldState.eventStore) {
+                        this.isEventsUpdated = true;
+                    }
+                }
+                if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) {
+                    if (oldState.dateProfile && view) { // why would view be null!?
+                        this.publiclyTrigger('datesDestroy', [
+                            {
+                                view: view,
+                                el: view.el
+                            }
+                        ]);
+                    }
+                    this.isDatesUpdated = true;
+                }
+                if (oldState.viewType !== newState.viewType || this.needsFullRerender) {
+                    if (oldState.viewType && view) { // why would view be null!?
+                        this.publiclyTrigger('viewSkeletonDestroy', [
+                            {
+                                view: view,
+                                el: view.el
+                            }
+                        ]);
+                    }
+                    this.isViewUpdated = true;
+                }
+                this.requestRerender();
+            }
+        };
+        Calendar.prototype.reduce = function (state, action, calendar) {
+            return reduce(state, action, calendar);
+        };
+        // Render Queue
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.requestRerender = function (needsFull) {
+            if (needsFull === void 0) { needsFull = false; }
+            this.needsRerender = true;
+            this.needsFullRerender = this.needsFullRerender || needsFull;
+            this.delayedRerender(); // will call a debounced-version of tryRerender
+        };
+        Calendar.prototype.tryRerender = function () {
+            if (this.component && // must be accepting renders
+                this.needsRerender && // indicates that a rerender was requested
+                !this.renderingPauseDepth && // not paused
+                !this.isRendering // not currently in the render loop
+            ) {
+                this.executeRender();
+            }
+        };
+        Calendar.prototype.batchRendering = function (func) {
+            this.renderingPauseDepth++;
+            func();
+            this.renderingPauseDepth--;
+            if (this.needsRerender) {
+                this.requestRerender();
+            }
+        };
+        // Rendering
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.executeRender = function () {
+            var needsFullRerender = this.needsFullRerender; // save before clearing
+            // clear these BEFORE the render so that new values will accumulate during render
+            this.needsRerender = false;
+            this.needsFullRerender = false;
+            this.isRendering = true;
+            this.renderComponent(needsFullRerender);
+            this.isRendering = false;
+            // received a rerender request while rendering
+            if (this.needsRerender) {
+                this.delayedRerender();
+            }
+        };
+        /*
+        don't call this directly. use executeRender instead
+        */
+        Calendar.prototype.renderComponent = function (needsFull) {
+            var _a = this, state = _a.state, component = _a.component;
+            var viewType = state.viewType;
+            var viewSpec = this.viewSpecs[viewType];
+            var savedScroll = (needsFull && component) ? component.view.queryScroll() : null;
+            if (!viewSpec) {
+                throw new Error("View type \"" + viewType + "\" is not valid");
+            }
+            // if event sources are still loading and progressive rendering hasn't been enabled,
+            // keep rendering the last fully loaded set of events
+            var renderableEventStore = this.renderableEventStore =
+                (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
+                    this.renderableEventStore :
+                    state.eventStore;
+            var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
+            var eventUiBySource = this.buildEventUiBySource(state.eventSources);
+            var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
+            if (needsFull || !component) {
+                if (component) {
+                    component.freezeHeight(); // next component will unfreeze it
+                    component.destroy();
+                }
+                component = this.component = new CalendarComponent({
+                    calendar: this,
+                    view: null,
+                    dateEnv: this.dateEnv,
+                    theme: this.theme,
+                    options: this.optionsManager.computed
+                }, this.el);
+            }
+            component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }));
+            if (savedScroll) {
+                component.view.applyScroll(savedScroll, false);
+            }
+            if (this.isViewUpdated) {
+                this.isViewUpdated = false;
+                this.publiclyTrigger('viewSkeletonRender', [
+                    {
+                        view: component.view,
+                        el: component.view.el
+                    }
+                ]);
+            }
+            if (this.isDatesUpdated) {
+                this.isDatesUpdated = false;
+                this.publiclyTrigger('datesRender', [
+                    {
+                        view: component.view,
+                        el: component.view.el
+                    }
+                ]);
+            }
+            if (this.isEventsUpdated) {
+                this.isEventsUpdated = false;
+            }
+            this.releaseAfterSizingTriggers();
+        };
+        // Options
+        // -----------------------------------------------------------------------------------------------------------------
+        /*
+        Not meant for public API
+        */
+        Calendar.prototype.resetOptions = function (options) {
+            var _this = this;
+            var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
+            var oldOptions = this.optionsManager.overrides;
+            var oldNormalOptions = {};
+            var normalOptions = {};
+            var specialOptions = {};
+            for (var name_1 in oldOptions) {
+                if (!changeHandlers[name_1]) {
+                    oldNormalOptions[name_1] = oldOptions[name_1];
+                }
+            }
+            for (var name_2 in options) {
+                if (changeHandlers[name_2]) {
+                    specialOptions[name_2] = options[name_2];
+                }
+                else {
+                    normalOptions[name_2] = options[name_2];
+                }
+            }
+            this.batchRendering(function () {
+                if (anyKeysRemoved(oldNormalOptions, normalOptions)) {
+                    _this.processOptions(options, 'reset');
+                }
+                else {
+                    _this.processOptions(computeChangedProps(oldNormalOptions, normalOptions));
+                }
+                // handle special options last
+                for (var name_3 in specialOptions) {
+                    changeHandlers[name_3](specialOptions[name_3], _this);
+                }
+            });
+        };
+        /*
+        Not meant for public API. Won't give the same precedence that setOption does
+        */
+        Calendar.prototype.setOptions = function (options) {
+            var _this = this;
+            var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
+            var normalOptions = {};
+            var specialOptions = {};
+            for (var name_4 in options) {
+                if (changeHandlers[name_4]) {
+                    specialOptions[name_4] = options[name_4];
+                }
+                else {
+                    normalOptions[name_4] = options[name_4];
+                }
+            }
+            this.batchRendering(function () {
+                _this.processOptions(normalOptions);
+                // handle special options last
+                for (var name_5 in specialOptions) {
+                    changeHandlers[name_5](specialOptions[name_5], _this);
+                }
+            });
+        };
+        Calendar.prototype.processOptions = function (options, mode) {
+            var _this = this;
+            var oldDateEnv = this.dateEnv; // do this before handleOptions
+            var isTimeZoneDirty = false;
+            var isSizeDirty = false;
+            var anyDifficultOptions = false;
+            for (var name_6 in options) {
+                if (/^(height|contentHeight|aspectRatio)$/.test(name_6)) {
+                    isSizeDirty = true;
+                }
+                else if (/^(defaultDate|defaultView)$/.test(name_6)) ;
+                else {
+                    anyDifficultOptions = true;
+                    if (name_6 === 'timeZone') {
+                        isTimeZoneDirty = true;
+                    }
+                }
+            }
+            if (mode === 'reset') {
+                anyDifficultOptions = true;
+                this.optionsManager.reset(options);
+            }
+            else if (mode === 'dynamic') {
+                this.optionsManager.addDynamic(options); // takes higher precedence
+            }
+            else {
+                this.optionsManager.add(options);
+            }
+            if (anyDifficultOptions) {
+                this.handleOptions(this.optionsManager.computed); // only for "difficult" options
+                this.needsFullRerender = true;
+                this.batchRendering(function () {
+                    if (isTimeZoneDirty) {
+                        _this.dispatch({
+                            type: 'CHANGE_TIMEZONE',
+                            oldDateEnv: oldDateEnv
+                        });
+                    }
+                    /* HACK
+                    has the same effect as calling this.requestRerender(true)
+                    but recomputes the state's dateProfile
+                    */
+                    _this.dispatch({
+                        type: 'SET_VIEW_TYPE',
+                        viewType: _this.state.viewType
+                    });
+                });
+            }
+            if (isSizeDirty) {
+                this.updateSize();
+            }
+        };
+        Calendar.prototype.setOption = function (name, val) {
+            var _a;
+            this.processOptions((_a = {}, _a[name] = val, _a), 'dynamic');
+        };
+        Calendar.prototype.getOption = function (name) {
+            return this.optionsManager.computed[name];
+        };
+        Calendar.prototype.opt = function (name) {
+            return this.optionsManager.computed[name];
+        };
+        Calendar.prototype.viewOpt = function (name) {
+            return this.viewOpts()[name];
+        };
+        Calendar.prototype.viewOpts = function () {
+            return this.viewSpecs[this.state.viewType].options;
+        };
+        /*
+        rebuilds things based off of a complete set of refined options
+        */
+        Calendar.prototype.handleOptions = function (options) {
+            var _this = this;
+            var pluginHooks = this.pluginSystem.hooks;
+            this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
+            this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
+            this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
+            this.theme = this.buildTheme(options);
+            var available = this.parseRawLocales(options.locales);
+            this.availableRawLocales = available.map;
+            var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
+            this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
+            this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
+            // ineffecient to do every time?
+            this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
+            // ineffecient to do every time?
+            this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
+                return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
+            });
+        };
+        Calendar.prototype.getAvailableLocaleCodes = function () {
+            return Object.keys(this.availableRawLocales);
+        };
+        Calendar.prototype._buildSelectionConfig = function (rawOpts) {
+            return processScopedUiProps('select', rawOpts, this);
+        };
+        Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
+            if (rawOpts.editable) { // so 'editable' affected events
+                rawOpts = __assign({}, rawOpts, { eventEditable: true });
+            }
+            return processScopedUiProps('event', rawOpts, this);
+        };
+        // Trigger
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.hasPublicHandlers = function (name) {
+            return this.hasHandlers(name) ||
+                this.opt(name); // handler specified in options
+        };
+        Calendar.prototype.publiclyTrigger = function (name, args) {
+            var optHandler = this.opt(name);
+            this.triggerWith(name, this, args);
+            if (optHandler) {
+                return optHandler.apply(this, args);
+            }
+        };
+        Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
+            var afterSizingTriggers = this.afterSizingTriggers;
+            (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
+        };
+        Calendar.prototype.releaseAfterSizingTriggers = function () {
+            var afterSizingTriggers = this.afterSizingTriggers;
+            for (var name_7 in afterSizingTriggers) {
+                for (var _i = 0, _a = afterSizingTriggers[name_7]; _i < _a.length; _i++) {
+                    var args = _a[_i];
+                    this.publiclyTrigger(name_7, args);
+                }
+            }
+            this.afterSizingTriggers = {};
+        };
+        // View
+        // -----------------------------------------------------------------------------------------------------------------
+        // Returns a boolean about whether the view is okay to instantiate at some point
+        Calendar.prototype.isValidViewType = function (viewType) {
+            return Boolean(this.viewSpecs[viewType]);
+        };
+        Calendar.prototype.changeView = function (viewType, dateOrRange) {
+            var dateMarker = null;
+            if (dateOrRange) {
+                if (dateOrRange.start && dateOrRange.end) { // a range
+                    this.optionsManager.addDynamic({ visibleRange: dateOrRange }); // will not rerender
+                    this.handleOptions(this.optionsManager.computed); // ...but yuck
+                }
+                else { // a date
+                    dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
+                }
+            }
+            this.unselect();
+            this.dispatch({
+                type: 'SET_VIEW_TYPE',
+                viewType: viewType,
+                dateMarker: dateMarker
+            });
+        };
+        // Forces navigation to a view for the given date.
+        // `viewType` can be a specific view name or a generic one like "week" or "day".
+        // needs to change
+        Calendar.prototype.zoomTo = function (dateMarker, viewType) {
+            var spec;
+            viewType = viewType || 'day'; // day is default zoom
+            spec = this.viewSpecs[viewType] ||
+                this.getUnitViewSpec(viewType);
+            this.unselect();
+            if (spec) {
+                this.dispatch({
+                    type: 'SET_VIEW_TYPE',
+                    viewType: spec.type,
+                    dateMarker: dateMarker
+                });
+            }
+            else {
+                this.dispatch({
+                    type: 'SET_DATE',
+                    dateMarker: dateMarker
+                });
+            }
+        };
+        // Given a duration singular unit, like "week" or "day", finds a matching view spec.
+        // Preference is given to views that have corresponding buttons.
+        Calendar.prototype.getUnitViewSpec = function (unit) {
+            var component = this.component;
+            var viewTypes = [];
+            var i;
+            var spec;
+            // put views that have buttons first. there will be duplicates, but oh
+            if (component.header) {
+                viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
+            }
+            if (component.footer) {
+                viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
+            }
+            for (var viewType in this.viewSpecs) {
+                viewTypes.push(viewType);
+            }
+            for (i = 0; i < viewTypes.length; i++) {
+                spec = this.viewSpecs[viewTypes[i]];
+                if (spec) {
+                    if (spec.singleUnit === unit) {
+                        return spec;
+                    }
+                }
+            }
+        };
+        // Current Date
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.getInitialDate = function () {
+            var defaultDateInput = this.opt('defaultDate');
+            // compute the initial ambig-timezone date
+            if (defaultDateInput != null) {
+                return this.dateEnv.createMarker(defaultDateInput);
+            }
+            else {
+                return this.getNow(); // getNow already returns unzoned
+            }
+        };
+        Calendar.prototype.prev = function () {
+            this.unselect();
+            this.dispatch({ type: 'PREV' });
+        };
+        Calendar.prototype.next = function () {
+            this.unselect();
+            this.dispatch({ type: 'NEXT' });
+        };
+        Calendar.prototype.prevYear = function () {
+            this.unselect();
+            this.dispatch({
+                type: 'SET_DATE',
+                dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
+            });
+        };
+        Calendar.prototype.nextYear = function () {
+            this.unselect();
+            this.dispatch({
+                type: 'SET_DATE',
+                dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
+            });
+        };
+        Calendar.prototype.today = function () {
+            this.unselect();
+            this.dispatch({
+                type: 'SET_DATE',
+                dateMarker: this.getNow()
+            });
+        };
+        Calendar.prototype.gotoDate = function (zonedDateInput) {
+            this.unselect();
+            this.dispatch({
+                type: 'SET_DATE',
+                dateMarker: this.dateEnv.createMarker(zonedDateInput)
+            });
+        };
+        Calendar.prototype.incrementDate = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // else, warn about invalid input?
+                this.unselect();
+                this.dispatch({
+                    type: 'SET_DATE',
+                    dateMarker: this.dateEnv.add(this.state.currentDate, delta)
+                });
+            }
+        };
+        // for external API
+        Calendar.prototype.getDate = function () {
+            return this.dateEnv.toDate(this.state.currentDate);
+        };
+        // Date Formatting Utils
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.formatDate = function (d, formatter) {
+            var dateEnv = this.dateEnv;
+            return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
+        };
+        // `settings` is for formatter AND isEndExclusive
+        Calendar.prototype.formatRange = function (d0, d1, settings) {
+            var dateEnv = this.dateEnv;
+            return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
+        };
+        Calendar.prototype.formatIso = function (d, omitTime) {
+            var dateEnv = this.dateEnv;
+            return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
+        };
+        // Sizing
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.windowResize = function (ev) {
+            if (!this.isHandlingWindowResize &&
+                this.component && // why?
+                ev.target === window // not a jqui resize event
+            ) {
+                this.isHandlingWindowResize = true;
+                this.updateSize();
+                this.publiclyTrigger('windowResize', [this.view]);
+                this.isHandlingWindowResize = false;
+            }
+        };
+        Calendar.prototype.updateSize = function () {
+            if (this.component) { // when?
+                this.component.updateSize(true);
+            }
+        };
+        // Component Registration
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
+            var settings = parseInteractionSettings(component, settingsInput);
+            var DEFAULT_INTERACTIONS = [
+                EventClicking,
+                EventHovering
+            ];
+            var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
+            var interactions = interactionClasses.map(function (interactionClass) {
+                return new interactionClass(settings);
+            });
+            this.interactionsStore[component.uid] = interactions;
+            interactionSettingsStore[component.uid] = settings;
+        };
+        Calendar.prototype.unregisterInteractiveComponent = function (component) {
+            for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
+                var listener = _a[_i];
+                listener.destroy();
+            }
+            delete this.interactionsStore[component.uid];
+            delete interactionSettingsStore[component.uid];
+        };
+        // Date Selection / Event Selection / DayClick
+        // -----------------------------------------------------------------------------------------------------------------
+        // this public method receives start/end dates in any format, with any timezone
+        // NOTE: args were changed from v3
+        Calendar.prototype.select = function (dateOrObj, endDate) {
+            var selectionInput;
+            if (endDate == null) {
+                if (dateOrObj.start != null) {
+                    selectionInput = dateOrObj;
+                }
+                else {
+                    selectionInput = {
+                        start: dateOrObj,
+                        end: null
+                    };
+                }
+            }
+            else {
+                selectionInput = {
+                    start: dateOrObj,
+                    end: endDate
+                };
+            }
+            var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
+            );
+            if (selection) { // throw parse error otherwise?
+                this.dispatch({ type: 'SELECT_DATES', selection: selection });
+                this.triggerDateSelect(selection);
+            }
+        };
+        // public method
+        Calendar.prototype.unselect = function (pev) {
+            if (this.state.dateSelection) {
+                this.dispatch({ type: 'UNSELECT_DATES' });
+                this.triggerDateUnselect(pev);
+            }
+        };
+        Calendar.prototype.triggerDateSelect = function (selection, pev) {
+            var arg = this.buildDateSpanApi(selection);
+            arg.jsEvent = pev ? pev.origEvent : null;
+            arg.view = this.view;
+            this.publiclyTrigger('select', [arg]);
+        };
+        Calendar.prototype.triggerDateUnselect = function (pev) {
+            this.publiclyTrigger('unselect', [
+                {
+                    jsEvent: pev ? pev.origEvent : null,
+                    view: this.view
+                }
+            ]);
+        };
+        // TODO: receive pev?
+        Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
+            var arg = this.buildDatePointApi(dateSpan);
+            arg.dayEl = dayEl;
+            arg.jsEvent = ev;
+            arg.view = view;
+            this.publiclyTrigger('dateClick', [arg]);
+        };
+        Calendar.prototype.buildDatePointApi = function (dateSpan) {
+            var props = {};
+            for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
+                var transform = _a[_i];
+                __assign(props, transform(dateSpan, this));
+            }
+            __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
+            return props;
+        };
+        Calendar.prototype.buildDateSpanApi = function (dateSpan) {
+            var props = {};
+            for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
+                var transform = _a[_i];
+                __assign(props, transform(dateSpan, this));
+            }
+            __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
+            return props;
+        };
+        // Date Utils
+        // -----------------------------------------------------------------------------------------------------------------
+        // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
+        Calendar.prototype.getNow = function () {
+            var now = this.opt('now');
+            if (typeof now === 'function') {
+                now = now();
+            }
+            if (now == null) {
+                return this.dateEnv.createNowMarker();
+            }
+            return this.dateEnv.createMarker(now);
+        };
+        // Event-Date Utilities
+        // -----------------------------------------------------------------------------------------------------------------
+        // Given an event's allDay status and start date, return what its fallback end date should be.
+        // TODO: rename to computeDefaultEventEnd
+        Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
+            var end = marker;
+            if (allDay) {
+                end = startOfDay(end);
+                end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
+            }
+            else {
+                end = this.dateEnv.add(end, this.defaultTimedEventDuration);
+            }
+            return end;
+        };
+        // Public Events API
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.addEvent = function (eventInput, sourceInput) {
+            if (eventInput instanceof EventApi) {
+                var def = eventInput._def;
+                var instance = eventInput._instance;
+                // not already present? don't want to add an old snapshot
+                if (!this.state.eventStore.defs[def.defId]) {
+                    this.dispatch({
+                        type: 'ADD_EVENTS',
+                        eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
+                    });
+                }
+                return eventInput;
+            }
+            var sourceId;
+            if (sourceInput instanceof EventSourceApi) {
+                sourceId = sourceInput.internalEventSource.sourceId;
+            }
+            else if (sourceInput != null) {
+                var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
+                if (!sourceApi) {
+                    console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
+                    return null;
+                }
+                else {
+                    sourceId = sourceApi.internalEventSource.sourceId;
+                }
+            }
+            var tuple = parseEvent(eventInput, sourceId, this);
+            if (tuple) {
+                this.dispatch({
+                    type: 'ADD_EVENTS',
+                    eventStore: eventTupleToStore(tuple)
+                });
+                return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
+            }
+            return null;
+        };
+        // TODO: optimize
+        Calendar.prototype.getEventById = function (id) {
+            var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
+            id = String(id);
+            for (var defId in defs) {
+                var def = defs[defId];
+                if (def.publicId === id) {
+                    if (def.recurringDef) {
+                        return new EventApi(this, def, null);
+                    }
+                    else {
+                        for (var instanceId in instances) {
+                            var instance = instances[instanceId];
+                            if (instance.defId === def.defId) {
+                                return new EventApi(this, def, instance);
+                            }
+                        }
+                    }
+                }
+            }
+            return null;
+        };
+        Calendar.prototype.getEvents = function () {
+            var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
+            var eventApis = [];
+            for (var id in instances) {
+                var instance = instances[id];
+                var def = defs[instance.defId];
+                eventApis.push(new EventApi(this, def, instance));
+            }
+            return eventApis;
+        };
+        Calendar.prototype.removeAllEvents = function () {
+            this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
+        };
+        Calendar.prototype.rerenderEvents = function () {
+            this.dispatch({ type: 'RESET_EVENTS' });
+        };
+        // Public Event Sources API
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.getEventSources = function () {
+            var sourceHash = this.state.eventSources;
+            var sourceApis = [];
+            for (var internalId in sourceHash) {
+                sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
+            }
+            return sourceApis;
+        };
+        Calendar.prototype.getEventSourceById = function (id) {
+            var sourceHash = this.state.eventSources;
+            id = String(id);
+            for (var sourceId in sourceHash) {
+                if (sourceHash[sourceId].publicId === id) {
+                    return new EventSourceApi(this, sourceHash[sourceId]);
+                }
+            }
+            return null;
+        };
+        Calendar.prototype.addEventSource = function (sourceInput) {
+            if (sourceInput instanceof EventSourceApi) {
+                // not already present? don't want to add an old snapshot
+                if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
+                    this.dispatch({
+                        type: 'ADD_EVENT_SOURCES',
+                        sources: [sourceInput.internalEventSource]
+                    });
+                }
+                return sourceInput;
+            }
+            var eventSource = parseEventSource(sourceInput, this);
+            if (eventSource) { // TODO: error otherwise?
+                this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
+                return new EventSourceApi(this, eventSource);
+            }
+            return null;
+        };
+        Calendar.prototype.removeAllEventSources = function () {
+            this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
+        };
+        Calendar.prototype.refetchEvents = function () {
+            this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
+        };
+        // Scroll
+        // -----------------------------------------------------------------------------------------------------------------
+        Calendar.prototype.scrollToTime = function (timeInput) {
+            var time = createDuration(timeInput);
+            if (time) {
+                this.component.view.scrollToTime(time);
+            }
+        };
+        return Calendar;
+    }());
+    EmitterMixin.mixInto(Calendar);
+    // for memoizers
+    // -----------------------------------------------------------------------------------------------------------------
+    function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
+        return new DateEnv({
+            calendarSystem: 'gregory',
+            timeZone: timeZone,
+            namedTimeZoneImpl: namedTimeZoneImpl,
+            locale: locale,
+            weekNumberCalculation: weekNumberCalculation,
+            firstDay: firstDay,
+            weekLabel: weekLabel,
+            cmdFormatter: cmdFormatter
+        });
+    }
+    function buildTheme(calendarOptions) {
+        var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
+        return new themeClass(calendarOptions);
+    }
+    function buildDelayedRerender(wait) {
+        var func = this.tryRerender.bind(this);
+        if (wait != null) {
+            func = debounce(func, wait);
+        }
+        return func;
+    }
+    function buildEventUiBySource(eventSources) {
+        return mapHash(eventSources, function (eventSource) {
+            return eventSource.ui;
+        });
+    }
+    function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
+        var eventUiBases = { '': eventUiSingleBase };
+        for (var defId in eventDefs) {
+            var def = eventDefs[defId];
+            if (def.sourceId && eventUiBySource[def.sourceId]) {
+                eventUiBases[defId] = eventUiBySource[def.sourceId];
+            }
+        }
+        return eventUiBases;
+    }
+
+    var View = /** @class */ (function (_super) {
+        __extends(View, _super);
+        function View(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK)
+            ) || this;
+            _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
+            _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
+            _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
+            _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
+            _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
+            _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
+            _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
+            _this.viewSpec = viewSpec;
+            _this.dateProfileGenerator = dateProfileGenerator;
+            _this.type = viewSpec.type;
+            _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder'));
+            _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold'));
+            parentEl.appendChild(_this.el);
+            _this.initialize();
+            return _this;
+        }
+        View.prototype.initialize = function () {
+        };
+        Object.defineProperty(View.prototype, "activeStart", {
+            // Date Setting/Unsetting
+            // -----------------------------------------------------------------------------------------------------------------
+            get: function () {
+                return this.dateEnv.toDate(this.props.dateProfile.activeRange.start);
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(View.prototype, "activeEnd", {
+            get: function () {
+                return this.dateEnv.toDate(this.props.dateProfile.activeRange.end);
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(View.prototype, "currentStart", {
+            get: function () {
+                return this.dateEnv.toDate(this.props.dateProfile.currentRange.start);
+            },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(View.prototype, "currentEnd", {
+            get: function () {
+                return this.dateEnv.toDate(this.props.dateProfile.currentRange.end);
+            },
+            enumerable: true,
+            configurable: true
+        });
+        // General Rendering
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.render = function (props) {
+            this.renderDatesMem(props.dateProfile);
+            this.renderBusinessHoursMem(props.businessHours);
+            this.renderDateSelectionMem(props.dateSelection);
+            this.renderEventsMem(props.eventStore);
+            this.renderEventSelectionMem(props.eventSelection);
+            this.renderEventDragMem(props.eventDrag);
+            this.renderEventResizeMem(props.eventResize);
+        };
+        View.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.renderDatesMem.unrender(); // should unrender everything else
+        };
+        // Sizing
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
+            var calendar = this.calendar;
+            if (isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated) {
+                // sort of the catch-all sizing
+                // anything that might cause dimension changes
+                this.updateBaseSize(isResize, viewHeight, isAuto);
+            }
+        };
+        View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
+        };
+        // Date Rendering
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderDatesWrap = function (dateProfile) {
+            this.renderDates(dateProfile);
+            this.addScroll({
+                timeMs: createDuration(this.opt('scrollTime')).milliseconds
+            });
+            this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon
+        };
+        View.prototype.unrenderDatesWrap = function () {
+            this.stopNowIndicator();
+            this.unrenderDates();
+        };
+        View.prototype.renderDates = function (dateProfile) { };
+        View.prototype.unrenderDates = function () { };
+        // Business Hours
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderBusinessHours = function (businessHours) { };
+        View.prototype.unrenderBusinessHours = function () { };
+        // Date Selection
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderDateSelectionWrap = function (selection) {
+            if (selection) {
+                this.renderDateSelection(selection);
+            }
+        };
+        View.prototype.unrenderDateSelectionWrap = function (selection) {
+            if (selection) {
+                this.unrenderDateSelection(selection);
+            }
+        };
+        View.prototype.renderDateSelection = function (selection) { };
+        View.prototype.unrenderDateSelection = function (selection) { };
+        // Event Rendering
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderEvents = function (eventStore) { };
+        View.prototype.unrenderEvents = function () { };
+        // util for subclasses
+        View.prototype.sliceEvents = function (eventStore, allDay) {
+            var props = this.props;
+            return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;
+        };
+        // Event Selection
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderEventSelectionWrap = function (instanceId) {
+            if (instanceId) {
+                this.renderEventSelection(instanceId);
+            }
+        };
+        View.prototype.unrenderEventSelectionWrap = function (instanceId) {
+            if (instanceId) {
+                this.unrenderEventSelection(instanceId);
+            }
+        };
+        View.prototype.renderEventSelection = function (instanceId) { };
+        View.prototype.unrenderEventSelection = function (instanceId) { };
+        // Event Drag
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderEventDragWrap = function (state) {
+            if (state) {
+                this.renderEventDrag(state);
+            }
+        };
+        View.prototype.unrenderEventDragWrap = function (state) {
+            if (state) {
+                this.unrenderEventDrag(state);
+            }
+        };
+        View.prototype.renderEventDrag = function (state) { };
+        View.prototype.unrenderEventDrag = function (state) { };
+        // Event Resize
+        // -----------------------------------------------------------------------------------------------------------------
+        View.prototype.renderEventResizeWrap = function (state) {
+            if (state) {
+                this.renderEventResize(state);
+            }
+        };
+        View.prototype.unrenderEventResizeWrap = function (state) {
+            if (state) {
+                this.unrenderEventResize(state);
+            }
+        };
+        View.prototype.renderEventResize = function (state) { };
+        View.prototype.unrenderEventResize = function (state) { };
+        /* Now Indicator
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Immediately render the current time indicator and begins re-rendering it at an interval,
+        // which is defined by this.getNowIndicatorUnit().
+        // TODO: somehow do this for the current whole day's background too
+        View.prototype.startNowIndicator = function (dateProfile) {
+            var _this = this;
+            var dateEnv = this.dateEnv;
+            var unit;
+            var update;
+            var delay; // ms wait value
+            if (this.opt('nowIndicator')) {
+                unit = this.getNowIndicatorUnit(dateProfile);
+                if (unit) {
+                    update = this.updateNowIndicator.bind(this);
+                    this.initialNowDate = this.calendar.getNow();
+                    this.initialNowQueriedMs = new Date().valueOf();
+                    // wait until the beginning of the next interval
+                    delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
+                    // TODO: maybe always use setTimeout, waiting until start of next unit
+                    this.nowIndicatorTimeoutID = setTimeout(function () {
+                        _this.nowIndicatorTimeoutID = null;
+                        update();
+                        if (unit === 'second') {
+                            delay = 1000; // every second
+                        }
+                        else {
+                            delay = 1000 * 60; // otherwise, every minute
+                        }
+                        _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
+                    }, delay);
+                }
+                // rendering will be initiated in updateSize
+            }
+        };
+        // rerenders the now indicator, computing the new current time from the amount of time that has passed
+        // since the initial getNow call.
+        View.prototype.updateNowIndicator = function () {
+            if (this.props.dateProfile && // a way to determine if dates were rendered yet
+                this.initialNowDate // activated before?
+            ) {
+                this.unrenderNowIndicator(); // won't unrender if unnecessary
+                this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
+                this.isNowIndicatorRendered = true;
+            }
+        };
+        // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
+        // Won't cause side effects if indicator isn't rendered.
+        View.prototype.stopNowIndicator = function () {
+            if (this.isNowIndicatorRendered) {
+                if (this.nowIndicatorTimeoutID) {
+                    clearTimeout(this.nowIndicatorTimeoutID);
+                    this.nowIndicatorTimeoutID = null;
+                }
+                if (this.nowIndicatorIntervalID) {
+                    clearInterval(this.nowIndicatorIntervalID);
+                    this.nowIndicatorIntervalID = null;
+                }
+                this.unrenderNowIndicator();
+                this.isNowIndicatorRendered = false;
+            }
+        };
+        View.prototype.getNowIndicatorUnit = function (dateProfile) {
+            // subclasses should implement
+        };
+        // Renders a current time indicator at the given datetime
+        View.prototype.renderNowIndicator = function (date) {
+            // SUBCLASSES MUST PASS TO CHILDREN!
+        };
+        // Undoes the rendering actions from renderNowIndicator
+        View.prototype.unrenderNowIndicator = function () {
+            // SUBCLASSES MUST PASS TO CHILDREN!
+        };
+        /* Scroller
+        ------------------------------------------------------------------------------------------------------------------*/
+        View.prototype.addScroll = function (scroll) {
+            var queuedScroll = this.queuedScroll || (this.queuedScroll = {});
+            __assign(queuedScroll, scroll);
+        };
+        View.prototype.popScroll = function (isResize) {
+            this.applyQueuedScroll(isResize);
+            this.queuedScroll = null;
+        };
+        View.prototype.applyQueuedScroll = function (isResize) {
+            this.applyScroll(this.queuedScroll || {}, isResize);
+        };
+        View.prototype.queryScroll = function () {
+            var scroll = {};
+            if (this.props.dateProfile) { // dates rendered yet?
+                __assign(scroll, this.queryDateScroll());
+            }
+            return scroll;
+        };
+        View.prototype.applyScroll = function (scroll, isResize) {
+            var timeMs = scroll.timeMs;
+            if (timeMs != null) {
+                delete scroll.timeMs;
+                if (this.props.dateProfile) { // dates rendered yet?
+                    __assign(scroll, this.computeDateScroll(timeMs));
+                }
+            }
+            if (this.props.dateProfile) { // dates rendered yet?
+                this.applyDateScroll(scroll);
+            }
+        };
+        View.prototype.computeDateScroll = function (timeMs) {
+            return {}; // subclasses must implement
+        };
+        View.prototype.queryDateScroll = function () {
+            return {}; // subclasses must implement
+        };
+        View.prototype.applyDateScroll = function (scroll) {
+            // subclasses must implement
+        };
+        // for API
+        View.prototype.scrollToTime = function (time) {
+            this.applyScroll({
+                timeMs: time.milliseconds
+            }, false);
+        };
+        return View;
+    }(DateComponent));
+    EmitterMixin.mixInto(View);
+    View.prototype.usesMinMaxTime = false;
+    View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
+
+    var FgEventRenderer = /** @class */ (function () {
+        function FgEventRenderer(context) {
+            this.segs = [];
+            this.isSizeDirty = false;
+            this.context = context;
+        }
+        FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) {
+            this.rangeUpdated(); // called too frequently :(
+            // render an `.el` on each seg
+            // returns a subset of the segs. segs that were actually rendered
+            segs = this.renderSegEls(segs, mirrorInfo);
+            this.segs = segs;
+            this.attachSegs(segs, mirrorInfo);
+            this.isSizeDirty = true;
+            this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo));
+        };
+        FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) {
+            this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo));
+            this.detachSegs(this.segs);
+            this.segs = [];
+        };
+        // Updates values that rely on options and also relate to range
+        FgEventRenderer.prototype.rangeUpdated = function () {
+            var options = this.context.options;
+            var displayEventTime;
+            var displayEventEnd;
+            this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
+            displayEventTime = options.displayEventTime;
+            if (displayEventTime == null) {
+                displayEventTime = this.computeDisplayEventTime(); // might be based off of range
+            }
+            displayEventEnd = options.displayEventEnd;
+            if (displayEventEnd == null) {
+                displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
+            }
+            this.displayEventTime = displayEventTime;
+            this.displayEventEnd = displayEventEnd;
+        };
+        // Renders and assigns an `el` property for each foreground event segment.
+        // Only returns segments that successfully rendered.
+        FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
+            var html = '';
+            var i;
+            if (segs.length) { // don't build an empty html string
+                // build a large concatenation of event segment HTML
+                for (i = 0; i < segs.length; i++) {
+                    html += this.renderSegHtml(segs[i], mirrorInfo);
+                }
+                // Grab individual elements from the combined HTML string. Use each as the default rendering.
+                // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
+                htmlToElements(html).forEach(function (el, i) {
+                    var seg = segs[i];
+                    if (el) {
+                        seg.el = el;
+                    }
+                });
+                segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo));
+            }
+            return segs;
+        };
+        // Generic utility for generating the HTML classNames for an event segment's element
+        FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
+            var classes = [
+                'fc-event',
+                seg.isStart ? 'fc-start' : 'fc-not-start',
+                seg.isEnd ? 'fc-end' : 'fc-not-end'
+            ].concat(seg.eventRange.ui.classNames);
+            if (isDraggable) {
+                classes.push('fc-draggable');
+            }
+            if (isResizable) {
+                classes.push('fc-resizable');
+            }
+            if (mirrorInfo) {
+                classes.push('fc-mirror');
+                if (mirrorInfo.isDragging) {
+                    classes.push('fc-dragging');
+                }
+                if (mirrorInfo.isResizing) {
+                    classes.push('fc-resizing');
+                }
+            }
+            return classes;
+        };
+        // Compute the text that should be displayed on an event's element.
+        // `range` can be the Event object itself, or something range-like, with at least a `start`.
+        // If event times are disabled, or the event has no time, will return a blank string.
+        // If not specified, formatter will default to the eventTimeFormat setting,
+        // and displayEnd will default to the displayEventEnd setting.
+        FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
+            var def = eventRange.def, instance = eventRange.instance;
+            return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
+        };
+        FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
+            var dateEnv = this.context.dateEnv;
+            if (formatter == null) {
+                formatter = this.eventTimeFormat;
+            }
+            if (displayEnd == null) {
+                displayEnd = this.displayEventEnd;
+            }
+            if (this.displayEventTime && !allDay) {
+                if (displayEnd && end) {
+                    return dateEnv.formatRange(start, end, formatter, {
+                        forcedStartTzo: forcedStartTzo,
+                        forcedEndTzo: forcedEndTzo
+                    });
+                }
+                else {
+                    return dateEnv.format(start, formatter, {
+                        forcedTzo: forcedStartTzo
+                    });
+                }
+            }
+            return '';
+        };
+        FgEventRenderer.prototype.computeEventTimeFormat = function () {
+            return {
+                hour: 'numeric',
+                minute: '2-digit',
+                omitZeroMinute: true
+            };
+        };
+        FgEventRenderer.prototype.computeDisplayEventTime = function () {
+            return true;
+        };
+        FgEventRenderer.prototype.computeDisplayEventEnd = function () {
+            return true;
+        };
+        // Utility for generating event skin-related CSS properties
+        FgEventRenderer.prototype.getSkinCss = function (ui) {
+            return {
+                'background-color': ui.backgroundColor,
+                'border-color': ui.borderColor,
+                color: ui.textColor
+            };
+        };
+        FgEventRenderer.prototype.sortEventSegs = function (segs) {
+            var specs = this.context.view.eventOrderSpecs;
+            var objs = segs.map(buildSegCompareObj);
+            objs.sort(function (obj0, obj1) {
+                return compareByFieldSpecs(obj0, obj1, specs);
+            });
+            return objs.map(function (c) {
+                return c._seg;
+            });
+        };
+        FgEventRenderer.prototype.computeSizes = function (force) {
+            if (force || this.isSizeDirty) {
+                this.computeSegSizes(this.segs);
+            }
+        };
+        FgEventRenderer.prototype.assignSizes = function (force) {
+            if (force || this.isSizeDirty) {
+                this.assignSegSizes(this.segs);
+                this.isSizeDirty = false;
+            }
+        };
+        FgEventRenderer.prototype.computeSegSizes = function (segs) {
+        };
+        FgEventRenderer.prototype.assignSegSizes = function (segs) {
+        };
+        // Manipulation on rendered segs
+        FgEventRenderer.prototype.hideByHash = function (hash) {
+            if (hash) {
+                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
+                    var seg = _a[_i];
+                    if (hash[seg.eventRange.instance.instanceId]) {
+                        seg.el.style.visibility = 'hidden';
+                    }
+                }
+            }
+        };
+        FgEventRenderer.prototype.showByHash = function (hash) {
+            if (hash) {
+                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
+                    var seg = _a[_i];
+                    if (hash[seg.eventRange.instance.instanceId]) {
+                        seg.el.style.visibility = '';
+                    }
+                }
+            }
+        };
+        FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
+            if (instanceId) {
+                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
+                    var seg = _a[_i];
+                    var eventInstance = seg.eventRange.instance;
+                    if (eventInstance && eventInstance.instanceId === instanceId &&
+                        seg.el // necessary?
+                    ) {
+                        seg.el.classList.add('fc-selected');
+                    }
+                }
+            }
+        };
+        FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
+            if (instanceId) {
+                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
+                    var seg = _a[_i];
+                    if (seg.el) { // necessary?
+                        seg.el.classList.remove('fc-selected');
+                    }
+                }
+            }
+        };
+        return FgEventRenderer;
+    }());
+    // returns a object with all primitive props that can be compared
+    function buildSegCompareObj(seg) {
+        var eventDef = seg.eventRange.def;
+        var range = seg.eventRange.instance.range;
+        var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
+        var end = range.end ? range.end.valueOf() : 0; // "
+        return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
+            end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
+         });
+    }
+
+    var FillRenderer = /** @class */ (function () {
+        function FillRenderer(context) {
+            this.fillSegTag = 'div';
+            this.dirtySizeFlags = {};
+            this.context = context;
+            this.containerElsByType = {};
+            this.segsByType = {};
+        }
+        FillRenderer.prototype.getSegsByType = function (type) {
+            return this.segsByType[type] || [];
+        };
+        FillRenderer.prototype.renderSegs = function (type, segs) {
+            var _a;
+            var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
+            var containerEls = this.attachSegs(type, renderedSegs);
+            if (containerEls) {
+                (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
+            }
+            this.segsByType[type] = renderedSegs;
+            if (type === 'bgEvent') {
+                this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false
+            }
+            this.dirtySizeFlags[type] = true;
+        };
+        // Unrenders a specific type of fill that is currently rendered on the grid
+        FillRenderer.prototype.unrender = function (type) {
+            var segs = this.segsByType[type];
+            if (segs) {
+                if (type === 'bgEvent') {
+                    this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false
+                }
+                this.detachSegs(type, segs);
+            }
+        };
+        // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
+        // Only returns segments that successfully rendered.
+        FillRenderer.prototype.renderSegEls = function (type, segs) {
+            var _this = this;
+            var html = '';
+            var i;
+            if (segs.length) {
+                // build a large concatenation of segment HTML
+                for (i = 0; i < segs.length; i++) {
+                    html += this.renderSegHtml(type, segs[i]);
+                }
+                // Grab individual elements from the combined HTML string. Use each as the default rendering.
+                // Then, compute the 'el' for each segment.
+                htmlToElements(html).forEach(function (el, i) {
+                    var seg = segs[i];
+                    if (el) {
+                        seg.el = el;
+                    }
+                });
+                if (type === 'bgEvent') {
+                    segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements
+                    );
+                }
+                // correct element type? (would be bad if a non-TD were inserted into a table for example)
+                segs = segs.filter(function (seg) {
+                    return elementMatches(seg.el, _this.fillSegTag);
+                });
+            }
+            return segs;
+        };
+        // Builds the HTML needed for one fill segment. Generic enough to work with different types.
+        FillRenderer.prototype.renderSegHtml = function (type, seg) {
+            var css = null;
+            var classNames = [];
+            if (type !== 'highlight' && type !== 'businessHours') {
+                css = {
+                    'background-color': seg.eventRange.ui.backgroundColor
+                };
+            }
+            if (type !== 'highlight') {
+                classNames = classNames.concat(seg.eventRange.ui.classNames);
+            }
+            if (type === 'businessHours') {
+                classNames.push('fc-bgevent');
+            }
+            else {
+                classNames.push('fc-' + type.toLowerCase());
+            }
+            return '<' + this.fillSegTag +
+                (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
+                (css ? ' style="' + cssToStr(css) + '"' : '') +
+                '></' + this.fillSegTag + '>';
+        };
+        FillRenderer.prototype.detachSegs = function (type, segs) {
+            var containerEls = this.containerElsByType[type];
+            if (containerEls) {
+                containerEls.forEach(removeElement);
+                delete this.containerElsByType[type];
+            }
+        };
+        FillRenderer.prototype.computeSizes = function (force) {
+            for (var type in this.segsByType) {
+                if (force || this.dirtySizeFlags[type]) {
+                    this.computeSegSizes(this.segsByType[type]);
+                }
+            }
+        };
+        FillRenderer.prototype.assignSizes = function (force) {
+            for (var type in this.segsByType) {
+                if (force || this.dirtySizeFlags[type]) {
+                    this.assignSegSizes(this.segsByType[type]);
+                }
+            }
+            this.dirtySizeFlags = {};
+        };
+        FillRenderer.prototype.computeSegSizes = function (segs) {
+        };
+        FillRenderer.prototype.assignSegSizes = function (segs) {
+        };
+        return FillRenderer;
+    }());
+
+    var NamedTimeZoneImpl = /** @class */ (function () {
+        function NamedTimeZoneImpl(timeZoneName) {
+            this.timeZoneName = timeZoneName;
+        }
+        return NamedTimeZoneImpl;
+    }());
+
+    /*
+    An abstraction for a dragging interaction originating on an event.
+    Does higher-level things than PointerDragger, such as possibly:
+    - a "mirror" that moves with the pointer
+    - a minimum number of pixels or other criteria for a true drag to begin
+
+    subclasses must emit:
+    - pointerdown
+    - dragstart
+    - dragmove
+    - pointerup
+    - dragend
+    */
+    var ElementDragging = /** @class */ (function () {
+        function ElementDragging(el) {
+            this.emitter = new EmitterMixin();
+        }
+        ElementDragging.prototype.destroy = function () {
+        };
+        ElementDragging.prototype.setMirrorIsVisible = function (bool) {
+            // optional if subclass doesn't want to support a mirror
+        };
+        ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
+            // optional if subclass doesn't want to support a mirror
+        };
+        ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
+            // optional
+        };
+        return ElementDragging;
+    }());
+
+    function formatDate(dateInput, settings) {
+        if (settings === void 0) { settings = {}; }
+        var dateEnv = buildDateEnv$1(settings);
+        var formatter = createFormatter(settings);
+        var dateMeta = dateEnv.createMarkerMeta(dateInput);
+        if (!dateMeta) { // TODO: warning?
+            return '';
+        }
+        return dateEnv.format(dateMeta.marker, formatter, {
+            forcedTzo: dateMeta.forcedTzo
+        });
+    }
+    function formatRange(startInput, endInput, settings // mixture of env and formatter settings
+    ) {
+        var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
+        var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
+        var startMeta = dateEnv.createMarkerMeta(startInput);
+        var endMeta = dateEnv.createMarkerMeta(endInput);
+        if (!startMeta || !endMeta) { // TODO: warning?
+            return '';
+        }
+        return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
+            forcedStartTzo: startMeta.forcedTzo,
+            forcedEndTzo: endMeta.forcedTzo,
+            isEndExclusive: settings.isEndExclusive
+        });
+    }
+    // TODO: more DRY and optimized
+    function buildDateEnv$1(settings) {
+        var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
+        // ensure required settings
+        settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
+        return new DateEnv(settings);
+    }
+
+    var DRAG_META_PROPS = {
+        startTime: createDuration,
+        duration: createDuration,
+        create: Boolean,
+        sourceId: String
+    };
+    var DRAG_META_DEFAULTS = {
+        create: true
+    };
+    function parseDragMeta(raw) {
+        var leftoverProps = {};
+        var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
+        refined.leftoverProps = leftoverProps;
+        return refined;
+    }
+
+    // Computes a default column header formatting string if `colFormat` is not explicitly defined
+    function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
+        // if more than one week row, or if there are a lot of columns with not much space,
+        // put just the day numbers will be in each cell
+        if (!datesRepDistinctDays || dayCnt > 10) {
+            return { weekday: 'short' }; // "Sat"
+        }
+        else if (dayCnt > 1) {
+            return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
+        }
+        else {
+            return { weekday: 'long' }; // "Saturday"
+        }
+    }
+    function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
+        var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options;
+        var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
+        var classNames = [
+            'fc-day-header',
+            theme.getClass('widgetHeader')
+        ];
+        var innerHtml;
+        if (typeof options.columnHeaderHtml === 'function') {
+            innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
+        }
+        else if (typeof options.columnHeaderText === 'function') {
+            innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
+        }
+        else {
+            innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
+        }
+        // if only one row of days, the classNames on the header can represent the specific days beneath
+        if (datesRepDistinctDays) {
+            classNames = classNames.concat(
+            // includes the day-of-week class
+            // noThemeHighlight=true (don't highlight the header)
+            getDayClasses(dateMarker, dateProfile, context, true));
+        }
+        else {
+            classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
+        }
+        return '' +
+            '<th class="' + classNames.join(' ') + '"' +
+            ((isDateValid && datesRepDistinctDays) ?
+                ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
+                '') +
+            (colspan > 1 ?
+                ' colspan="' + colspan + '"' :
+                '') +
+            (otherAttrs ?
+                ' ' + otherAttrs :
+                '') +
+            '>' +
+            (isDateValid ?
+                // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
+                buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
+                // if not valid, display text, but no link
+                innerHtml) +
+            '</th>';
+    }
+
+    var DayHeader = /** @class */ (function (_super) {
+        __extends(DayHeader, _super);
+        function DayHeader(context, parentEl) {
+            var _this = _super.call(this, context) || this;
+            parentEl.innerHTML = ''; // because might be nbsp
+            parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
+                '<table class="' + _this.theme.getClass('tableGrid') + '">' +
+                '<thead></thead>' +
+                '</table>' +
+                '</div>'));
+            _this.thead = _this.el.querySelector('thead');
+            return _this;
+        }
+        DayHeader.prototype.destroy = function () {
+            removeElement(this.el);
+        };
+        DayHeader.prototype.render = function (props) {
+            var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
+            var parts = [];
+            if (props.renderIntroHtml) {
+                parts.push(props.renderIntroHtml());
+            }
+            var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') ||
+                computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
+            for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
+                var date = dates_1[_i];
+                parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context));
+            }
+            if (this.isRtl) {
+                parts.reverse();
+            }
+            this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
+        };
+        return DayHeader;
+    }(Component));
+
+    var DaySeries = /** @class */ (function () {
+        function DaySeries(range, dateProfileGenerator) {
+            var date = range.start;
+            var end = range.end;
+            var indices = [];
+            var dates = [];
+            var dayIndex = -1;
+            while (date < end) { // loop each day from start to end
+                if (dateProfileGenerator.isHiddenDay(date)) {
+                    indices.push(dayIndex + 0.5); // mark that it's between indices
+                }
+                else {
+                    dayIndex++;
+                    indices.push(dayIndex);
+                    dates.push(date);
+                }
+                date = addDays(date, 1);
+            }
+            this.dates = dates;
+            this.indices = indices;
+            this.cnt = dates.length;
+        }
+        DaySeries.prototype.sliceRange = function (range) {
+            var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
+            var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
+            var clippedFirstIndex = Math.max(0, firstIndex);
+            var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
+            // deal with in-between indices
+            clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
+            clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
+            if (clippedFirstIndex <= clippedLastIndex) {
+                return {
+                    firstIndex: clippedFirstIndex,
+                    lastIndex: clippedLastIndex,
+                    isStart: firstIndex === clippedFirstIndex,
+                    isEnd: lastIndex === clippedLastIndex
+                };
+            }
+            else {
+                return null;
+            }
+        };
+        // Given a date, returns its chronolocial cell-index from the first cell of the grid.
+        // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
+        // If before the first offset, returns a negative number.
+        // If after the last offset, returns an offset past the last cell offset.
+        // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
+        DaySeries.prototype.getDateDayIndex = function (date) {
+            var indices = this.indices;
+            var dayOffset = Math.floor(diffDays(this.dates[0], date));
+            if (dayOffset < 0) {
+                return indices[0] - 1;
+            }
+            else if (dayOffset >= indices.length) {
+                return indices[indices.length - 1] + 1;
+            }
+            else {
+                return indices[dayOffset];
+            }
+        };
+        return DaySeries;
+    }());
+
+    var DayTable = /** @class */ (function () {
+        function DayTable(daySeries, breakOnWeeks) {
+            var dates = daySeries.dates;
+            var daysPerRow;
+            var firstDay;
+            var rowCnt;
+            if (breakOnWeeks) {
+                // count columns until the day-of-week repeats
+                firstDay = dates[0].getUTCDay();
+                for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
+                    if (dates[daysPerRow].getUTCDay() === firstDay) {
+                        break;
+                    }
+                }
+                rowCnt = Math.ceil(dates.length / daysPerRow);
+            }
+            else {
+                rowCnt = 1;
+                daysPerRow = dates.length;
+            }
+            this.rowCnt = rowCnt;
+            this.colCnt = daysPerRow;
+            this.daySeries = daySeries;
+            this.cells = this.buildCells();
+            this.headerDates = this.buildHeaderDates();
+        }
+        DayTable.prototype.buildCells = function () {
+            var rows = [];
+            for (var row = 0; row < this.rowCnt; row++) {
+                var cells = [];
+                for (var col = 0; col < this.colCnt; col++) {
+                    cells.push(this.buildCell(row, col));
+                }
+                rows.push(cells);
+            }
+            return rows;
+        };
+        DayTable.prototype.buildCell = function (row, col) {
+            return {
+                date: this.daySeries.dates[row * this.colCnt + col]
+            };
+        };
+        DayTable.prototype.buildHeaderDates = function () {
+            var dates = [];
+            for (var col = 0; col < this.colCnt; col++) {
+                dates.push(this.cells[0][col].date);
+            }
+            return dates;
+        };
+        DayTable.prototype.sliceRange = function (range) {
+            var colCnt = this.colCnt;
+            var seriesSeg = this.daySeries.sliceRange(range);
+            var segs = [];
+            if (seriesSeg) {
+                var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
+                var index = firstIndex;
+                while (index <= lastIndex) {
+                    var row = Math.floor(index / colCnt);
+                    var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
+                    segs.push({
+                        row: row,
+                        firstCol: index % colCnt,
+                        lastCol: (nextIndex - 1) % colCnt,
+                        isStart: seriesSeg.isStart && index === firstIndex,
+                        isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
+                    });
+                    index = nextIndex;
+                }
+            }
+            return segs;
+        };
+        return DayTable;
+    }());
+
+    var Slicer = /** @class */ (function () {
+        function Slicer() {
+            this.sliceBusinessHours = memoize(this._sliceBusinessHours);
+            this.sliceDateSelection = memoize(this._sliceDateSpan);
+            this.sliceEventStore = memoize(this._sliceEventStore);
+            this.sliceEventDrag = memoize(this._sliceInteraction);
+            this.sliceEventResize = memoize(this._sliceInteraction);
+        }
+        Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) {
+            var extraArgs = [];
+            for (var _i = 4; _i < arguments.length; _i++) {
+                extraArgs[_i - 4] = arguments[_i];
+            }
+            var eventUiBases = props.eventUiBases;
+            var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
+            return {
+                dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
+                businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)),
+                fgEventSegs: eventSegs.fg,
+                bgEventSegs: eventSegs.bg,
+                eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
+                eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
+                eventSelection: props.eventSelection
+            }; // TODO: give interactionSegs?
+        };
+        Slicer.prototype.sliceNowDate = function (// does not memoize
+        date, component) {
+            var extraArgs = [];
+            for (var _i = 2; _i < arguments.length; _i++) {
+                extraArgs[_i - 2] = arguments[_i];
+            }
+            return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
+                {},
+                component].concat(extraArgs));
+        };
+        Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) {
+            var extraArgs = [];
+            for (var _i = 4; _i < arguments.length; _i++) {
+                extraArgs[_i - 4] = arguments[_i];
+            }
+            if (!businessHours) {
+                return [];
+            }
+            return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar),
+                {},
+                dateProfile,
+                nextDayThreshold,
+                component].concat(extraArgs)).bg;
+        };
+        Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
+            var extraArgs = [];
+            for (var _i = 5; _i < arguments.length; _i++) {
+                extraArgs[_i - 5] = arguments[_i];
+            }
+            if (eventStore) {
+                var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
+                return {
+                    bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
+                    fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
+                };
+            }
+            else {
+                return { bg: [], fg: [] };
+            }
+        };
+        Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
+            var extraArgs = [];
+            for (var _i = 5; _i < arguments.length; _i++) {
+                extraArgs[_i - 5] = arguments[_i];
+            }
+            if (!interaction) {
+                return null;
+            }
+            var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
+            return {
+                segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
+                affectedInstances: interaction.affectedEvents.instances,
+                isEvent: interaction.isEvent,
+                sourceSeg: interaction.origSeg
+            };
+        };
+        Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
+            var extraArgs = [];
+            for (var _i = 3; _i < arguments.length; _i++) {
+                extraArgs[_i - 3] = arguments[_i];
+            }
+            if (!dateSpan) {
+                return [];
+            }
+            var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar);
+            var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
+            for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
+                var seg = segs_1[_a];
+                seg.component = component;
+                seg.eventRange = eventRange;
+            }
+            return segs;
+        };
+        /*
+        "complete" seg means it has component and eventRange
+        */
+        Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
+        extraArgs) {
+            var segs = [];
+            for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
+                var eventRange = eventRanges_1[_i];
+                segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
+            }
+            return segs;
+        };
+        /*
+        "complete" seg means it has component and eventRange
+        */
+        Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
+        extraArgs) {
+            var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                seg.component = component;
+                seg.eventRange = eventRange;
+                seg.isStart = eventRange.isStart && seg.isStart;
+                seg.isEnd = eventRange.isEnd && seg.isEnd;
+            }
+            return segs;
+        };
+        return Slicer;
+    }());
+    /*
+    for incorporating minTime/maxTime if appropriate
+    TODO: should be part of DateProfile!
+    TimelineDateProfile already does this btw
+    */
+    function computeActiveRange(dateProfile, isComponentAllDay) {
+        var range = dateProfile.activeRange;
+        if (isComponentAllDay) {
+            return range;
+        }
+        return {
+            start: addMs(range.start, dateProfile.minTime.milliseconds),
+            end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
+        };
+    }
+
+    // exports
+    // --------------------------------------------------------------------------------------------------
+    var version = '4.1.0';
+
+    exports.Calendar = Calendar;
+    exports.Component = Component;
+    exports.DateComponent = DateComponent;
+    exports.DateEnv = DateEnv;
+    exports.DateProfileGenerator = DateProfileGenerator;
+    exports.DayHeader = DayHeader;
+    exports.DaySeries = DaySeries;
+    exports.DayTable = DayTable;
+    exports.ElementDragging = ElementDragging;
+    exports.ElementScrollController = ElementScrollController;
+    exports.EmitterMixin = EmitterMixin;
+    exports.EventApi = EventApi;
+    exports.FgEventRenderer = FgEventRenderer;
+    exports.FillRenderer = FillRenderer;
+    exports.Interaction = Interaction;
+    exports.Mixin = Mixin;
+    exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
+    exports.PositionCache = PositionCache;
+    exports.ScrollComponent = ScrollComponent;
+    exports.ScrollController = ScrollController;
+    exports.Slicer = Slicer;
+    exports.Splitter = Splitter;
+    exports.Theme = Theme;
+    exports.View = View;
+    exports.WindowScrollController = WindowScrollController;
+    exports.addDays = addDays;
+    exports.addDurations = addDurations;
+    exports.addMs = addMs;
+    exports.addWeeks = addWeeks;
+    exports.allowContextMenu = allowContextMenu;
+    exports.allowSelection = allowSelection;
+    exports.appendToElement = appendToElement;
+    exports.applyAll = applyAll;
+    exports.applyMutationToEventStore = applyMutationToEventStore;
+    exports.applyStyle = applyStyle;
+    exports.applyStyleProp = applyStyleProp;
+    exports.asRoughMinutes = asRoughMinutes;
+    exports.asRoughMs = asRoughMs;
+    exports.asRoughSeconds = asRoughSeconds;
+    exports.buildGotoAnchorHtml = buildGotoAnchorHtml;
+    exports.buildSegCompareObj = buildSegCompareObj;
+    exports.capitaliseFirstLetter = capitaliseFirstLetter;
+    exports.combineEventUis = combineEventUis;
+    exports.compareByFieldSpec = compareByFieldSpec;
+    exports.compareByFieldSpecs = compareByFieldSpecs;
+    exports.compareNumbers = compareNumbers;
+    exports.compensateScroll = compensateScroll;
+    exports.computeClippingRect = computeClippingRect;
+    exports.computeEdges = computeEdges;
+    exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
+    exports.computeHeightAndMargins = computeHeightAndMargins;
+    exports.computeInnerRect = computeInnerRect;
+    exports.computeRect = computeRect;
+    exports.computeVisibleDayRange = computeVisibleDayRange;
+    exports.config = config;
+    exports.constrainPoint = constrainPoint;
+    exports.createDuration = createDuration;
+    exports.createElement = createElement;
+    exports.createEmptyEventStore = createEmptyEventStore;
+    exports.createEventInstance = createEventInstance;
+    exports.createFormatter = createFormatter;
+    exports.createPlugin = createPlugin;
+    exports.cssToStr = cssToStr;
+    exports.debounce = debounce;
+    exports.diffDates = diffDates;
+    exports.diffDayAndTime = diffDayAndTime;
+    exports.diffDays = diffDays;
+    exports.diffPoints = diffPoints;
+    exports.diffWeeks = diffWeeks;
+    exports.diffWholeDays = diffWholeDays;
+    exports.diffWholeWeeks = diffWholeWeeks;
+    exports.disableCursor = disableCursor;
+    exports.distributeHeight = distributeHeight;
+    exports.elementClosest = elementClosest;
+    exports.elementMatches = elementMatches;
+    exports.enableCursor = enableCursor;
+    exports.eventTupleToStore = eventTupleToStore;
+    exports.filterEventStoreDefs = filterEventStoreDefs;
+    exports.filterHash = filterHash;
+    exports.findChildren = findChildren;
+    exports.findElements = findElements;
+    exports.flexibleCompare = flexibleCompare;
+    exports.forceClassName = forceClassName;
+    exports.formatDate = formatDate;
+    exports.formatIsoTimeString = formatIsoTimeString;
+    exports.formatRange = formatRange;
+    exports.freezeRaw = freezeRaw;
+    exports.getAllDayHtml = getAllDayHtml;
+    exports.getClippingParents = getClippingParents;
+    exports.getDayClasses = getDayClasses;
+    exports.getElSeg = getElSeg;
+    exports.getRectCenter = getRectCenter;
+    exports.getRelevantEvents = getRelevantEvents;
+    exports.globalDefaults = globalDefaults;
+    exports.greatestDurationDenominator = greatestDurationDenominator;
+    exports.hasBgRendering = hasBgRendering;
+    exports.htmlEscape = htmlEscape;
+    exports.htmlToElement = htmlToElement;
+    exports.insertAfterElement = insertAfterElement;
+    exports.interactionSettingsStore = interactionSettingsStore;
+    exports.interactionSettingsToStore = interactionSettingsToStore;
+    exports.intersectRanges = intersectRanges;
+    exports.intersectRects = intersectRects;
+    exports.isArraysEqual = isArraysEqual;
+    exports.isDateSpansEqual = isDateSpansEqual;
+    exports.isInt = isInt;
+    exports.isInteractionValid = isInteractionValid;
+    exports.isMultiDayRange = isMultiDayRange;
+    exports.isObjectsSimilar = isObjectsSimilar;
+    exports.isPropsValid = isPropsValid;
+    exports.isSingleDay = isSingleDay;
+    exports.isValidDate = isValidDate;
+    exports.isValuesSimilar = isValuesSimilar;
+    exports.listenBySelector = listenBySelector;
+    exports.mapHash = mapHash;
+    exports.matchCellWidths = matchCellWidths;
+    exports.memoize = memoize;
+    exports.memoizeOutput = memoizeOutput;
+    exports.memoizeRendering = memoizeRendering;
+    exports.mergeEventStores = mergeEventStores;
+    exports.multiplyDuration = multiplyDuration;
+    exports.padStart = padStart;
+    exports.parseBusinessHours = parseBusinessHours;
+    exports.parseDragMeta = parseDragMeta;
+    exports.parseEventDef = parseEventDef;
+    exports.parseFieldSpecs = parseFieldSpecs;
+    exports.parseMarker = parse;
+    exports.pointInsideRect = pointInsideRect;
+    exports.prependToElement = prependToElement;
+    exports.preventContextMenu = preventContextMenu;
+    exports.preventDefault = preventDefault;
+    exports.preventSelection = preventSelection;
+    exports.processScopedUiProps = processScopedUiProps;
+    exports.rangeContainsMarker = rangeContainsMarker;
+    exports.rangeContainsRange = rangeContainsRange;
+    exports.rangesEqual = rangesEqual;
+    exports.rangesIntersect = rangesIntersect;
+    exports.refineProps = refineProps;
+    exports.removeElement = removeElement;
+    exports.removeExact = removeExact;
+    exports.renderDateCell = renderDateCell;
+    exports.requestJson = requestJson;
+    exports.sliceEventStore = sliceEventStore;
+    exports.startOfDay = startOfDay;
+    exports.subtractInnerElHeight = subtractInnerElHeight;
+    exports.translateRect = translateRect;
+    exports.uncompensateScroll = uncompensateScroll;
+    exports.undistributeHeight = undistributeHeight;
+    exports.unpromisify = unpromisify;
+    exports.version = version;
+    exports.whenTransitionDone = whenTransitionDone;
+    exports.wholeDivideDurations = wholeDivideDurations;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/core/main.min.css b/backoffice/vendors/fullcalendar/core/main.min.css
new file mode 100644 (file)
index 0000000..3c29a2b
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar Core Package v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/core/main.min.js b/backoffice/vendors/fullcalendar/core/main.min.js
new file mode 100644 (file)
index 0000000..a414b0b
--- /dev/null
@@ -0,0 +1,9 @@
+/*!
+FullCalendar Core Package v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):(e=e||self,t(e.FullCalendar={}))}(this,function(e){"use strict";function t(e,t,n){var r=document.createElement(e);if(t)for(var i in t)"style"===i?g(r,t[i]):mi[i]?r[i]=t[i]:r.setAttribute(i,t[i]);return"string"==typeof n?r.innerHTML=n:null!=n&&a(r,n),r}function n(e){e=e.trim();var t=document.createElement(o(e));return t.innerHTML=e,t.firstChild}function r(e){return Array.prototype.slice.call(i(e))}function i(e){e=e.trim();var t=document.createElement(o(e));return t.innerHTML=e,t.childNodes}function o(e){return Ei[e.substr(0,3)]||"div"}function a(e,t){for(var n=l(t),r=0;r<n.length;r++)e.appendChild(n[r])}function s(e,t){for(var n=l(t),r=e.firstChild||null,i=0;i<n.length;i++)e.insertBefore(n[i],r)}function u(e,t){for(var n=l(t),r=e.nextSibling||null,i=0;i<n.length;i++)e.parentNode.insertBefore(n[i],r)}function l(e){return"string"==typeof e?r(e):e instanceof Node?[e]:Array.prototype.slice.call(e)}function c(e){e.parentNode&&e.parentNode.removeChild(e)}function d(e,t){return bi.call(e,t)}function f(e,t){return Si.call(e,t)}function p(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].querySelectorAll(t),a=0;a<o.length;a++)r.push(o[a]);return r}function h(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].children,a=0;a<o.length;a++){var s=o[a];t&&!f(s,t)||r.push(s)}return r}function v(e,t,n){n?e.classList.add(t):e.classList.remove(t)}function g(e,t){for(var n in t)y(e,n,t[n])}function y(e,t,n){null==n?e.style[t]="":"number"==typeof n&&Di.test(t)?e.style[t]=n+"px":e.style[t]=n}function m(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom}function E(e,t){var n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function S(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}}function b(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}}function D(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}}function T(e,t){return{left:e.left-t.left,top:e.top-t.top}}function w(){return null===Ti&&(Ti=R()),Ti}function R(){var e=t("div",{style:{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}},"<div></div>");document.body.appendChild(e);var n=e.firstChild,r=n.getBoundingClientRect().left>e.getBoundingClientRect().left;return c(e),r}function I(e){return e=Math.max(0,e),e=Math.round(e)}function C(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=I(e.offsetWidth-e.clientWidth-r-i),u=I(e.offsetHeight-e.clientHeight-o-a),l={borderLeft:r,borderRight:i,borderTop:o,borderBottom:a,scrollbarBottom:u,scrollbarLeft:0,scrollbarRight:0};return w()&&"rtl"===n.direction?l.scrollbarLeft=s:l.scrollbarRight=s,t&&(l.paddingLeft=parseInt(n.paddingLeft,10)||0,l.paddingRight=parseInt(n.paddingRight,10)||0,l.paddingTop=parseInt(n.paddingTop,10)||0,l.paddingBottom=parseInt(n.paddingBottom,10)||0),l}function M(e,t){void 0===t&&(t=!1);var n=k(e),r=C(e,t),i={left:n.left+r.borderLeft+r.scrollbarLeft,right:n.right-r.borderRight-r.scrollbarRight,top:n.top+r.borderTop,bottom:n.bottom-r.borderBottom-r.scrollbarBottom};return t&&(i.left+=r.paddingLeft,i.right-=r.paddingRight,i.top+=r.paddingTop,i.bottom-=r.paddingBottom),i}function k(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function O(){return{left:window.pageXOffset,right:window.pageXOffset+document.documentElement.clientWidth,top:window.pageYOffset,bottom:window.pageYOffset+document.documentElement.clientHeight}}function _(e){var t=window.getComputedStyle(e);return e.getBoundingClientRect().height+parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}function P(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function H(e){return P(e).map(function(e){return M(e)}).concat(O()).reduce(function(e,t){return E(e,t)||t})}function x(e){e.preventDefault()}function N(e,t,n,r){function i(e){var t=d(e.target,n);t&&r.call(t,e,t)}return e.addEventListener(t,i),function(){e.removeEventListener(t,i)}}function z(e,t,n,r){var i;return N(e,"mouseover",t,function(e,t){if(t!==i){i=t,n(e,t);var o=function(e){i=null,r(e,t),t.removeEventListener("mouseleave",o)};t.addEventListener("mouseleave",o)}})}function U(e,t){var n=function(r){t(r),wi.forEach(function(t){e.removeEventListener(t,n)})};wi.forEach(function(t){e.addEventListener(t,n)})}function L(e,t){var n=ie(e);return n[2]+=7*t,oe(n)}function A(e,t){var n=ie(e);return n[2]+=t,oe(n)}function V(e,t){var n=ie(e);return n[6]+=t,oe(n)}function B(e,t){return F(e,t)/7}function F(e,t){return(t.valueOf()-e.valueOf())/864e5}function W(e,t){return(t.valueOf()-e.valueOf())/36e5}function Z(e,t){return(t.valueOf()-e.valueOf())/6e4}function j(e,t){return(t.valueOf()-e.valueOf())/1e3}function Y(e,t){var n=X(e),r=X(t);return{years:0,months:0,days:Math.round(F(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function q(e,t){var n=G(e,t);return null!==n&&n%7==0?n/7:null}function G(e,t){return se(e)===se(t)?Math.round(F(e,t)):null}function X(e){return oe([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function J(e){return oe([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}function K(e){return oe([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}function Q(e){return oe([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}function $(e,t,n){var r=e.getUTCFullYear(),i=ee(e,r,t,n);if(i<1)return ee(e,r-1,t,n);var o=ee(e,r+1,t,n);return o>=1?Math.min(i,o):i}function ee(e,t,n,r){var i=oe([t,0,1+te(t,n,r)]),o=X(e),a=Math.round(F(i,o));return Math.floor(a/7)+1}function te(e,t,n){var r=7+t-n;return-(7+oe([e,0,r]).getUTCDay()-t)%7+r-1}function ne(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function re(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function ie(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function oe(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function ae(e){return!isNaN(e.valueOf())}function se(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}function ue(e,t){var n;return"string"==typeof e?le(e):"object"==typeof e&&e?ce(e):"number"==typeof e?ce((n={},n[t||"milliseconds"]=e,n)):null}function le(e){var t=Ci.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}function ce(e){return{years:e.years||e.year||0,months:e.months||e.month||0,days:(e.days||e.day||0)+7*de(e),milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)}}function de(e){return e.weeks||e.week||0}function fe(e,t){return e.years===t.years&&e.months===t.months&&e.days===t.days&&e.milliseconds===t.milliseconds}function pe(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds}function he(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function ve(e,t){return{years:e.years-t.years,months:e.months-t.months,days:e.days-t.days,milliseconds:e.milliseconds-t.milliseconds}}function ge(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function ye(e){return Ee(e)/365}function me(e){return Ee(e)/30}function Ee(e){return De(e)/864e5}function Se(e){return De(e)/6e4}function be(e){return De(e)/1e3}function De(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function Te(e,t){for(var n=null,r=0;r<Ii.length;r++){var i=Ii[r];if(t[i]){var o=e[i]/t[i];if(!Ze(o)||null!==n&&n!==o)return null;n=o}else if(e[i])return null}return n}function we(e,t){var n=e.milliseconds;if(n){if(n%1e3!=0)return{unit:"millisecond",value:n};if(n%6e4!=0)return{unit:"second",value:n/1e3};if(n%36e5!=0)return{unit:"minute",value:n/6e4};if(n)return{unit:"hour",value:n/36e5}}return e.days?t||e.days%7!=0?{unit:"day",value:e.days}:{unit:"week",value:e.days/7}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function Re(e,t){t.left&&g(e,{borderLeftWidth:1,marginLeft:t.left-1}),t.right&&g(e,{borderRightWidth:1,marginRight:t.right-1})}function Ie(e){g(e,{marginLeft:"",marginRight:"",borderLeftWidth:"",borderRightWidth:""})}function Ce(){document.body.classList.add("fc-not-allowed")}function Me(){document.body.classList.remove("fc-not-allowed")}function ke(e,t,n){var r=Math.floor(t/e.length),i=Math.floor(t-r*(e.length-1)),o=[],a=[],s=[],u=0;Oe(e),e.forEach(function(t,n){var l=n===e.length-1?i:r,c=_(t);c<l?(o.push(t),a.push(c),s.push(t.offsetHeight)):u+=c}),n&&(t-=u,r=Math.floor(t/o.length),i=Math.floor(t-r*(o.length-1))),o.forEach(function(e,t){var n=t===o.length-1?i:r,u=a[t],l=s[t],c=n-(u-l);u<n&&(e.style.height=c+"px")})}function Oe(e){e.forEach(function(e){e.style.height=""})}function _e(e){var t=0;return e.forEach(function(e){var n=e.firstChild;if(n instanceof HTMLElement){var r=n.offsetWidth;r>t&&(t=r)}}),t++,e.forEach(function(e){e.style.width=t+"px"}),t}function Pe(e,t){var n={position:"relative",left:-1};g(e,n),g(t,n);var r=e.offsetHeight-t.offsetHeight,i={position:"",left:""};return g(e,i),g(t,i),r}function He(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",x)}function xe(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",x)}function Ne(e){e.addEventListener("contextmenu",x)}function ze(e){e.removeEventListener("contextmenu",x)}function Ue(e){var t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t++)n=i[t],"string"==typeof n?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function Le(e,t,n){var r,i;for(r=0;r<n.length;r++)if(i=Ae(e,t,n[r]))return i;return 0}function Ae(e,t,n){return n.func?n.func(e,t):Ve(e[n.field],t[n.field])*(n.order||1)}function Ve(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function Be(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Fe(e,t){var n=String(e);return"000".substr(0,t-n.length)+n}function We(e,t){return e-t}function Ze(e){return e%1==0}function je(e,t,n){if("function"==typeof e&&(e=[e]),e){var r=void 0,i=void 0;for(r=0;r<e.length;r++)i=e[r].apply(t,n)||i;return i}}function Ye(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=0;n<e.length;n++)if(void 0!==e[n])return e[n]}function qe(e,t){var n,r,i,o,a,s=function(){var u=(new Date).valueOf()-o;u<t?n=setTimeout(s,t-u):(n=null,a=e.apply(i,r),i=r=null)};return function(){return i=this,r=arguments,o=(new Date).valueOf(),n||(n=setTimeout(s,t)),a}}function Ge(e,t,n,r){void 0===n&&(n={});var i={};for(var o in t){var a=t[o];void 0!==e[o]?a===Function?i[o]="function"==typeof e[o]?e[o]:null:i[o]=a?a(e[o]):e[o]:void 0!==n[o]?i[o]=n[o]:a===String?i[o]="":a&&a!==Number&&a!==Boolean&&a!==Function?i[o]=a(null):i[o]=null}if(r)for(var o in e)void 0===t[o]&&(r[o]=e[o]);return i}function Xe(e){return Array.isArray(e)?Array.prototype.slice.call(e):e}function Je(e){var t=Math.floor(F(e.start,e.end))||1,n=X(e.start);return{start:n,end:A(n,t)}}function Ke(e,t){void 0===t&&(t=ue(0));var n=null,r=null;if(e.end){r=X(e.end);var i=e.end.valueOf()-r.valueOf();i&&i>=De(t)&&(r=A(r,1))}return e.start&&(n=X(e.start),r&&r<=n&&(r=A(n,1))),{start:n,end:r}}function Qe(e){var t=Ke(e);return F(t.start,t.end)>1}function $e(e,t,n,r){return"year"===r?ue(n.diffWholeYears(e,t),"year"):"month"===r?ue(n.diffWholeMonths(e,t),"month"):Y(e,t)}function et(e,t){function n(){this.constructor=e}Mi(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function tt(e,t,n,r,i){for(var o=0;o<r.length;o++){var a={},s=r[o].parse(e,a,n);if(s){var u=a.allDay;return delete a.allDay,null==u&&null==(u=t)&&null==(u=s.allDayGuess)&&(u=!1),ki(i,a),{allDay:u,duration:s.duration,typeData:s.typeData,typeId:o}}}return null}function nt(e,t,n,r){var i=r[e.recurringDef.typeId],o=i.expand(e.recurringDef.typeData,t,n);return e.allDay&&(o=o.map(X)),o}function rt(e,t){var n,r,i,o,a,s,u={};if(t)for(n=0;n<t.length;n++){for(r=t[n],i=[],o=e.length-1;o>=0;o--)if("object"==typeof(a=e[o][r])&&a)i.unshift(a);else if(void 0!==a){u[r]=a;break}i.length&&(u[r]=rt(i))}for(n=e.length-1;n>=0;n--){s=e[n];for(r in s)r in u||(u[r]=s[r])}return u}function it(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function ot(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function at(e){for(var t={},n=0,r=e;n<r.length;n++){t[r[n]]=!0}return t}function st(e){var t=[];for(var n in e)t.push(e[n]);return t}function ut(e,t,n,r){for(var i=vt(),o=0,a=e;o<a.length;o++){var s=a[o],u=On(s,t,n,r);u&&lt(u,i)}return i}function lt(e,t){return void 0===t&&(t=vt()),t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function ct(e,t,n){var r=n.dateEnv,i=e.defs,o=e.instances;o=it(o,function(e){return!i[e.defId].recurringDef});for(var a in i){var s=i[a];if(s.recurringDef){var u=nt(s,t,n.dateEnv,n.pluginSystem.hooks.recurringTypes),l=s.recurringDef.duration;l||(l=s.allDay?n.defaultAllDayEventDuration:n.defaultTimedEventDuration);for(var c=0,d=u;c<d.length;c++){var f=d[c],p=Pn(a,{start:f,end:r.add(f,l)});o[p.instanceId]=p}}}return{defs:i,instances:o}}function dt(e,t){var n=e.instances[t];if(n){var r=e.defs[n.defId],i=yt(e,function(e){return ft(r,e)});return i.defs[r.defId]=r,i.instances[n.instanceId]=n,i}return vt()}function ft(e,t){return Boolean(e.groupId&&e.groupId===t.groupId)}function pt(e,t,n){var r=n.opt("eventDataTransform"),i=t?t.eventDataTransform:null;return i&&(e=ht(e,i)),r&&(e=ht(e,r)),e}function ht(e,t){var n;if(t){n=[];for(var r=0,i=e;r<i.length;r++){var o=i[r],a=t(o);a?n.push(a):null==a&&n.push(o)}}else n=e;return n}function vt(){return{defs:{},instances:{}}}function gt(e,t){return{defs:ki({},e.defs,t.defs),instances:ki({},e.instances,t.instances)}}function yt(e,t){var n=it(e.defs,t),r=it(e.instances,function(e){return n[e.defId]});return{defs:n,instances:r}}function mt(e,t){var n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}function Et(e,t){var n,r,i=[],o=t.start;for(e.sort(St),n=0;n<e.length;n++)r=e[n],r.start>o&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return o<t.end&&i.push({start:o,end:t.end}),i}function St(e,t){return e.start.valueOf()-t.start.valueOf()}function bt(e,t){var n=e.start,r=e.end,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function Dt(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function Tt(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function wt(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Rt(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function It(e,t){return null!=t.start&&e<t.start?t.start:null!=t.end&&e>=t.end?new Date(t.end.valueOf()-1):e}function Ct(e,t){for(var n=0,r=0;r<e.length;)e[r]===t?(e.splice(r,1),n++):r++;return n}function Mt(e,t){var n,r=e.length;if(r!==t.length)return!1;for(n=0;n<r;n++)if(e[n]!==t[n])return!1;return!0}function kt(e){var t,n;return function(){return t&&Mt(t,arguments)||(t=arguments,n=e.apply(this,arguments)),n}}function Ot(e,t){var n=null;return function(){var r=e.apply(this,arguments);return(null===n||n!==r&&!t(n,r))&&(n=r),n}}function _t(e,t,n){var r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?function(e){return Wt(e.timeZoneOffset)}:0===r&&t.week?function(e){return zt(n.computeWeekNumber(e.marker),n.weekLabel,n.locale,t.week)}:Pt(e,t,n)}function Pt(e,t,n){e=ki({},e),t=ki({},t),Ht(e,t),e.timeZone="UTC";var r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){var o=ki({},e);delete o.minute,r=new Intl.DateTimeFormat(n.locale.codes,o)}return function(o){var a,s=o.marker;return a=r&&!s.getUTCMinutes()?r:i,xt(a.format(s),o,e,t,n)}}function Ht(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit")),"long"===e.timeZoneName&&(e.timeZoneName="short"),t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}function xt(e,t,n,r,i){return e=e.replace(Ni,""),"short"===n.timeZoneName&&(e=Nt(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":Wt(t.timeZoneOffset))),r.omitCommas&&(e=e.replace(Hi,"").trim()),r.omitZeroMinute&&(e=e.replace(":00","")),!1===r.meridiem?e=e.replace(Pi,"").trim():"narrow"===r.meridiem?e=e.replace(Pi,function(e,t){return t.toLocaleLowerCase()}):"short"===r.meridiem?e=e.replace(Pi,function(e,t){return t.toLocaleLowerCase()+"m"}):"lowercase"===r.meridiem&&(e=e.replace(Pi,function(e){return e.toLocaleLowerCase()})),e=e.replace(xi," "),e=e.trim()}function Nt(e,t){var n=!1;return e=e.replace(zi,function(){return n=!0,t}),n||(e+=" "+t),e}function zt(e,t,n,r){var i=[];return"narrow"===r?i.push(t):"short"===r&&i.push(t," "),i.push(n.simpleNumberFormat.format(e)),n.options.isRtl&&i.reverse(),i.join("")}function Ut(e,t,n){return n.getMarkerYear(e)!==n.getMarkerYear(t)?5:n.getMarkerMonth(e)!==n.getMarkerMonth(t)?4:n.getMarkerDay(e)!==n.getMarkerDay(t)?2:se(e)!==se(t)?1:0}function Lt(e,t){var n={};for(var r in e)r in _i&&!(_i[r]<=t)||(n[r]=e[r]);return n}function At(e,t,n,r){for(var i=0;i<e.length;){var o=e.indexOf(t,i);if(-1===o)break;var a=e.substr(0,o);i=o+t.length;for(var s=e.substr(i),u=0;u<n.length;){var l=n.indexOf(r,u);if(-1===l)break;var c=n.substr(0,l);u=l+r.length;var d=n.substr(u);if(a===c&&s===d)return{before:a,after:s}}}return null}function Vt(e,t){return"object"==typeof e&&e?("string"==typeof t&&(e=ki({separator:t},e)),new Ui(e)):"string"==typeof e?new Li(e,t):"function"==typeof e?new Ai(e):void 0}function Bt(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",Wt(t,!0)))),r}function Ft(e){return Fe(e.getUTCHours(),2)+":"+Fe(e.getUTCMinutes(),2)+":"+Fe(e.getUTCSeconds(),2)}function Wt(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?n+Fe(i,2)+":"+Fe(o,2):"GMT"+n+i+(o?":"+Fe(o,2):"")}function Zt(e,t,n,r){var i=jt(e,n.calendarSystem);return{date:i,start:i,end:t?jt(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,separator:r}}function jt(e,t){var n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function Yt(e,t,n,r){var i={},o={},a={},s=[],u=[],l=Kt(e.defs,t);for(var c in e.defs){var d=e.defs[c];"inverse-background"===d.rendering&&(d.groupId?(i[d.groupId]=[],a[d.groupId]||(a[d.groupId]=d)):o[c]=[])}for(var f in e.instances){var p=e.instances[f],d=e.defs[p.defId],h=l[d.defId],v=p.range,g=!d.allDay&&r?Ke(v,r):v,y=bt(g,n);y&&("inverse-background"===d.rendering?d.groupId?i[d.groupId].push(y):o[p.defId].push(y):("background"===d.rendering?s:u).push({def:d,ui:h,instance:p,range:y,isStart:g.start&&g.start.valueOf()===y.start.valueOf(),isEnd:g.end&&g.end.valueOf()===y.end.valueOf()}))}for(var m in i)for(var E=i[m],S=Et(E,n),b=0,D=S;b<D.length;b++){var T=D[b],d=a[m],h=l[d.defId];s.push({def:d,ui:h,instance:null,range:T,isStart:!1,isEnd:!1})}for(var c in o)for(var E=o[c],S=Et(E,n),w=0,R=S;w<R.length;w++){var T=R[w];s.push({def:e.defs[c],ui:l[c],instance:null,range:T,isStart:!1,isEnd:!1})}return{bg:s,fg:u}}function qt(e){return"background"===e.rendering||"inverse-background"===e.rendering}function Gt(e,t,n){e.hasPublicHandlers("eventRender")&&(t=t.filter(function(t){var r=e.publiclyTrigger("eventRender",[{event:new Bi(e.calendar,t.eventRange.def,t.eventRange.instance),isMirror:n,isStart:t.isStart,isEnd:t.isEnd,el:t.el,view:e}]);return!1!==r&&(r&&!0!==r&&(t.el=r),!0)}));for(var r=0,i=t;r<i.length;r++){var o=i[r];Xt(o.el,o)}return t}function Xt(e,t){e.fcSeg=t}function Jt(e){return e.fcSeg||null}function Kt(e,t){return ot(e,function(e){return Qt(e,t)})}function Qt(e,t){var n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Mn(n)}function $t(e,t,n,r){var i=Kt(e.defs,t),o=vt();for(var a in e.defs){var s=e.defs[a];o.defs[a]=en(s,i[a],n,r.pluginSystem.hooks.eventDefMutationAppliers,r)}for(var u in e.instances){var l=e.instances[u],s=o.defs[l.defId];o.instances[u]=nn(l,s,i[l.defId],n,r)}return o}function en(e,t,n,r,i){var o=n.standardProps||{};null==o.hasEnd&&t.durationEditable&&tn(t.startEditable?n.startDelta:null,n.endDelta||null)&&(o.hasEnd=!0);var a=ki({},e,o,{ui:ki({},e.ui,o.ui)});n.extendedProps&&(a.extendedProps=ki({},a.extendedProps,n.extendedProps));for(var s=0,u=r;s<u.length;s++){(0,u[s])(a,n,i)}return!a.hasEnd&&i.opt("forceEventDuration")&&(a.hasEnd=!0),a}function tn(e,t){return e&&!De(e)&&(e=null),t&&!De(t)&&(t=null),!(!e&&!t)&&(Boolean(e)!==Boolean(t)||!fe(e,t))}function nn(e,t,n,r,i){var o=i.dateEnv,a=r.standardProps&&!0===r.standardProps.allDay,s=r.standardProps&&!1===r.standardProps.hasEnd,u=ki({},e);return a&&(u.range=Je(u.range)),r.startDelta&&n.startEditable&&(u.range={start:o.add(u.range.start,r.startDelta),end:u.range.end}),s?u.range={start:u.range.start,end:i.getDefaultEventEnd(t.allDay,u.range.start)}:!r.endDelta||!n.durationEditable&&tn(n.startEditable?r.startDelta:null,r.endDelta)||(u.range={start:u.range.start,end:o.add(u.range.end,r.endDelta)}),t.allDay&&(u.range={start:X(u.range.start),end:X(u.range.end)}),u.range.end<u.range.start&&(u.range.end=i.getDefaultEventEnd(t.allDay,u.range.start)),u}function rn(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return on(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return an(e,t.eventStore,r?r.activeRange:null,i);case"MERGE_EVENTS":return gt(e,t.eventStore);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return r?ct(e,r.activeRange,i):e;case"CHANGE_TIMEZONE":return sn(e,t.oldDateEnv,i.dateEnv);case"MUTATE_EVENTS":return un(e,t.instanceId,t.mutation,t.fromApi,i);case"REMOVE_EVENT_INSTANCES":return cn(e,t.instances);case"REMOVE_EVENT_DEF":return yt(e,function(e){return e.defId!==t.defId});case"REMOVE_EVENT_SOURCE":return ln(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return yt(e,function(e){return!e.sourceId});case"REMOVE_ALL_EVENTS":return vt();case"RESET_EVENTS":return{defs:e.defs,instances:e.instances};default:return e}}function on(e,t,n,r,i,o){if(t&&n===t.latestFetchId){var a=ut(pt(i,t,o),t.sourceId,o);return r&&(a=ct(a,r,o)),gt(ln(e,t.sourceId),a)}return e}function an(e,t,n,r){return n&&(t=ct(t,n,r)),gt(e,t)}function sn(e,t,n){var r=e.defs,i=ot(e.instances,function(e){var i=r[e.defId];return i.allDay||i.recurringDef?e:ki({},e,{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})});return{defs:r,instances:i}}function un(e,t,n,r,i){var o=dt(e,t);return o=$t(o,r?{"":{startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}}:i.eventUiBases,n,i),gt(e,o)}function ln(e,t){return yt(e,function(e){return e.sourceId!==t})}function cn(e,t){return{defs:e.defs,instances:it(e.instances,function(e){return!t[e.instanceId]})}}function dn(e,t){return pn({eventDrag:e},t)}function fn(e,t){return pn({dateSelection:e},t)}function pn(e,t){var n=t.view,r=ki({businessHours:n?n.props.businessHours:vt(),dateSelection:"",eventStore:t.state.eventStore,eventUiBases:t.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginSystem.hooks.isPropsValid||hn)(r,t)}function hn(e,t,n,r){return void 0===n&&(n={}),!(e.eventDrag&&!vn(e,t,n,r))&&!(e.dateSelection&&!gn(e,t,n,r))}function vn(e,t,n,r){var i=e.eventDrag,o=i.mutatedEvents,a=o.defs,s=o.instances,u=Kt(a,i.isEvent?e.eventUiBases:{"":t.selectionConfig});r&&(u=ot(u,r));var l=cn(e.eventStore,i.affectedEvents.instances),c=l.defs,d=l.instances,f=Kt(c,e.eventUiBases);for(var p in s){var h=s[p],v=h.range,g=u[h.defId],y=a[h.defId];if(!yn(g.constraints,v,l,e.businessHours,t))return!1;var m=t.opt("eventOverlap");"function"!=typeof m&&(m=null);for(var E in d){var S=d[E];if(Tt(v,S.range)){if(!1===f[S.defId].overlap&&i.isEvent)return!1;if(!1===g.overlap)return!1;if(m&&!m(new Bi(t,c[S.defId],S),new Bi(t,y,h)))return!1}}for(var b=0,D=g.allows;b<D.length;b++){var T=D[b],w=ki({},n,{range:h.range,allDay:y.allDay}),R=e.eventStore.defs[y.defId],I=e.eventStore.instances[p],C=void 0;if(C=R?new Bi(t,R,I):new Bi(t,y),!T(t.buildDateSpanApi(w),C))return!1}}return!0}function gn(e,t,n,r){var i=e.eventStore,o=i.defs,a=i.instances,s=e.dateSelection,u=s.range,l=t.selectionConfig;if(r&&(l=r(l)),!yn(l.constraints,u,i,e.businessHours,t))return!1;var c=t.opt("selectOverlap");"function"!=typeof c&&(c=null);for(var d in a){var f=a[d];if(Tt(u,f.range)){if(!1===l.overlap)return!1;if(c&&!c(new Bi(t,o[f.defId],f)))return!1}}for(var p=0,h=l.allows;p<h.length;p++){var v=h[p],g=ki({},n,s);if(!v(t.buildDateSpanApi(g),null))return!1}return!0}function yn(e,t,n,r,i){for(var o=0,a=e;o<a.length;o++){if(!Sn(mn(a[o],t,n,r,i),t))return!1}return!0}function mn(e,t,n,r,i){return"businessHours"===e?En(ct(r,t,i)):"string"==typeof e?En(yt(n,function(t){return t.groupId===e})):"object"==typeof e&&e?En(ct(e,t,i)):[]}function En(e){var t=e.instances,n=[];for(var r in t)n.push(t[r].range);return n}function Sn(e,t){for(var n=0,r=e;n<r.length;n++){if(wt(r[n],t))return!0}return!1}function bn(e,t){return Array.isArray(e)?ut(e,"",t,!0):"object"==typeof e&&e?ut([e],"",t,!0):null!=e?String(e):null}function Dn(e){return(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function Tn(e){var t=[];for(var n in e){var r=e[n];null!=r&&""!==r&&t.push(n+":"+r)}return t.join(";")}function wn(e){var t=[];for(var n in e){var r=e[n];null!=r&&t.push(n+'="'+Dn(r)+'"')}return t.join(" ")}function Rn(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}function In(e,t,n){var r=Ge(e,Fi,{},n),i=bn(r.constraint,t);return{startEditable:null!=r.startEditable?r.startEditable:r.editable,durationEditable:null!=r.durationEditable?r.durationEditable:r.editable,constraints:null!=i?[i]:[],overlap:r.overlap,allows:null!=r.allow?[r.allow]:[],backgroundColor:r.backgroundColor||r.color,borderColor:r.borderColor||r.color,textColor:r.textColor,classNames:r.classNames.concat(r.className)}}function Cn(e,t,n,r){var i={},o={};for(var a in Fi){var s=e+Be(a);i[a]=t[s],o[s]=!0}if("event"===e&&(i.editable=t.editable),r)for(var a in t)o[a]||(r[a]=t[a]);return In(i,n)}function Mn(e){return e.reduce(kn,Wi)}function kn(e,t){return{startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}function On(e,t,n,r){var i=zn(t,n),o={},a=tt(e,i,n.dateEnv,n.pluginSystem.hooks.recurringTypes,o);if(a){var s=_n(o,t,a.allDay,Boolean(a.duration),n);return s.recurringDef={typeId:a.typeId,typeData:a.typeData,duration:a.duration},{def:s,instance:null}}var u={},l=Hn(e,i,n,u,r);if(l){var s=_n(u,t,l.allDay,l.hasEnd,n);return{def:s,instance:Pn(s.defId,l.range,l.forcedStartTzo,l.forcedEndTzo)}}return null}function _n(e,t,n,r,i){var o={},a=Nn(e,i,o);a.defId=String(Yi++),a.sourceId=t,a.allDay=n,a.hasEnd=r;for(var s=0,u=i.pluginSystem.hooks.eventDefParsers;s<u.length;s++){var l=u[s],c={};l(a,o,c),o=c}return a.extendedProps=ki(o,a.extendedProps||{}),Object.freeze(a.ui.classNames),Object.freeze(a.extendedProps),a}function Pn(e,t,n,r){return{instanceId:String(Yi++),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}function Hn(e,t,n,r,i){var o,a,s=xn(e,r),u=s.allDay,l=null,c=!1,d=null;if(o=n.dateEnv.createMarkerMeta(s.start))l=o.marker;else if(!i)return null;return null!=s.end&&(a=n.dateEnv.createMarkerMeta(s.end)),null==u&&(u=null!=t?t:(!o||o.isTimeUnspecified)&&(!a||a.isTimeUnspecified)),u&&l&&(l=X(l)),a&&(d=a.marker,u&&(d=X(d)),l&&d<=l&&(d=null)),d?c=!0:i||(c=n.opt("forceEventDuration")||!1,d=n.dateEnv.add(l,u?n.defaultAllDayEventDuration:n.defaultTimedEventDuration)),{allDay:u,hasEnd:c,range:{start:l,end:d},forcedStartTzo:o?o.forcedTzo:null,forcedEndTzo:a?a.forcedTzo:null}}function xn(e,t){var n=Ge(e,ji,{},t);return n.start=null!==n.start?n.start:n.date,delete n.date,n}function Nn(e,t,n){var r={},i=Ge(e,Zi,{},r),o=In(r,t,n);return i.publicId=i.id,delete i.id,i.ui=o,i}function zn(e,t){var n=null;if(e){n=t.state.eventSources[e].allDayDefault}return null==n&&(n=t.opt("allDayDefault")),n}function Un(e,t){return ut(Ln(e),"",t)}function Ln(e){var t;return t=!0===e?[{}]:Array.isArray(e)?e.filter(function(e){return e.daysOfWeek}):"object"==typeof e&&e?[e]:[],t=t.map(function(e){return ki({},qi,e)})}function An(e,t,n){function r(){if(a){for(var e=0,n=s;e<n.length;e++){n[e].unrender()}t&&t.apply(o,a),a=null}}function i(){a&&Mt(a,arguments)||(r(),o=this,a=arguments,e.apply(this,arguments))}void 0===n&&(n=[]);var o,a,s=[];i.dependents=s,i.unrender=r;for(var u=0,l=n;u<l.length;u++){l[u].dependents.push(i)}return i}function Vn(e,t,n){return void 0===n&&(n=1),e===t||(Array.isArray(e)&&Array.isArray(t)?Bn(e,t,n):!("object"!=typeof e||!e||"object"!=typeof t||!t)&&Fn(e,t,n))}function Bn(e,t,n){if(void 0===n&&(n=1),e===t)return!0;if(n>0){if(e.length!==t.length)return!1;for(var r=0;r<e.length;r++)if(!Vn(e[r],t[r],n-1))return!1;return!0}return!1}function Fn(e,t,n){if(void 0===n&&(n=1),e===t)return!0;if(n>0){for(var r in e)if(!(r in t))return!1;for(var r in t){if(!(r in e))return!1;if(!Vn(e[r],t[r],n-1))return!1}return!0}return!1}function Wn(e,t,n){void 0===n&&(n=1);var r={};for(var i in t)i in e&&Vn(e[i],t[i],n-1)||(r[i]=t[i]);return r}function Zn(e,t){for(var n in e)if(!(n in t))return!0;return!1}function jn(e,t,n){var r=[];e&&r.push(e),t&&r.push(t);var i={"":Mn(r)};return n&&ki(i,n),i}function Yn(e,t,n,r){var i,o,a,s,u=e.dateEnv;return t instanceof Date?i=t:(i=t.date,o=t.type,a=t.forceOff),s={date:u.formatIso(i,{omitTime:!0}),type:o||"day"},"string"==typeof n&&(r=n,n=null),n=n?" "+wn(n):"",r=r||"",!a&&e.opt("navLinks")?"<a"+n+' data-goto="'+Dn(JSON.stringify(s))+'">'+r+"</a>":"<span"+n+">"+r+"</span>"}function qn(e){return e.opt("allDayHtml")||Dn(e.opt("allDayText"))}
+function Gn(e,t,n,r){var i,o,a=n.calendar,s=n.view,u=n.theme,l=n.dateEnv,c=[];return Rt(t.activeRange,e)?(c.push("fc-"+Ri[e.getUTCDay()]),s.opt("monthMode")&&l.getMonth(e)!==l.getMonth(t.currentRange.start)&&c.push("fc-other-month"),i=X(a.getNow()),o=A(i,1),e<i?c.push("fc-past"):e>=o?c.push("fc-future"):(c.push("fc-today"),!0!==r&&c.push(u.getClass("today")))):c.push("fc-disabled-day"),c}function Xn(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}function Jn(e,t,n){(e[t]||(e[t]=[])).push(n)}function Kn(e,t,n){n?e[t]&&(e[t]=e[t].filter(function(e){return e!==n})):delete e[t]}function Qn(e,t,n){var r={},i=!1;for(var o in t)o in e&&(e[o]===t[o]||n[o]&&n[o](e[o],t[o]))?r[o]=e[o]:(r[o]=t[o],i=!0);for(var o in e)if(!(o in t)){i=!0;break}return{anyChanges:i,comboProps:r}}function $n(e){return{id:String(so++),deps:e.deps||[],reducers:e.reducers||[],eventDefParsers:e.eventDefParsers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],eventResizeJoinTransforms:e.eventResizeJoinTransforms||[],viewContainerModifiers:e.viewContainerModifiers||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,defaultView:e.defaultView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{}}}function er(e,t){return{reducers:e.reducers.concat(t.reducers),eventDefParsers:e.eventDefParsers.concat(t.eventDefParsers),eventDragMutationMassagers:e.eventDragMutationMassagers.concat(t.eventDragMutationMassagers),eventDefMutationAppliers:e.eventDefMutationAppliers.concat(t.eventDefMutationAppliers),dateSelectionTransformers:e.dateSelectionTransformers.concat(t.dateSelectionTransformers),datePointTransforms:e.datePointTransforms.concat(t.datePointTransforms),dateSpanTransforms:e.dateSpanTransforms.concat(t.dateSpanTransforms),views:ki({},e.views,t.views),viewPropsTransformers:e.viewPropsTransformers.concat(t.viewPropsTransformers),isPropsValid:t.isPropsValid||e.isPropsValid,externalDefTransforms:e.externalDefTransforms.concat(t.externalDefTransforms),eventResizeJoinTransforms:e.eventResizeJoinTransforms.concat(t.eventResizeJoinTransforms),viewContainerModifiers:e.viewContainerModifiers.concat(t.viewContainerModifiers),eventDropTransformers:e.eventDropTransformers.concat(t.eventDropTransformers),calendarInteractions:e.calendarInteractions.concat(t.calendarInteractions),componentInteractions:e.componentInteractions.concat(t.componentInteractions),themeClasses:ki({},e.themeClasses,t.themeClasses),eventSourceDefs:e.eventSourceDefs.concat(t.eventSourceDefs),cmdFormatter:t.cmdFormatter||e.cmdFormatter,recurringTypes:e.recurringTypes.concat(t.recurringTypes),namedTimeZonedImpl:t.namedTimeZonedImpl||e.namedTimeZonedImpl,defaultView:e.defaultView||t.defaultView,elementDraggingImpl:e.elementDraggingImpl||t.elementDraggingImpl,optionChangeHandlers:ki({},e.optionChangeHandlers,t.optionChangeHandlers)}}function tr(e,t,n,r,i){e=e.toUpperCase();var o=null;"GET"===e?t=nr(t,n):o=rr(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400)try{var e=JSON.parse(a.responseText);r(e,a)}catch(e){i("Failure parsing JSON",a)}else i("Request failed",a)},a.onerror=function(){i("Request failed",a)},a.send(o)}function nr(e,t){return e+(-1===e.indexOf("?")?"?":"&")+rr(t)}function rr(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function ir(e,t,n){var r,i,o,a,s=n.dateEnv,u={};return r=e.startParam,null==r&&(r=n.opt("startParam")),i=e.endParam,null==i&&(i=n.opt("endParam")),o=e.timeZoneParam,null==o&&(o=n.opt("timeZoneParam")),a="function"==typeof e.extraParams?e.extraParams():e.extraParams||{},ki(u,a),u[r]=s.formatIso(t.start),u[i]=s.formatIso(t.end),"local"!==s.timeZone&&(u[o]=s.timeZone),u}function or(e,t,n,r){for(var i=e?at(e):null,o=X(n.start),a=n.end,s=[];o<a;){var u=void 0;i&&!i[o.getUTCDay()]||(u=t?r.add(o,t):o,s.push(u)),o=A(o,1)}return s}function ar(e,t){for(var n=st(t.state.eventSources),r=[],i=0,o=e;i<o.length;i++){for(var a=o[i],s=!1,u=0;u<n.length;u++)if(Vn(n[u]._raw,a,2)){n.splice(u,1),s=!0;break}s||r.push(a)}for(var l=0,c=n;l<c.length;l++){var d=c[l];t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:d.sourceId})}for(var f=0,p=r;f<p.length;f++){var h=p[f];t.addEventSource(h)}}function sr(e,t){t.addPluginInputs(e)}function ur(e){return rt(e,Do)}function lr(e){for(var t=[],n=0,r=e;n<r.length;n++){var i=r[n];if("string"==typeof i){var o="FullCalendar"+Be(i);window[o]?t.push(window[o].default):console.warn("Plugin file not loaded for "+i)}else t.push(i)}return To.concat(t)}function cr(e){for(var t=e.length>0?e[0].code:"en",n=window.FullCalendarLocalesAll||[],r=window.FullCalendarLocales||{},i=n.concat(st(r),e),o={en:wo},a=0,s=i;a<s.length;a++){var u=s[a];o[u.code]=u}return{map:o,defaultCode:t}}function dr(e,t){return"object"!=typeof e||Array.isArray(e)?fr(e,t):hr(e.code,[e.code],e)}function fr(e,t){var n=[].concat(e||[]);return hr(e,n,pr(n,t)||wo)}function pr(e,t){for(var n=0;n<e.length;n++)for(var r=e[n].toLocaleLowerCase().split("-"),i=r.length;i>0;i--){var o=r.slice(0,i).join("-");if(t[o])return t[o]}return null}function hr(e,t,n){var r=rt([wo,n],["buttonText"]);delete r.code;var i=r.week;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function vr(e){return new Io[e]}function gr(e){var t=Mo.exec(e);if(t){var n=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(ae(n)){var r=null;return t[13]&&(r=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:n,isTimeUnspecified:!t[6],timeZoneOffset:r}}}return null}function yr(e,t){return!t.pluginSystem.hooks.eventSourceDefs[e.sourceDefId].ignoreRange}function mr(e,t){for(var n=t.pluginSystem.hooks.eventSourceDefs,r=n.length-1;r>=0;r--){var i=n[r],o=i.parseMeta(e);if(o){var a=Er("object"==typeof e?e:{},o,r,t);return a._raw=Xe(e),a}}return null}function Er(e,t,n,r){var i={},o=Ge(e,Oo,{},i),a={},s=In(i,r,a);return o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,o.publicId=String(e.id||""),o.sourceId=String(_o++),o.sourceDefId=n,o.meta=t,o.ui=s,o.extendedProps=a,o}function Sr(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return br(e,t.sources,n?n.activeRange:null,r);case"REMOVE_EVENT_SOURCE":return Dr(e,t.sourceId);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return n?Tr(e,n.activeRange,r):e;case"FETCH_EVENT_SOURCES":case"CHANGE_TIMEZONE":return Rr(e,t.sourceIds?at(t.sourceIds):Mr(e,r),n?n.activeRange:null,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return Cr(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}}function br(e,t,n,r){for(var i={},o=0,a=t;o<a.length;o++){var s=a[o];i[s.sourceId]=s}return n&&(i=Tr(i,n,r)),ki({},e,i)}function Dr(e,t){return it(e,function(e){return e.sourceId!==t})}function Tr(e,t,n){return Rr(e,it(e,function(e){return wr(e,t,n)}),t,n)}function wr(e,t,n){return yr(e,n)?!n.opt("lazyFetching")||!e.fetchRange||t.start<e.fetchRange.start||t.end>e.fetchRange.end:!e.latestFetchId}function Rr(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=Ir(a,n,r):i[o]=a}return i}function Ir(e,t,n){var r=n.pluginSystem.hooks.eventSourceDefs[e.sourceDefId],i=String(Po++);return r.fetch({eventSource:e,calendar:n,range:t},function(r){var o,a,s=r.rawEvents,u=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.xhr)),u&&(o=u(s,r.xhr)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})},function(r){var o=n.opt("eventSourceFailure");console.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})}),ki({},e,{isFetching:!0,latestFetchId:i})}function Cr(e,t,n,r){var i,o=e[t];return o&&n===o.latestFetchId?ki({},e,(i={},i[t]=ki({},o,{isFetching:!1,fetchRange:r}),i)):e}function Mr(e,t){return it(e,function(e){return yr(e,t)})}function kr(e,t){return Dt(e.activeRange,t.activeRange)&&Dt(e.validRange,t.validRange)&&fe(e.minTime,t.minTime)&&fe(e.maxTime,t.maxTime)}function Or(e,t,n){for(var r=_r(e.viewType,t),i=Pr(e.dateProfile,t,e.currentDate,r,n),o=Sr(e.eventSources,t,i,n),a=ki({},e,{viewType:r,dateProfile:i,currentDate:Hr(e.currentDate,t,i),eventSources:o,eventStore:rn(e.eventStore,t,o,i,n),dateSelection:xr(e.dateSelection,t,n),eventSelection:Nr(e.eventSelection,t),eventDrag:zr(e.eventDrag,t,o,n),eventResize:Ur(e.eventResize,t,o,n),eventSourceLoadingLevel:Lr(o),loadingLevel:Lr(o)}),s=0,u=n.pluginSystem.hooks.reducers;s<u.length;s++){a=(0,u[s])(a,t,n)}return a}function _r(e,t){switch(t.type){case"SET_VIEW_TYPE":return t.viewType;default:return e}}function Pr(e,t,n,r,i){var o;switch(t.type){case"PREV":o=i.dateProfileGenerators[r].buildPrev(e,n);break;case"NEXT":o=i.dateProfileGenerators[r].buildNext(e,n);break;case"SET_DATE":e.activeRange&&Rt(e.currentRange,t.dateMarker)||(o=i.dateProfileGenerators[r].build(t.dateMarker,void 0,!0));break;case"SET_VIEW_TYPE":var a=i.dateProfileGenerators[r];if(!a)throw new Error(r?'The FullCalendar view "'+r+'" does not exist. Make sure your plugins are loaded correctly.':"No available FullCalendar view plugins.");o=a.build(t.dateMarker||n,void 0,!0)}return!o||!o.isValid||e&&kr(e,o)?e:o}function Hr(e,t,n){switch(t.type){case"PREV":case"NEXT":return Rt(n.currentRange,e)?e:n.currentRange.start;case"SET_DATE":case"SET_VIEW_TYPE":var r=t.dateMarker||e;return n.activeRange&&!Rt(n.activeRange,r)?n.currentRange.start:r;default:return e}}function xr(e,t,n){switch(t.type){case"SELECT_DATES":return t.selection;case"UNSELECT_DATES":return null;default:return e}}function Nr(e,t){switch(t.type){case"SELECT_EVENT":return t.eventInstanceId;case"UNSELECT_EVENT":return"";default:return e}}function zr(e,t,n,r){switch(t.type){case"SET_EVENT_DRAG":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_DRAG":return null;default:return e}}function Ur(e,t,n,r){switch(t.type){case"SET_EVENT_RESIZE":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_RESIZE":return null;default:return e}}function Lr(e){var t=0;for(var n in e)e[n].isFetching&&t++;return t}function Ar(e,t,n){var r=Vr(e,t),i=r.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function Vr(e,t){var n={},r=Ge(e,xo,{},n),i=r.start?t.createMarkerMeta(r.start):null,o=r.end?t.createMarkerMeta(r.end):null,a=r.allDay;return null==a&&(a=i&&i.isTimeUnspecified&&(!o||o.isTimeUnspecified)),n.range={start:i?i.marker:null,end:o?o.marker:null},n.allDay=a,n}function Br(e,t){return Dt(e.range,t.range)&&e.allDay===t.allDay&&Fr(e,t)}function Fr(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}function Wr(e,t){return{start:t.toDate(e.range.start),end:t.toDate(e.range.end),startStr:t.formatIso(e.range.start,{omitTime:e.allDay}),endStr:t.formatIso(e.range.end,{omitTime:e.allDay}),allDay:e.allDay}}function Zr(e,t){return{date:t.toDate(e.range.start),dateStr:t.formatIso(e.range.start,{omitTime:e.allDay}),allDay:e.allDay}}function jr(e,t,n){var r=_n({editable:!1},"",e.allDay,!0,n);return{def:r,ui:Qt(r,t),instance:Pn(r.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function Yr(e,t){var n,r={};for(n in e)qr(n,r,e,t);for(n in t)qr(n,r,e,t);return r}function qr(e,t,n,r){if(t[e])return t[e];var i=Gr(e,t,n,r);return i&&(t[e]=i),i}function Gr(e,t,n,r){var i=n[e],o=r[e],a=function(e){return i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null},s=a("class"),u=a("superType");!u&&s&&(u=Xr(s,r)||Xr(s,n));var l=u?qr(u,t,n,r):null;return!s&&l&&(s=l.class),s?{type:e,class:s,defaults:ki({},l?l.defaults:{},i?i.options:{}),overrides:ki({},l?l.overrides:{},o?o.options:{})}:null}function Xr(e,t){var n=Object.getPrototypeOf(e.prototype);for(var r in t){var i=t[r];if(i.class&&i.class.prototype===n)return r}return""}function Jr(e){return ot(e,Kr)}function Kr(e){"function"==typeof e&&(e={class:e});var t={},n=Ge(e,No,{},t);return{superType:n.type,class:n.class,options:t}}function Qr(e,t){var n=Jr(e),r=Jr(t.overrides.views);return ot(Yr(n,r),function(e){return $r(e,r,t)})}function $r(e,t,n){var r=e.overrides.duration||e.defaults.duration||n.dynamicOverrides.duration||n.overrides.duration,i=null,o="",a="",s={};if(r&&(i=ue(r))){var u=we(i,!de(r));o=u.unit,1===u.value&&(a=o,s=t[o]?t[o].options:{})}var l=function(t){var n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[a]?n[a]:void 0};return{type:e.type,class:e.class,duration:i,durationUnit:o,singleUnit:a,options:ki({},So,e.defaults,n.dirDefaults,n.localeDefaults,n.overrides,s,e.overrides,n.dynamicOverrides),buttonTextOverride:l(n.dynamicOverrides)||l(n.overrides)||e.overrides.buttonText,buttonTextDefault:l(n.localeDefaults)||l(n.dirDefaults)||e.defaults.buttonText||l(So)||e.type}}function ei(e,t){var n;return n=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,this.dateEnv.formatRange(n.start,n.end,Vt(t.titleFormat||ti(e),t.titleRangeSeparator),{isEndExclusive:e.isRangeAllDay})}function ti(e){var t=e.currentRangeUnit;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};var n=G(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}function ni(e){return e.map(function(e){return new e})}function ri(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter}}function ii(e){var t;return t={},t[e.component.uid]=e,t}function oi(e,t,n,r,i,o,a){return new ko({calendarSystem:"gregory",timeZone:t,namedTimeZoneImpl:n,locale:e,weekNumberCalculation:i,firstDay:r,weekLabel:o,cmdFormatter:a})}function ai(e){return new(this.pluginSystem.hooks.themeClasses[e.themeSystem]||Fo)(e)}function si(e){var t=this.tryRerender.bind(this);return null!=e&&(t=qe(t,e)),t}function ui(e){return ot(e,function(e){return e.ui})}function li(e,t,n){var r={"":t};for(var i in e){var o=e[i];o.sourceId&&n[o.sourceId]&&(r[i]=n[o.sourceId])}return r}function ci(e){var t=e.eventRange.def,n=e.eventRange.instance.range,r=n.start?n.start.valueOf():0,i=n.end?n.end.valueOf():0;return ki({},t.extendedProps,t,{id:t.publicId,start:r,end:i,duration:i-r,allDay:Number(t.allDay),_seg:e})}function di(e,t){void 0===t&&(t={});var n=pi(t),r=Vt(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""}function fi(e,t,n){var r=pi("object"==typeof n&&n?n:{}),i=Vt(n,So.defaultRangeSeparator),o=r.createMarkerMeta(e),a=r.createMarkerMeta(t);return o&&a?r.formatRange(o.marker,a.marker,i,{forcedStartTzo:o.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive}):""}function pi(e){var t=dr(e.locale||"en",cr([]).map);return e=ki({timeZone:So.timeZone,calendarSystem:"gregory"},e,{locale:t}),new ko(e)}function hi(e){var t={},n=Ge(e,Xo,Jo,t);return n.leftoverProps=t,n}function vi(e,t){return!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"}}function gi(e,t,n,r,i,o,a,s){var u,l=o.view,c=o.dateEnv,d=o.theme,f=o.options,p=Rt(t.activeRange,e),h=["fc-day-header",d.getClass("widgetHeader")];return u="function"==typeof f.columnHeaderHtml?f.columnHeaderHtml(c.toDate(e)):Dn("function"==typeof f.columnHeaderText?f.columnHeaderText(c.toDate(e)):c.format(e,i)),n?h=h.concat(Gn(e,t,o,!0)):h.push("fc-"+Ri[e.getUTCDay()]),'<th class="'+h.join(" ")+'"'+(p&&n?' data-date="'+c.formatIso(e,{omitTime:!0})+'"':"")+(a>1?' colspan="'+a+'"':"")+(s?" "+s:"")+">"+(p?Yn(l,{date:e,forceOff:!n||1===r},u):u)+"</th>"}function yi(e,t){var n=e.activeRange;return t?n:{start:V(n.start,e.minTime.milliseconds),end:V(n.end,e.maxTime.milliseconds-864e5)}}var mi={className:!0,colSpan:!0,rowSpan:!0},Ei={"<tr":"tbody","<td":"tr"},Si=Element.prototype.matches||Element.prototype.matchesSelector||Element.prototype.msMatchesSelector,bi=Element.prototype.closest||function(e){var t=this;if(!document.documentElement.contains(t))return null;do{if(f(t,e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null},Di=/(top|left|right|bottom|width|height)$/i,Ti=null,wi=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"],Ri=["sun","mon","tue","wed","thu","fri","sat"],Ii=["years","months","days","milliseconds"],Ci=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/,Mi=function(e,t){return(Mi=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},ki=function(){return ki=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++){t=arguments[n];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e},ki.apply(this,arguments)},Oi={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},_i={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Pi=/\s*([ap])\.?m\.?/i,Hi=/,/g,xi=/\s+/g,Ni=/\u200e/g,zi=/UTC|GMT/,Ui=function(){function e(e){var t={},n={},r=0;for(var i in e)i in Oi?(n[i]=e[i],r=Math.max(Oi[i],r)):(t[i]=e[i],i in _i&&(r=Math.max(_i[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=kt(_t)}return e.prototype.format=function(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)},e.prototype.formatRange=function(e,t,n){var r=this,i=r.standardDateProps,o=r.extendedSettings,a=Ut(e.marker,t.marker,n.calendarSystem);if(!a)return this.format(e,n);var s=a;!(s>1)||"numeric"!==i.year&&"2-digit"!==i.year||"numeric"!==i.month&&"2-digit"!==i.month||"numeric"!==i.day&&"2-digit"!==i.day||(s=1);var u=this.format(e,n),l=this.format(t,n);if(u===l)return u;var c=Lt(i,s),d=_t(c,o,n),f=d(e),p=d(t),h=At(u,f,l,p),v=o.separator||"";return h?h.before+f+v+p+h.after:u+v+l},e.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";default:return"day"}},e}(),Li=function(){function e(e,t){this.cmdStr=e,this.separator=t}return e.prototype.format=function(e,t){return t.cmdFormatter(this.cmdStr,Zt(e,null,t,this.separator))},e.prototype.formatRange=function(e,t,n){return n.cmdFormatter(this.cmdStr,Zt(e,t,n,this.separator))},e}(),Ai=function(){function e(e){this.func=e}return e.prototype.format=function(e,t){return this.func(Zt(e,null,t))},e.prototype.formatRange=function(e,t,n){return this.func(Zt(e,t,n))},e}(),Vi=function(){function e(e,t){this.calendar=e,this.internalEventSource=t}return e.prototype.remove=function(){this.calendar.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.calendar.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId]})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!0,configurable:!0}),e}(),Bi=function(){function e(e,t,n){this._calendar=e,this._def=t,this._instance=n||null}return e.prototype.setProp=function(e,t){var n,r;if(e in ji);else if(e in Zi)"function"==typeof Zi[e]&&(t=Zi[e](t)),this.mutate({standardProps:(n={},n[e]=t,n)});else if(e in Fi){var i=void 0;"function"==typeof Fi[e]&&(t=Fi[e](t)),"color"===e?i={backgroundColor:t,borderColor:t}:"editable"===e?i={startEditable:t,durationEditable:t}:(r={},r[e]=t,i=r),this.mutate({standardProps:{ui:i}})}},e.prototype.setExtendedProp=function(e,t){var n;this.mutate({extendedProps:(n={},n[e]=t,n)})},e.prototype.setStart=function(e,t){void 0===t&&(t={});var n=this._calendar.dateEnv,r=n.createMarker(e);if(r&&this._instance){var i=this._instance.range,o=$e(i.start,r,n,t.granularity),a=null;if(t.maintainDuration){a=ve($e(i.start,i.end,n,t.granularity),$e(r,i.end,n,t.granularity))}this.mutate({startDelta:o,endDelta:a})}},e.prototype.setEnd=function(e,t){void 0===t&&(t={});var n,r=this._calendar.dateEnv;if((null==e||(n=r.createMarker(e)))&&this._instance)if(n){var i=$e(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:i})}else this.mutate({standardProps:{hasEnd:!1}})},e.prototype.setDates=function(e,t,n){void 0===n&&(n={});var r,i=this._calendar.dateEnv,o={allDay:n.allDay},a=i.createMarker(e);if(a&&(null==t||(r=i.createMarker(t)))&&this._instance){var s=this._instance.range;!0===n.allDay&&(s=Je(s));var u=$e(s.start,a,i,n.granularity);if(r){var l=$e(s.end,r,i,n.granularity);this.mutate({startDelta:u,endDelta:l,standardProps:o})}else o.hasEnd=!1,this.mutate({startDelta:u,standardProps:o})}},e.prototype.moveStart=function(e){var t=ue(e);t&&this.mutate({startDelta:t})},e.prototype.moveEnd=function(e){var t=ue(e);t&&this.mutate({endDelta:t})},e.prototype.moveDates=function(e){var t=ue(e);t&&this.mutate({startDelta:t,endDelta:t})},e.prototype.setAllDay=function(e,t){void 0===t&&(t={});var n={allDay:e},r=t.maintainDuration;null==r&&(r=this._calendar.opt("allDayMaintainDuration")),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})},e.prototype.formatRange=function(e){var t=this._calendar.dateEnv,n=this._instance,r=Vt(e,this._calendar.opt("defaultRangeSeparator"));return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})},e.prototype.mutate=function(e){var t=this._def,n=this._instance;if(n){this._calendar.dispatch({type:"MUTATE_EVENTS",instanceId:n.instanceId,mutation:e,fromApi:!0});var r=this._calendar.state.eventStore;this._def=r.defs[t.defId],this._instance=r.instances[n.instanceId]}},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_EVENT_DEF",defId:this._def.defId})},Object.defineProperty(e.prototype,"source",{get:function(){var e=this._def.sourceId;return e?new Vi(this._calendar,this._calendar.state.eventSources[e]):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"start",{get:function(){return this._instance?this._calendar.dateEnv.toDate(this._instance.range.start):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"end",{get:function(){return this._instance&&this._def.hasEnd?this._calendar.dateEnv.toDate(this._instance.range.end):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._def.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"groupId",{get:function(){return this._def.groupId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allDay",{get:function(){return this._def.allDay},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._def.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._def.url},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rendering",{get:function(){return this._def.rendering},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"startEditable",{get:function(){return this._def.ui.startEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"durationEditable",{get:function(){return this._def.ui.durationEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"constraint",{get:function(){return this._def.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"overlap",{get:function(){return this._def.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allow",{get:function(){return this._def.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"backgroundColor",{get:function(){return this._def.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"borderColor",{get:function(){return this._def.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textColor",{get:function(){return this._def.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"classNames",{get:function(){return this._def.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._def.extendedProps},enumerable:!0,configurable:!0}),e}(),Fi={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:Rn,classNames:Rn,color:String,backgroundColor:String,borderColor:String,textColor:String},Wi={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]},Zi={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null},ji={start:null,date:null,end:null,allDay:null},Yi=0,qi={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],rendering:"inverse-background",classNames:"fc-nonbusiness",groupId:"_businessHours"},Gi=vt(),Xi=function(){function e(){this.getKeysForEventDefs=kt(this._getKeysForEventDefs),this.splitDateSelection=kt(this._splitDateSpan),this.splitEventStore=kt(this._splitEventStore),this.splitIndividualUi=kt(this._splitIndividualUi),this.splitEventDrag=kt(this._splitInteraction),this.splitEventResize=kt(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),i=this.splitDateSelection(e.dateSelection),o=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),u=this.splitEventResize(e.eventResize),l={};this.eventUiBuilders=ot(n,function(e,n){return t.eventUiBuilders[n]||kt(jn)});for(var c in n){var d=n[c],f=a[c]||Gi,p=this.eventUiBuilders[c];l[c]={businessHours:d.businessHours||e.businessHours,dateSelection:i[c]||null,eventStore:f,eventUiBases:p(e.eventUiBases[""],d.ui,o[c]),eventSelection:f.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:u[c]||null}}return l},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=this.getKeysForDateSpan(e),r=0,i=n;r<i.length;r++){var o=i[r];t[o]=e}return t},e.prototype._getKeysForEventDefs=function(e){var t=this;return ot(e.defs,function(e){return t.getKeysForEventDef(e)})},e.prototype._splitEventStore=function(e,t){var n=e.defs,r=e.instances,i={};for(var o in n)for(var a=0,s=t[o];a<s.length;a++){var u=s[a];i[u]||(i[u]=vt()),i[u].defs[o]=n[o]}for(var l in r)for(var c=r[l],d=0,f=t[c.defId];d<f.length;d++){var u=f[d];i[u]&&(i[u].instances[l]=c)}return i},e.prototype._splitIndividualUi=function(e,t){var n={};for(var r in e)if(r)for(var i=0,o=t[r];i<o.length;i++){var a=o[i];n[a]||(n[a]={}),n[a][r]=e[r]}return n},e.prototype._splitInteraction=function(e){var t={};if(e){var n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=function(r){t[r]||(t[r]={affectedEvents:n[r]||Gi,mutatedEvents:i[r]||Gi,isEvent:e.isEvent,origSeg:e.origSeg})};for(var a in n)o(a);for(var a in i)o(a)}return t},e}(),Ji=function(){function e(){}return e.mixInto=function(e){this.mixIntoObj(e.prototype)},e.mixIntoObj=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e[n]||(e[n]=t.prototype[n])})},e.mixOver=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e.prototype[n]=t.prototype[n]})},e}(),Ki=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return et(t,e),t.prototype.on=function(e,t){return Jn(this._handlers||(this._handlers={}),e,t),this},t.prototype.one=function(e,t){return Jn(this._oneHandlers||(this._oneHandlers={}),e,t),this},t.prototype.off=function(e,t){return this._handlers&&Kn(this._handlers,e,t),this._oneHandlers&&Kn(this._oneHandlers,e,t),this},t.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return this.triggerWith(e,this,t),this},t.prototype.triggerWith=function(e,t,n){return this._handlers&&je(this._handlers[e],t,n),this._oneHandlers&&(je(this._oneHandlers[e],t,n),delete this._oneHandlers[e]),this},t.prototype.hasHandlers=function(e){return this._handlers&&this._handlers[e]&&this._handlers[e].length||this._oneHandlers&&this._oneHandlers[e]&&this._oneHandlers[e].length},t}(Ji),Qi=function(){function e(e,t,n,r){this.originEl=e,this.els=t,this.isHorizontal=n,this.isVertical=r}return e.prototype.build=function(){var e=this.originEl,t=this.originClientRect=e.getBoundingClientRect();this.isHorizontal&&this.buildElHorizontals(t.left),this.isVertical&&this.buildElVerticals(t.top)},e.prototype.buildElHorizontals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r],a=o.getBoundingClientRect();t.push(a.left-e),n.push(a.right-e)}this.lefts=t,this.rights=n},e.prototype.buildElVerticals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r],a=o.getBoundingClientRect();t.push(a.top-e),n.push(a.bottom-e)}this.tops=t,this.bottoms=n},e.prototype.leftToIndex=function(e){var t,n=this.lefts,r=this.rights,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.topToIndex=function(e){var t,n=this.tops,r=this.bottoms,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.getWidth=function(e){return this.rights[e]-this.lefts[e]},e.prototype.getHeight=function(e){return this.bottoms[e]-this.tops[e]},e}(),$i=function(){function e(){}return e.prototype.getMaxScrollTop=function(){return this.getScrollHeight()-this.getClientHeight()},e.prototype.getMaxScrollLeft=function(){return this.getScrollWidth()-this.getClientWidth()},e.prototype.canScrollVertically=function(){return this.getMaxScrollTop()>0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()<this.getMaxScrollTop()},e.prototype.canScrollLeft=function(){return this.getScrollLeft()>0},e.prototype.canScrollRight=function(){return this.getScrollLeft()<this.getMaxScrollLeft()},e}(),eo=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return et(t,e),t.prototype.getScrollTop=function(){return this.el.scrollTop},t.prototype.getScrollLeft=function(){return this.el.scrollLeft},t.prototype.setScrollTop=function(e){this.el.scrollTop=e},t.prototype.setScrollLeft=function(e){this.el.scrollLeft=e},t.prototype.getScrollWidth=function(){return this.el.scrollWidth},t.prototype.getScrollHeight=function(){return this.el.scrollHeight},t.prototype.getClientHeight=function(){return this.el.clientHeight},t.prototype.getClientWidth=function(){return this.el.clientWidth},t}($i),to=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return et(t,e),t.prototype.getScrollTop=function(){return window.pageYOffset},
+t.prototype.getScrollLeft=function(){return window.pageXOffset},t.prototype.setScrollTop=function(e){window.scroll(window.pageXOffset,e)},t.prototype.setScrollLeft=function(e){window.scroll(e,window.pageYOffset)},t.prototype.getScrollWidth=function(){return document.documentElement.scrollWidth},t.prototype.getScrollHeight=function(){return document.documentElement.scrollHeight},t.prototype.getClientHeight=function(){return document.documentElement.clientHeight},t.prototype.getClientWidth=function(){return document.documentElement.clientWidth},t}($i),no=function(e){function n(n,r){var i=e.call(this,t("div",{className:"fc-scroller"}))||this;return i.overflowX=n,i.overflowY=r,i.applyOverflow(),i}return et(n,e),n.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},n.prototype.destroy=function(){c(this.el)},n.prototype.applyOverflow=function(){g(this.el,{overflowX:this.overflowX,overflowY:this.overflowY})},n.prototype.lockOverflow=function(e){var t=this.overflowX,n=this.overflowY;e=e||this.getScrollbarWidths(),"auto"===t&&(t=e.bottom||this.canScrollHorizontally()?"scroll":"hidden"),"auto"===n&&(n=e.left||e.right||this.canScrollVertically()?"scroll":"hidden"),g(this.el,{overflowX:t,overflowY:n})},n.prototype.setHeight=function(e){y(this.el,"height",e)},n.prototype.getScrollbarWidths=function(){var e=C(this.el);return{left:e.scrollbarLeft,right:e.scrollbarRight,bottom:e.scrollbarBottom}},n}(eo),ro=function(){function e(e){this.calendarOptions=e,this.processIconOverride()}return e.prototype.processIconOverride=function(){this.iconOverrideOption&&this.setIconOverride(this.calendarOptions[this.iconOverrideOption])},e.prototype.setIconOverride=function(e){var t,n;if("object"==typeof e&&e){t=ki({},this.iconClasses);for(n in e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})},e.prototype.applyIconOverridePrefix=function(e){var t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e},e.prototype.getClass=function(e){return this.classes[e]||""},e.prototype.getIconClass=function(e){var t=this.iconClasses[e];return t?this.baseIconClass+" "+t:""},e.prototype.getCustomButtonIconClass=function(e){var t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(t):""},e}();ro.prototype.classes={},ro.prototype.iconClasses={},ro.prototype.baseIconClass="",ro.prototype.iconOverridePrefix="";var io=0,oo=function(){function e(e,t){t&&(e.view=this),this.uid=String(io++),this.context=e,this.dateEnv=e.dateEnv,this.theme=e.theme,this.view=e.view,this.calendar=e.calendar,this.isRtl="rtl"===this.opt("dir")}return e.addEqualityFuncs=function(e){this.prototype.equalityFuncs=ki({},this.prototype.equalityFuncs,e)},e.prototype.opt=function(e){return this.context.options[e]},e.prototype.receiveProps=function(e){var t=Qn(this.props||{},e,this.equalityFuncs),n=t.anyChanges,r=t.comboProps;this.props=r,n&&this.render(r)},e.prototype.render=function(e){},e.prototype.destroy=function(){},e}();oo.prototype.equalityFuncs={};var ao=function(e){function t(t,n,r){var i=e.call(this,t,r)||this;return i.el=n,i}return et(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),c(this.el)},t.prototype.buildPositionCaches=function(){},t.prototype.queryHit=function(e,t,n,r){return null},t.prototype.isInteractionValid=function(e){var t=this.calendar,n=this.props.dateProfile,r=e.mutatedEvents.instances;if(n)for(var i in r)if(!wt(n.validRange,r[i].range))return!1;return dn(e,t)},t.prototype.isDateSelectionValid=function(e){var t=this.props.dateProfile;return!(t&&!wt(t.validRange,e.range))&&fn(e,this.calendar)},t.prototype.publiclyTrigger=function(e,t){return this.calendar.publiclyTrigger(e,t)},t.prototype.publiclyTriggerAfterSizing=function(e,t){return this.calendar.publiclyTriggerAfterSizing(e,t)},t.prototype.hasPublicHandlers=function(e){return this.calendar.hasPublicHandlers(e)},t.prototype.triggerRenderedSegs=function(e,t){var n=this.calendar;if(this.hasPublicHandlers("eventPositioned"))for(var r=0,i=e;r<i.length;r++){var o=i[r];this.publiclyTriggerAfterSizing("eventPositioned",[{event:new Bi(n,o.eventRange.def,o.eventRange.instance),isMirror:t,isStart:o.isStart,isEnd:o.isEnd,el:o.el,view:this}])}n.state.loadingLevel||(n.afterSizingTriggers._eventsPositioned=[null])},t.prototype.triggerWillRemoveSegs=function(e,t){for(var n=this.calendar,r=0,i=e;r<i.length;r++){var o=i[r];n.trigger("eventElRemove",o.el)}if(this.hasPublicHandlers("eventDestroy"))for(var a=0,s=e;a<s.length;a++){var o=s[a];this.publiclyTrigger("eventDestroy",[{event:new Bi(n,o.eventRange.def,o.eventRange.instance),isMirror:t,el:o.el,view:this}])}},t.prototype.isValidSegDownEl=function(e){return!this.props.eventDrag&&!this.props.eventResize&&!d(e,".fc-mirror")&&(this.isPopover()||!this.isInPopover(e))},t.prototype.isValidDateDownEl=function(e){var t=d(e,this.fgSegSelector);return(!t||t.classList.contains("fc-mirror"))&&!d(e,".fc-more")&&!d(e,"a[data-goto]")&&!this.isInPopover(e)},t.prototype.isPopover=function(){return this.el.classList.contains("fc-popover")},t.prototype.isInPopover=function(e){return Boolean(d(e,".fc-popover"))},t}(oo);ao.prototype.fgSegSelector=".fc-event-container > *",ao.prototype.bgSegSelector=".fc-bgevent:not(.fc-nonbusiness)";var so=0,uo=function(){function e(){this.hooks={reducers:[],eventDefParsers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],eventResizeJoinTransforms:[],viewContainerModifiers:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,defaultView:"",elementDraggingImpl:null,optionChangeHandlers:{}},this.addedHash={}}return e.prototype.add=function(e){if(!this.addedHash[e.id]){this.addedHash[e.id]=!0;for(var t=0,n=e.deps;t<n.length;t++){var r=n[t];this.add(r)}this.hooks=er(this.hooks,e)}},e}(),lo={ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}},co=$n({eventSourceDefs:[lo]}),fo={parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var r=e.calendar.dateEnv;Xn(e.eventSource.meta.bind(null,{start:r.toDate(e.range.start),end:r.toDate(e.range.end),startStr:r.formatIso(e.range.start),endStr:r.formatIso(e.range.end),timeZone:r.timeZone}),function(e){t({rawEvents:e})},n)}},po=$n({eventSourceDefs:[fo]}),ho={parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var r=e.eventSource.meta,i=ir(r,e.range,e.calendar);tr(r.method,r.url,i,function(e,n){t({rawEvents:e,xhr:n})},function(e,t){n({message:e,xhr:t})})}},vo=$n({eventSourceDefs:[ho]}),go={parse:function(e,t,n){var r=n.createMarker.bind(n),i={daysOfWeek:null,startTime:ue,endTime:ue,startRecur:r,endRecur:r},o=Ge(e,i,{},t),a=!1;for(var s in o)if(null!=o[s]){a=!0;break}return a?{allDayGuess:Boolean(!o.startTime&&!o.endTime),duration:o.startTime&&o.endTime?ve(o.endTime,o.startTime):null,typeData:o}:null},expand:function(e,t,n){var r=bt(t,{start:e.startRecur,end:e.endRecur});return r?or(e.daysOfWeek,e.startTime,r,n):[]}},yo=$n({recurringTypes:[go]}),mo=$n({optionChangeHandlers:{events:function(e,t){ar([e],t)},eventSources:ar,plugins:sr}}),Eo={},So={defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",columnHeader:!0,defaultView:"",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,scrollTime:"06:00:00",minTime:"00:00:00",maxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",timeGridEventMinHeight:0,themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",eventLimit:!1,eventLimitClick:"popover",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5},bo={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"}},Do=["header","footer","buttonText","buttonIcons"],To=[co,po,vo,yo,mo],wo={code:"en",week:{dow:0,doy:4},dir:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekLabel:"W",allDayText:"all-day",eventLimitText:"more",noEventsMessage:"No events to display"},Ro=function(){function e(e){this.overrides=ki({},e),this.dynamicOverrides={},this.compute()}return e.prototype.add=function(e){ki(this.overrides,e),this.compute()},e.prototype.addDynamic=function(e){ki(this.dynamicOverrides,e),this.compute()},e.prototype.reset=function(e){this.overrides=e,this.compute()},e.prototype.compute=function(){var e=Ye(this.dynamicOverrides.locales,this.overrides.locales,So.locales),t=Ye(this.dynamicOverrides.locale,this.overrides.locale,So.locale),n=cr(e),r=dr(t||n.defaultCode,n.map).options,i=Ye(this.dynamicOverrides.dir,this.overrides.dir,r.dir),o="rtl"===i?bo:{};this.dirDefaults=o,this.localeDefaults=r,this.computed=ur([So,o,r,this.overrides,this.dynamicOverrides])},e}(),Io={},Co=function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return oe(e)},e.prototype.markerToArray=function(e){return ie(e)},e}();!function(e,t){Io[e]=t}("gregory",Co);var Mo=/^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/,ko=function(){function e(e){var t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=vr(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation?(this.weekDow=1,this.weekDoy=4):"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekLabel=null!=e.weekLabel?e.weekLabel:e.locale.options.weekLabel,this.cmdFormatter=e.cmdFormatter}return e.prototype.createMarker=function(e){var t=this.createMarkerMeta(e);return null===t?null:t.marker},e.prototype.createNowMarker=function(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):oe(ne(new Date))},e.prototype.createMarkerMeta=function(e){if("string"==typeof e)return this.parse(e);var t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=oe(e)),null!==t&&ae(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null},e.prototype.parse=function(e){var t=gr(e);if(null===t)return null;var n=t.marker,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}},e.prototype.getYear=function(e){return this.calendarSystem.getMarkerYear(e)},e.prototype.getMonth=function(e){return this.calendarSystem.getMarkerMonth(e)},e.prototype.add=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.subtract=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.addYears=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.addMonths=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.diffWholeYears=function(e,t){var n=this.calendarSystem;return se(e)===se(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null},e.prototype.diffWholeMonths=function(e,t){var n=this.calendarSystem;return se(e)===se(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null},e.prototype.greatestWholeUnit=function(e,t){var n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:null!==(n=this.diffWholeMonths(e,t))?{unit:"month",value:n}:null!==(n=q(e,t))?{unit:"week",value:n}:null!==(n=G(e,t))?{unit:"day",value:n}:(n=W(e,t),Ze(n)?{unit:"hour",value:n}:(n=Z(e,t),Ze(n)?{unit:"minute",value:n}:(n=j(e,t),Ze(n)?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()})))},e.prototype.countDurationsBetween=function(e,t,n){var r;return n.years&&null!==(r=this.diffWholeYears(e,t))?r/ye(n):n.months&&null!==(r=this.diffWholeMonths(e,t))?r/me(n):n.days&&null!==(r=G(e,t))?r/Ee(n):(t.valueOf()-e.valueOf())/De(n)},e.prototype.startOf=function(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?X(e):"hour"===t?J(e):"minute"===t?K(e):"second"===t?Q(e):void 0},e.prototype.startOfYear=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])},e.prototype.startOfMonth=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])},e.prototype.startOfWeek=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])},e.prototype.computeWeekNumber=function(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):$(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=V(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),Bt(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?oe(ne(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?oe(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-re(ie(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(ie(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?re(ie(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(ie(e))*60):new Date(e.valueOf()-(t||0))},e}(),Oo={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function},_o=0,Po=0,Ho=function(){function e(e,t){this.viewSpec=e,this.options=e.options,this.dateEnv=t.dateEnv,this.calendar=t,this.initHiddenDays()}return e.prototype.buildPrev=function(e,t){var n=this.dateEnv,r=n.subtract(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,-1)},e.prototype.buildNext=function(e,t){var n=this.dateEnv,r=n.add(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,1)},e.prototype.build=function(e,t,n){void 0===n&&(n=!1);var r,i,o,a,s,u,l=null,c=null;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(e=It(e,r)),i=this.buildCurrentRangeInfo(e,t),o=/^(year|month|week|day)$/.test(i.unit),a=this.buildRenderRange(this.trimHiddenDays(i.range),i.unit,o),a=this.trimHiddenDays(a),s=a,this.options.showNonCurrentDates||(s=bt(s,i.range)),l=ue(this.options.minTime),c=ue(this.options.maxTime),s=this.adjustActiveRange(s,l,c),s=bt(s,r),u=Tt(i.range,r),{validRange:r,currentRange:i.range,currentRangeUnit:i.unit,isRangeAllDay:o,activeRange:s,renderRange:a,minTime:l,maxTime:c,isValid:u,dateIncrement:this.buildDateIncrement(i.duration)}},e.prototype.buildValidRange=function(){return this.getRangeOption("validRange",this.calendar.getNow())||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this,i=r.viewSpec,o=r.dateEnv,a=null,s=null,u=null;return i.duration?(a=i.duration,s=i.durationUnit,u=this.buildRangeFromDuration(e,t,a,s)):(n=this.options.dayCount)?(s="day",u=this.buildRangeFromDayCount(e,t,n)):(u=this.buildCustomVisibleRange(e))?s=o.greatestWholeUnit(u.start,u.end).unit:(a=this.getFallbackDuration(),s=we(a).unit,u=this.buildRangeFromDuration(e,t,a,s)),{duration:a,unit:s,range:u}},e.prototype.getFallbackDuration=function(){return ue({day:1})},e.prototype.adjustActiveRange=function(e,t,n){var r=this.dateEnv,i=e.start,o=e.end;return this.viewSpec.class.prototype.usesMinMaxTime&&(Ee(t)<0&&(i=X(i),i=r.add(i,t)),Ee(n)>1&&(o=X(o),o=A(o,-1),o=r.add(o,n))),{start:i,end:o}},e.prototype.buildRangeFromDuration=function(e,t,n,r){function i(){s=c.startOf(e,d),u=c.add(s,n),l={start:s,end:u}}var o,a,s,u,l,c=this.dateEnv,d=this.options.dateAlignment;return d||(o=this.options.dateIncrement,o?(a=ue(o),d=De(a)<De(n)?we(a,!de(o)).unit:r):d=r),Ee(n)<=1&&this.isHiddenDay(s)&&(s=this.skipHiddenDays(s,t),s=X(s)),i(),this.trimHiddenDays(l)||(e=this.skipHiddenDays(e,t),i()),l},e.prototype.buildRangeFromDayCount=function(e,t,n){var r,i=this.dateEnv,o=this.options.dateAlignment,a=0,s=e;o&&(s=i.startOf(s,o)),s=X(s),s=this.skipHiddenDays(s,t),r=s;do{r=A(r,1),this.isHiddenDay(r)||a++}while(a<n);return{start:s,end:r}},e.prototype.buildCustomVisibleRange=function(e){var t=this.dateEnv,n=this.getRangeOption("visibleRange",t.toDate(e));return!n||null!=n.start&&null!=n.end?n:null},e.prototype.buildRenderRange=function(e,t,n){return e},e.prototype.buildDateIncrement=function(e){var t,n=this.options.dateIncrement;return n?ue(n):(t=this.options.dateAlignment)?ue(1,t):e||ue({days:1})},e.prototype.getRangeOption=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=this.options[e];return"function"==typeof r&&(r=r.apply(null,t)),r&&(r=mt(r,this.dateEnv)),r&&(r=Ke(r)),r},e.prototype.initHiddenDays=function(){var e,t=this.options.hiddenDays||[],n=[],r=0;for(!1===this.options.weekends&&t.push(0,6),e=0;e<7;e++)(n[e]=-1!==t.indexOf(e))||r++;if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(e){var t=e.start,n=e.end;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null},e.prototype.isHiddenDay=function(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]},e.prototype.skipHiddenDays=function(e,t,n){for(void 0===t&&(t=1),void 0===n&&(n=!1);this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=A(e,t);return e},e}(),xo={start:null,end:null,allDay:Boolean},No={type:String,class:null},zo=function(e){function r(n,r){var i=e.call(this,n)||this;return i._renderLayout=An(i.renderLayout,i.unrenderLayout),i._updateTitle=An(i.updateTitle,null,[i._renderLayout]),i._updateActiveButton=An(i.updateActiveButton,null,[i._renderLayout]),i._updateToday=An(i.updateToday,null,[i._renderLayout]),i._updatePrev=An(i.updatePrev,null,[i._renderLayout]),i._updateNext=An(i.updateNext,null,[i._renderLayout]),i.el=t("div",{className:"fc-toolbar "+r}),i}return et(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderLayout.unrender(),c(this.el)},r.prototype.render=function(e){this._renderLayout(e.layout),this._updateTitle(e.title),this._updateActiveButton(e.activeButton),this._updateToday(e.isTodayEnabled),this._updatePrev(e.isPrevEnabled),this._updateNext(e.isNextEnabled)},r.prototype.renderLayout=function(e){var t=this.el;this.viewsWithButtons=[],a(t,this.renderSection("left",e.left)),a(t,this.renderSection("center",e.center)),a(t,this.renderSection("right",e.right))},r.prototype.unrenderLayout=function(){this.el.innerHTML=""},r.prototype.renderSection=function(e,r){var i=this,o=this,s=o.theme,u=o.calendar,l=u.optionsManager,c=u.viewSpecs,d=t("div",{className:"fc-"+e}),f=l.computed.customButtons||{},p=l.overrides.buttonText||{},h=l.computed.buttonText||{};return r&&r.split(" ").forEach(function(e,t){var r,o=[],l=!0;if(e.split(",").forEach(function(e,t){var r,a,d,v,g,y,m,E,S;"title"===e?(o.push(n("<h2>&nbsp;</h2>")),l=!1):((r=f[e])?(d=function(e){r.click&&r.click.call(E,e)},(v=s.getCustomButtonIconClass(r))||(v=s.getIconClass(e))||(g=r.text)):(a=c[e])?(i.viewsWithButtons.push(e),d=function(){u.changeView(e)},(g=a.buttonTextOverride)||(v=s.getIconClass(e))||(g=a.buttonTextDefault)):u[e]&&(d=function(){u[e]()},(g=p[e])||(v=s.getIconClass(e))||(g=h[e])),d&&(m=["fc-"+e+"-button",s.getClass("button")],g?(y=Dn(g),S=""):v&&(y="<span class='"+v+"'></span>",S=' aria-label="'+e+'"'),E=n('<button type="button" class="'+m.join(" ")+'"'+S+">"+y+"</button>"),E.addEventListener("click",d),o.push(E)))}),o.length>1){r=document.createElement("div");var v=s.getClass("buttonGroup");l&&v&&r.classList.add(v),a(r,o),d.appendChild(r)}else a(d,o)}),d},r.prototype.updateToday=function(e){this.toggleButtonEnabled("today",e)},r.prototype.updatePrev=function(e){this.toggleButtonEnabled("prev",e)},r.prototype.updateNext=function(e){this.toggleButtonEnabled("next",e)},r.prototype.updateTitle=function(e){p(this.el,"h2").forEach(function(t){t.innerText=e})},r.prototype.updateActiveButton=function(e){var t=this.theme.getClass("buttonActive");p(this.el,"button").forEach(function(n){e&&n.classList.contains("fc-"+e+"-button")?n.classList.add(t):n.classList.remove(t)})},r.prototype.toggleButtonEnabled=function(e,t){p(this.el,".fc-"+e+"-button").forEach(function(e){e.disabled=!t})},r}(oo),Uo=function(e){function n(n,r){var i=e.call(this,n)||this;i._renderToolbars=An(i.renderToolbars),i.buildViewPropTransformers=kt(ni),i.el=r,s(r,i.contentEl=t("div",{className:"fc-view-container"}));for(var o=i.calendar,a=0,u=o.pluginSystem.hooks.viewContainerModifiers;a<u.length;a++){(0,u[a])(i.contentEl,o)}return i.toggleElClassNames(!0),i.computeTitle=kt(ei),i.parseBusinessHours=kt(function(e){return Un(e,i.calendar)}),i}return et(n,e),n.prototype.destroy=function(){this.header&&this.header.destroy(),this.footer&&this.footer.destroy(),this.view&&this.view.destroy(),c(this.contentEl),this.toggleElClassNames(!1),e.prototype.destroy.call(this)},n.prototype.toggleElClassNames=function(e){var t=this.el.classList,n="fc-"+this.opt("dir"),r=this.theme.getClass("widget");e?(t.add("fc"),t.add(n),t.add(r)):(t.remove("fc"),t.remove(n),t.remove(r))},n.prototype.render=function(e){this.freezeHeight();var t=this.computeTitle(e.dateProfile,e.viewSpec.options);this._renderToolbars(e.viewSpec,e.dateProfile,e.currentDate,e.dateProfileGenerator,t),this.renderView(e,t),this.updateSize(),this.thawHeight()},n.prototype.renderToolbars=function(e,t,n,r,i){var o=this.opt("header"),u=this.opt("footer"),l=this.calendar.getNow(),c=r.build(l),d=r.buildPrev(t,n),f=r.buildNext(t,n),p={title:i,activeButton:e.type,isTodayEnabled:c.isValid&&!Rt(t.currentRange,l),isPrevEnabled:d.isValid,isNextEnabled:f.isValid};o?(this.header||(this.header=new zo(this.context,"fc-header-toolbar"),s(this.el,this.header.el)),this.header.receiveProps(ki({layout:o},p))):this.header&&(this.header.destroy(),this.header=null),u?(this.footer||(this.footer=new zo(this.context,"fc-footer-toolbar"),a(this.el,this.footer.el)),this.footer.receiveProps(ki({layout:u},p))):this.footer&&(this.footer.destroy(),this.footer=null)},n.prototype.renderView=function(e,t){var n=this.view,r=e.viewSpec,i=e.dateProfileGenerator;n&&n.viewSpec===r?n.addScroll(n.queryScroll()):(n&&n.destroy(),n=this.view=new r.class({calendar:this.calendar,view:null,dateEnv:this.dateEnv,theme:this.theme,options:r.options},r,i,this.contentEl)),n.title=t;for(var o={dateProfile:e.dateProfile,businessHours:this.parseBusinessHours(r.options.businessHours),eventStore:e.eventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize},a=this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers),s=0,u=a;s<u.length;s++){var l=u[s];ki(o,l.transform(o,r,e,n))}n.receiveProps(o)},n.prototype.updateSize=function(e){void 0===e&&(e=!1);var t=this.view;e&&t.addScroll(t.queryScroll()),(e||null==this.isHeightAuto)&&this.computeHeightVars(),t.updateSize(e,this.viewHeight,this.isHeightAuto),t.updateNowIndicator(),t.popScroll(e)},n.prototype.computeHeightVars=function(){var e=this.calendar,t=e.opt("height"),n=e.opt("contentHeight");this.isHeightAuto="auto"===t||"auto"===n,this.viewHeight="number"==typeof n?n:"function"==typeof n?n():"number"==typeof t?t-this.queryToolbarsHeight():"function"==typeof t?t()-this.queryToolbarsHeight():"parent"===t?this.el.parentNode.offsetHeight-this.queryToolbarsHeight():Math.round(this.contentEl.offsetWidth/Math.max(e.opt("aspectRatio"),.5))},n.prototype.queryToolbarsHeight=function(){var e=0;return this.header&&(e+=_(this.header.el)),this.footer&&(e+=_(this.footer.el)),e},n.prototype.freezeHeight=function(){g(this.el,{height:this.el.offsetHeight,overflow:"hidden"})},n.prototype.thawHeight=function(){g(this.el,{height:"",overflow:""})},n}(oo),Lo=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}(),Ao={},Vo=function(e){function t(t){var n=e.call(this,t)||this;n.handleSegClick=function(e,t){var r=n.component,i=Jt(t);if(i&&r.isValidSegDownEl(e.target)){var o=d(e.target,".fc-has-url"),a=o?o.querySelector("a[href]").href:"";r.publiclyTrigger("eventClick",[{el:t,event:new Bi(r.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.view}]),a&&!e.defaultPrevented&&(window.location.href=a)}};var r=t.component;return n.destroy=N(r.el,"click",r.fgSegSelector+","+r.bgSegSelector,n.handleSegClick),n}return et(t,e),t}(Lo),Bo=function(e){function t(t){var n=e.call(this,t)||this;n.handleEventElRemove=function(e){e===n.currentSegEl&&n.handleSegLeave(null,n.currentSegEl)},n.handleSegEnter=function(e,t){Jt(t)&&(t.classList.add("fc-allow-mouse-resize"),n.currentSegEl=t,n.triggerEvent("eventMouseEnter",e,t))},n.handleSegLeave=function(e,t){n.currentSegEl&&(t.classList.remove("fc-allow-mouse-resize"),n.currentSegEl=null,n.triggerEvent("eventMouseLeave",e,t))};var r=t.component;return n.removeHoverListeners=z(r.el,r.fgSegSelector+","+r.bgSegSelector,n.handleSegEnter,n.handleSegLeave),r.calendar.on("eventElRemove",n.handleEventElRemove),n}return et(t,e),t.prototype.destroy=function(){this.removeHoverListeners(),this.component.calendar.off("eventElRemove",this.handleEventElRemove)},t.prototype.triggerEvent=function(e,t,n){var r=this.component,i=Jt(n);t&&!r.isValidSegDownEl(t.target)||r.publiclyTrigger(e,[{el:n,event:new Bi(this.component.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:r.view}])},t}(Lo),Fo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return et(t,e),t}(ro);Fo.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},Fo.prototype.baseIconClass="fc-icon",Fo.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},Fo.prototype.iconOverrideOption="buttonIcons",Fo.prototype.iconOverrideCustomButtonOption="icon",Fo.prototype.iconOverridePrefix="fc-icon-";var Wo=function(){function e(e,t){var n=this;this.parseRawLocales=kt(cr),this.buildLocale=kt(dr),this.buildDateEnv=kt(oi),this.buildTheme=kt(ai),this.buildEventUiSingleBase=kt(this._buildEventUiSingleBase),this.buildSelectionConfig=kt(this._buildSelectionConfig),this.buildEventUiBySource=Ot(ui,Fn),this.buildEventUiBases=kt(li),this.interactionsStore={},this.actionQueue=[],this.isReducing=!1,this.needsRerender=!1,this.needsFullRerender=!1,this.isRendering=!1,this.renderingPauseDepth=0,this.buildDelayedRerender=kt(si),this.afterSizingTriggers={},this.isViewUpdated=!1,this.isDatesUpdated=!1,this.isEventsUpdated=!1,this.el=e,this.optionsManager=new Ro(t||{}),this.pluginSystem=new uo,this.addPluginInputs(this.optionsManager.computed.plugins||[]),this.handleOptions(this.optionsManager.computed),this.publiclyTrigger("_init"),this.hydrate(),this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map(function(e){return new e(n)})}return e.prototype.addPluginInputs=function(e){for(var t=lr(e),n=0,r=t;n<r.length;n++){var i=r[n];this.pluginSystem.add(i)}},Object.defineProperty(e.prototype,"view",{get:function(){return this.component?this.component.view:null},enumerable:!0,configurable:!0}),e.prototype.render=function(){this.component?this.requestRerender(!0):(this.renderableEventStore=vt(),this.bindHandlers(),this.executeRender())},e.prototype.destroy=function(){if(this.component){this.unbindHandlers(),this.component.destroy(),this.component=null;for(var e=0,t=this.calendarInteractions;e<t.length;e++){t[e].destroy()}this.publiclyTrigger("_destroyed")}},e.prototype.bindHandlers=function(){var e=this;this.removeNavLinkListener=N(this.el,"click","a[data-goto]",function(t,n){var r=n.getAttribute("data-goto");r=r?JSON.parse(r):{};var i=e.dateEnv,o=i.createMarker(r.date),a=r.type,s=e.viewOpt("navLink"+Be(a)+"Click");"function"==typeof s?s(i.toDate(o),t):("string"==typeof s&&(a=s),e.zoomTo(o,a))}),this.opt("handleWindowResize")&&window.addEventListener("resize",this.windowResizeProxy=qe(this.windowResize.bind(this),this.opt("windowResizeDelay")))},e.prototype.unbindHandlers=function(){this.removeNavLinkListener(),this.windowResizeProxy&&(window.removeEventListener("resize",this.windowResizeProxy),this.windowResizeProxy=null)},e.prototype.hydrate=function(){var e=this;this.state=this.buildInitialState();var t=this.opt("eventSources")||[],n=this.opt("events"),r=[];n&&t.unshift(n);for(var i=0,o=t;i<o.length;i++){var a=o[i],s=mr(a,this);s&&r.push(s)}this.batchRendering(function(){e.dispatch({type:"INIT"}),e.dispatch({type:"ADD_EVENT_SOURCES",sources:r}),e.dispatch({type:"SET_VIEW_TYPE",viewType:e.opt("defaultView")||e.pluginSystem.hooks.defaultView})})},e.prototype.buildInitialState=function(){return{viewType:null,loadingLevel:0,eventSourceLoadingLevel:0,currentDate:this.getInitialDate(),dateProfile:null,eventSources:{},eventStore:vt(),dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null}},e.prototype.dispatch=function(e){if(this.actionQueue.push(e),!this.isReducing){this.isReducing=!0;for(var t=this.state;this.actionQueue.length;)this.state=this.reduce(this.state,this.actionQueue.shift(),this);var n=this.state;this.isReducing=!1,
+!t.loadingLevel&&n.loadingLevel?this.publiclyTrigger("loading",[!0]):t.loadingLevel&&!n.loadingLevel&&this.publiclyTrigger("loading",[!1]);var r=this.component&&this.component.view;(t.eventStore!==n.eventStore||this.needsFullRerender)&&t.eventStore&&(this.isEventsUpdated=!0),(t.dateProfile!==n.dateProfile||this.needsFullRerender)&&(t.dateProfile&&r&&this.publiclyTrigger("datesDestroy",[{view:r,el:r.el}]),this.isDatesUpdated=!0),(t.viewType!==n.viewType||this.needsFullRerender)&&(t.viewType&&r&&this.publiclyTrigger("viewSkeletonDestroy",[{view:r,el:r.el}]),this.isViewUpdated=!0),this.requestRerender()}},e.prototype.reduce=function(e,t,n){return Or(e,t,n)},e.prototype.requestRerender=function(e){void 0===e&&(e=!1),this.needsRerender=!0,this.needsFullRerender=this.needsFullRerender||e,this.delayedRerender()},e.prototype.tryRerender=function(){this.component&&this.needsRerender&&!this.renderingPauseDepth&&!this.isRendering&&this.executeRender()},e.prototype.batchRendering=function(e){this.renderingPauseDepth++,e(),this.renderingPauseDepth--,this.needsRerender&&this.requestRerender()},e.prototype.executeRender=function(){var e=this.needsFullRerender;this.needsRerender=!1,this.needsFullRerender=!1,this.isRendering=!0,this.renderComponent(e),this.isRendering=!1,this.needsRerender&&this.delayedRerender()},e.prototype.renderComponent=function(e){var t=this,n=t.state,r=t.component,i=n.viewType,o=this.viewSpecs[i],a=e&&r?r.view.queryScroll():null;if(!o)throw new Error('View type "'+i+'" is not valid');var s=this.renderableEventStore=n.eventSourceLoadingLevel&&!this.opt("progressiveEventRendering")?this.renderableEventStore:n.eventStore,u=this.buildEventUiSingleBase(o.options),l=this.buildEventUiBySource(n.eventSources),c=this.eventUiBases=this.buildEventUiBases(s.defs,u,l);!e&&r||(r&&(r.freezeHeight(),r.destroy()),r=this.component=new Uo({calendar:this,view:null,dateEnv:this.dateEnv,theme:this.theme,options:this.optionsManager.computed},this.el)),r.receiveProps(ki({},n,{viewSpec:o,dateProfile:n.dateProfile,dateProfileGenerator:this.dateProfileGenerators[i],eventStore:s,eventUiBases:c,dateSelection:n.dateSelection,eventSelection:n.eventSelection,eventDrag:n.eventDrag,eventResize:n.eventResize})),a&&r.view.applyScroll(a,!1),this.isViewUpdated&&(this.isViewUpdated=!1,this.publiclyTrigger("viewSkeletonRender",[{view:r.view,el:r.view.el}])),this.isDatesUpdated&&(this.isDatesUpdated=!1,this.publiclyTrigger("datesRender",[{view:r.view,el:r.view.el}])),this.isEventsUpdated&&(this.isEventsUpdated=!1),this.releaseAfterSizingTriggers()},e.prototype.resetOptions=function(e){var t=this,n=this.pluginSystem.hooks.optionChangeHandlers,r=this.optionsManager.overrides,i={},o={},a={};for(var s in r)n[s]||(i[s]=r[s]);for(var u in e)n[u]?a[u]=e[u]:o[u]=e[u];this.batchRendering(function(){Zn(i,o)?t.processOptions(e,"reset"):t.processOptions(Wn(i,o));for(var r in a)n[r](a[r],t)})},e.prototype.setOptions=function(e){var t=this,n=this.pluginSystem.hooks.optionChangeHandlers,r={},i={};for(var o in e)n[o]?i[o]=e[o]:r[o]=e[o];this.batchRendering(function(){t.processOptions(r);for(var e in i)n[e](i[e],t)})},e.prototype.processOptions=function(e,t){var n=this,r=this.dateEnv,i=!1,o=!1,a=!1;for(var s in e)/^(height|contentHeight|aspectRatio)$/.test(s)?o=!0:/^(defaultDate|defaultView)$/.test(s)||(a=!0,"timeZone"===s&&(i=!0));"reset"===t?(a=!0,this.optionsManager.reset(e)):"dynamic"===t?this.optionsManager.addDynamic(e):this.optionsManager.add(e),a&&(this.handleOptions(this.optionsManager.computed),this.needsFullRerender=!0,this.batchRendering(function(){i&&n.dispatch({type:"CHANGE_TIMEZONE",oldDateEnv:r}),n.dispatch({type:"SET_VIEW_TYPE",viewType:n.state.viewType})})),o&&this.updateSize()},e.prototype.setOption=function(e,t){var n;this.processOptions((n={},n[e]=t,n),"dynamic")},e.prototype.getOption=function(e){return this.optionsManager.computed[e]},e.prototype.opt=function(e){return this.optionsManager.computed[e]},e.prototype.viewOpt=function(e){return this.viewOpts()[e]},e.prototype.viewOpts=function(){return this.viewSpecs[this.state.viewType].options},e.prototype.handleOptions=function(e){var t=this,n=this.pluginSystem.hooks;this.defaultAllDayEventDuration=ue(e.defaultAllDayEventDuration),this.defaultTimedEventDuration=ue(e.defaultTimedEventDuration),this.delayedRerender=this.buildDelayedRerender(e.rerenderDelay),this.theme=this.buildTheme(e);var r=this.parseRawLocales(e.locales);this.availableRawLocales=r.map;var i=this.buildLocale(e.locale||r.defaultCode,r.map);this.dateEnv=this.buildDateEnv(i,e.timeZone,n.namedTimeZonedImpl,e.firstDay,e.weekNumberCalculation,e.weekLabel,n.cmdFormatter),this.selectionConfig=this.buildSelectionConfig(e),this.viewSpecs=Qr(n.views,this.optionsManager),this.dateProfileGenerators=ot(this.viewSpecs,function(e){return new e.class.prototype.dateProfileGeneratorClass(e,t)})},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.availableRawLocales)},e.prototype._buildSelectionConfig=function(e){return Cn("select",e,this)},e.prototype._buildEventUiSingleBase=function(e){return e.editable&&(e=ki({},e,{eventEditable:!0})),Cn("event",e,this)},e.prototype.hasPublicHandlers=function(e){return this.hasHandlers(e)||this.opt(e)},e.prototype.publiclyTrigger=function(e,t){var n=this.opt(e);if(this.triggerWith(e,this,t),n)return n.apply(this,t)},e.prototype.publiclyTriggerAfterSizing=function(e,t){var n=this.afterSizingTriggers;(n[e]||(n[e]=[])).push(t)},e.prototype.releaseAfterSizingTriggers=function(){var e=this.afterSizingTriggers;for(var t in e)for(var n=0,r=e[t];n<r.length;n++){var i=r[n];this.publiclyTrigger(t,i)}this.afterSizingTriggers={}},e.prototype.isValidViewType=function(e){return Boolean(this.viewSpecs[e])},e.prototype.changeView=function(e,t){var n=null;t&&(t.start&&t.end?(this.optionsManager.addDynamic({visibleRange:t}),this.handleOptions(this.optionsManager.computed)):n=this.dateEnv.createMarker(t)),this.unselect(),this.dispatch({type:"SET_VIEW_TYPE",viewType:e,dateMarker:n})},e.prototype.zoomTo=function(e,t){var n;t=t||"day",n=this.viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"SET_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"SET_DATE",dateMarker:e})},e.prototype.getUnitViewSpec=function(e){var t,n,r=this.component,i=[];r.header&&i.push.apply(i,r.header.viewsWithButtons),r.footer&&i.push.apply(i,r.footer.viewsWithButtons);for(var o in this.viewSpecs)i.push(o);for(t=0;t<i.length;t++)if((n=this.viewSpecs[i[t]])&&n.singleUnit===e)return n},e.prototype.getInitialDate=function(){var e=this.opt("defaultDate");return null!=e?this.dateEnv.createMarker(e):this.getNow()},e.prototype.prev=function(){this.unselect(),this.dispatch({type:"PREV"})},e.prototype.next=function(){this.unselect(),this.dispatch({type:"NEXT"})},e.prototype.prevYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,-1)})},e.prototype.nextYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,1)})},e.prototype.today=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.getNow()})},e.prototype.gotoDate=function(e){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.createMarker(e)})},e.prototype.incrementDate=function(e){var t=ue(e);t&&(this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.add(this.state.currentDate,t)}))},e.prototype.getDate=function(){return this.dateEnv.toDate(this.state.currentDate)},e.prototype.formatDate=function(e,t){var n=this.dateEnv;return n.format(n.createMarker(e),Vt(t))},e.prototype.formatRange=function(e,t,n){var r=this.dateEnv;return r.formatRange(r.createMarker(e),r.createMarker(t),Vt(n,this.opt("defaultRangeSeparator")),n)},e.prototype.formatIso=function(e,t){var n=this.dateEnv;return n.formatIso(n.createMarker(e),{omitTime:t})},e.prototype.windowResize=function(e){!this.isHandlingWindowResize&&this.component&&e.target===window&&(this.isHandlingWindowResize=!0,this.updateSize(),this.publiclyTrigger("windowResize",[this.view]),this.isHandlingWindowResize=!1)},e.prototype.updateSize=function(){this.component&&this.component.updateSize(!0)},e.prototype.registerInteractiveComponent=function(e,t){var n=ri(e,t),r=[Vo,Bo],i=r.concat(this.pluginSystem.hooks.componentInteractions),o=i.map(function(e){return new e(n)});this.interactionsStore[e.uid]=o,Ao[e.uid]=n},e.prototype.unregisterInteractiveComponent=function(e){for(var t=0,n=this.interactionsStore[e.uid];t<n.length;t++){n[t].destroy()}delete this.interactionsStore[e.uid],delete Ao[e.uid]},e.prototype.select=function(e,t){var n;n=null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t};var r=Ar(n,this.dateEnv,ue({days:1}));r&&(this.dispatch({type:"SELECT_DATES",selection:r}),this.triggerDateSelect(r))},e.prototype.unselect=function(e){this.state.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),this.triggerDateUnselect(e))},e.prototype.triggerDateSelect=function(e,t){var n=this.buildDateSpanApi(e);n.jsEvent=t?t.origEvent:null,n.view=this.view,this.publiclyTrigger("select",[n])},e.prototype.triggerDateUnselect=function(e){this.publiclyTrigger("unselect",[{jsEvent:e?e.origEvent:null,view:this.view}])},e.prototype.triggerDateClick=function(e,t,n,r){var i=this.buildDatePointApi(e);i.dayEl=t,i.jsEvent=r,i.view=n,this.publiclyTrigger("dateClick",[i])},e.prototype.buildDatePointApi=function(e){for(var t={},n=0,r=this.pluginSystem.hooks.datePointTransforms;n<r.length;n++){var i=r[n];ki(t,i(e,this))}return ki(t,Zr(e,this.dateEnv)),t},e.prototype.buildDateSpanApi=function(e){for(var t={},n=0,r=this.pluginSystem.hooks.dateSpanTransforms;n<r.length;n++){var i=r[n];ki(t,i(e,this))}return ki(t,Wr(e,this.dateEnv)),t},e.prototype.getNow=function(){var e=this.opt("now");return"function"==typeof e&&(e=e()),null==e?this.dateEnv.createNowMarker():this.dateEnv.createMarker(e)},e.prototype.getDefaultEventEnd=function(e,t){var n=t;return e?(n=X(n),n=this.dateEnv.add(n,this.defaultAllDayEventDuration)):n=this.dateEnv.add(n,this.defaultTimedEventDuration),n},e.prototype.addEvent=function(e,t){if(e instanceof Bi){var n=e._def,r=e._instance;return this.state.eventStore.defs[n.defId]||this.dispatch({type:"ADD_EVENTS",eventStore:lt({def:n,instance:r})}),e}var i;if(t instanceof Vi)i=t.internalEventSource.sourceId;else if(null!=t){var o=this.getEventSourceById(t);if(!o)return console.warn('Could not find an event source with ID "'+t+'"'),null;i=o.internalEventSource.sourceId}var a=On(e,i,this);return a?(this.dispatch({type:"ADD_EVENTS",eventStore:lt(a)}),new Bi(this,a.def,a.def.recurringDef?null:a.instance)):null},e.prototype.getEventById=function(e){var t=this.state.eventStore,n=t.defs,r=t.instances;e=String(e);for(var i in n){var o=n[i];if(o.publicId===e){if(o.recurringDef)return new Bi(this,o,null);for(var a in r){var s=r[a];if(s.defId===o.defId)return new Bi(this,o,s)}}}return null},e.prototype.getEvents=function(){var e=this.state.eventStore,t=e.defs,n=e.instances,r=[];for(var i in n){var o=n[i],a=t[o.defId];r.push(new Bi(this,a,o))}return r},e.prototype.removeAllEvents=function(){this.dispatch({type:"REMOVE_ALL_EVENTS"})},e.prototype.rerenderEvents=function(){this.dispatch({type:"RESET_EVENTS"})},e.prototype.getEventSources=function(){var e=this.state.eventSources,t=[];for(var n in e)t.push(new Vi(this,e[n]));return t},e.prototype.getEventSourceById=function(e){var t=this.state.eventSources;e=String(e);for(var n in t)if(t[n].publicId===e)return new Vi(this,t[n]);return null},e.prototype.addEventSource=function(e){if(e instanceof Vi)return this.state.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;var t=mr(e,this);return t?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[t]}),new Vi(this,t)):null},e.prototype.removeAllEventSources=function(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})},e.prototype.refetchEvents=function(){this.dispatch({type:"FETCH_EVENT_SOURCES"})},e.prototype.scrollToTime=function(e){var t=ue(e);t&&this.component.view.scrollToTime(t)},e}();Ki.mixInto(Wo);var Zo=function(e){function n(n,r,i,o){var a=e.call(this,n,t("div",{className:"fc-view fc-"+r.type+"-view"}),!0)||this;return a.renderDatesMem=An(a.renderDatesWrap,a.unrenderDatesWrap),a.renderBusinessHoursMem=An(a.renderBusinessHours,a.unrenderBusinessHours,[a.renderDatesMem]),a.renderDateSelectionMem=An(a.renderDateSelectionWrap,a.unrenderDateSelectionWrap,[a.renderDatesMem]),a.renderEventsMem=An(a.renderEvents,a.unrenderEvents,[a.renderDatesMem]),a.renderEventSelectionMem=An(a.renderEventSelectionWrap,a.unrenderEventSelectionWrap,[a.renderEventsMem]),a.renderEventDragMem=An(a.renderEventDragWrap,a.unrenderEventDragWrap,[a.renderDatesMem]),a.renderEventResizeMem=An(a.renderEventResizeWrap,a.unrenderEventResizeWrap,[a.renderDatesMem]),a.viewSpec=r,a.dateProfileGenerator=i,a.type=r.type,a.eventOrderSpecs=Ue(a.opt("eventOrder")),a.nextDayThreshold=ue(a.opt("nextDayThreshold")),o.appendChild(a.el),a.initialize(),a}return et(n,e),n.prototype.initialize=function(){},Object.defineProperty(n.prototype,"activeStart",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.activeRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"activeEnd",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.activeRange.end)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"currentStart",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.currentRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(n.prototype,"currentEnd",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.currentRange.end)},enumerable:!0,configurable:!0}),n.prototype.render=function(e){this.renderDatesMem(e.dateProfile),this.renderBusinessHoursMem(e.businessHours),this.renderDateSelectionMem(e.dateSelection),this.renderEventsMem(e.eventStore),this.renderEventSelectionMem(e.eventSelection),this.renderEventDragMem(e.eventDrag),this.renderEventResizeMem(e.eventResize)},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderDatesMem.unrender()},n.prototype.updateSize=function(e,t,n){var r=this.calendar;(e||r.isViewUpdated||r.isDatesUpdated||r.isEventsUpdated)&&this.updateBaseSize(e,t,n)},n.prototype.updateBaseSize=function(e,t,n){},n.prototype.renderDatesWrap=function(e){this.renderDates(e),this.addScroll({timeMs:ue(this.opt("scrollTime")).milliseconds}),this.startNowIndicator(e)},n.prototype.unrenderDatesWrap=function(){this.stopNowIndicator(),this.unrenderDates()},n.prototype.renderDates=function(e){},n.prototype.unrenderDates=function(){},n.prototype.renderBusinessHours=function(e){},n.prototype.unrenderBusinessHours=function(){},n.prototype.renderDateSelectionWrap=function(e){e&&this.renderDateSelection(e)},n.prototype.unrenderDateSelectionWrap=function(e){e&&this.unrenderDateSelection(e)},n.prototype.renderDateSelection=function(e){},n.prototype.unrenderDateSelection=function(e){},n.prototype.renderEvents=function(e){},n.prototype.unrenderEvents=function(){},n.prototype.sliceEvents=function(e,t){var n=this.props;return Yt(e,n.eventUiBases,n.dateProfile.activeRange,t?this.nextDayThreshold:null).fg},n.prototype.renderEventSelectionWrap=function(e){e&&this.renderEventSelection(e)},n.prototype.unrenderEventSelectionWrap=function(e){e&&this.unrenderEventSelection(e)},n.prototype.renderEventSelection=function(e){},n.prototype.unrenderEventSelection=function(e){},n.prototype.renderEventDragWrap=function(e){e&&this.renderEventDrag(e)},n.prototype.unrenderEventDragWrap=function(e){e&&this.unrenderEventDrag(e)},n.prototype.renderEventDrag=function(e){},n.prototype.unrenderEventDrag=function(e){},n.prototype.renderEventResizeWrap=function(e){e&&this.renderEventResize(e)},n.prototype.unrenderEventResizeWrap=function(e){e&&this.unrenderEventResize(e)},n.prototype.renderEventResize=function(e){},n.prototype.unrenderEventResize=function(e){},n.prototype.startNowIndicator=function(e){var t,n,r,i=this,o=this.dateEnv;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit(e))&&(n=this.updateNowIndicator.bind(this),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),r=o.add(o.startOf(this.initialNowDate,t),ue(1,t)).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout(function(){i.nowIndicatorTimeoutID=null,n(),r="second"===t?1e3:6e4,i.nowIndicatorIntervalID=setInterval(n,r)},r))},n.prototype.updateNowIndicator=function(){this.props.dateProfile&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(V(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},n.prototype.stopNowIndicator=function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},n.prototype.getNowIndicatorUnit=function(e){},n.prototype.renderNowIndicator=function(e){},n.prototype.unrenderNowIndicator=function(){},n.prototype.addScroll=function(e){var t=this.queuedScroll||(this.queuedScroll={});ki(t,e)},n.prototype.popScroll=function(e){this.applyQueuedScroll(e),this.queuedScroll=null},n.prototype.applyQueuedScroll=function(e){this.applyScroll(this.queuedScroll||{},e)},n.prototype.queryScroll=function(){var e={};return this.props.dateProfile&&ki(e,this.queryDateScroll()),e},n.prototype.applyScroll=function(e,t){var n=e.timeMs;null!=n&&(delete e.timeMs,this.props.dateProfile&&ki(e,this.computeDateScroll(n))),this.props.dateProfile&&this.applyDateScroll(e)},n.prototype.computeDateScroll=function(e){return{}},n.prototype.queryDateScroll=function(){return{}},n.prototype.applyDateScroll=function(e){},n.prototype.scrollToTime=function(e){this.applyScroll({timeMs:e.milliseconds},!1)},n}(ao);Ki.mixInto(Zo),Zo.prototype.usesMinMaxTime=!1,Zo.prototype.dateProfileGeneratorClass=Ho;var jo=function(){function e(e){this.segs=[],this.isSizeDirty=!1,this.context=e}return e.prototype.renderSegs=function(e,t){this.rangeUpdated(),e=this.renderSegEls(e,t),this.segs=e,this.attachSegs(e,t),this.isSizeDirty=!0,this.context.view.triggerRenderedSegs(this.segs,Boolean(t))},e.prototype.unrender=function(e,t){this.context.view.triggerWillRemoveSegs(this.segs,Boolean(t)),this.detachSegs(this.segs),this.segs=[]},e.prototype.rangeUpdated=function(){var e,t,n=this.context.options;this.eventTimeFormat=Vt(n.eventTimeFormat||this.computeEventTimeFormat(),n.defaultRangeSeparator),e=n.displayEventTime,null==e&&(e=this.computeDisplayEventTime()),t=n.displayEventEnd,null==t&&(t=this.computeDisplayEventEnd()),this.displayEventTime=e,this.displayEventEnd=t},e.prototype.renderSegEls=function(e,t){var n,i="";if(e.length){for(n=0;n<e.length;n++)i+=this.renderSegHtml(e[n],t);r(i).forEach(function(t,n){var r=e[n];t&&(r.el=t)}),e=Gt(this.context.view,e,Boolean(t))}return e},e.prototype.getSegClasses=function(e,t,n,r){var i=["fc-event",e.isStart?"fc-start":"fc-not-start",e.isEnd?"fc-end":"fc-not-end"].concat(e.eventRange.ui.classNames);return t&&i.push("fc-draggable"),n&&i.push("fc-resizable"),r&&(i.push("fc-mirror"),r.isDragging&&i.push("fc-dragging"),r.isResizing&&i.push("fc-resizing")),i},e.prototype.getTimeText=function(e,t,n){var r=e.def,i=e.instance;return this._getTimeText(i.range.start,r.hasEnd?i.range.end:null,r.allDay,t,n,i.forcedStartTzo,i.forcedEndTzo)},e.prototype._getTimeText=function(e,t,n,r,i,o,a){var s=this.context.dateEnv;return null==r&&(r=this.eventTimeFormat),null==i&&(i=this.displayEventEnd),this.displayEventTime&&!n?i&&t?s.formatRange(e,t,r,{forcedStartTzo:o,forcedEndTzo:a}):s.format(e,r,{forcedTzo:o}):""},e.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0}},e.prototype.computeDisplayEventTime=function(){return!0},e.prototype.computeDisplayEventEnd=function(){return!0},e.prototype.getSkinCss=function(e){return{"background-color":e.backgroundColor,"border-color":e.borderColor,color:e.textColor}},e.prototype.sortEventSegs=function(e){var t=this.context.view.eventOrderSpecs,n=e.map(ci);return n.sort(function(e,n){return Le(e,n,t)}),n.map(function(e){return e._seg})},e.prototype.computeSizes=function(e){(e||this.isSizeDirty)&&this.computeSegSizes(this.segs)},e.prototype.assignSizes=function(e){(e||this.isSizeDirty)&&(this.assignSegSizes(this.segs),this.isSizeDirty=!1)},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e.prototype.hideByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="hidden")}},e.prototype.showByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="")}},e.prototype.selectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t],i=r.eventRange.instance;i&&i.instanceId===e&&r.el&&r.el.classList.add("fc-selected")}},e.prototype.unselectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];r.el&&r.el.classList.remove("fc-selected")}},e}(),Yo=function(){function e(e){this.fillSegTag="div",this.dirtySizeFlags={},this.context=e,this.containerElsByType={},this.segsByType={}}return e.prototype.getSegsByType=function(e){return this.segsByType[e]||[]},e.prototype.renderSegs=function(e,t){var n,r=this.renderSegEls(e,t),i=this.attachSegs(e,r);i&&(n=this.containerElsByType[e]||(this.containerElsByType[e]=[])).push.apply(n,i),this.segsByType[e]=r,"bgEvent"===e&&this.context.view.triggerRenderedSegs(r,!1),this.dirtySizeFlags[e]=!0},e.prototype.unrender=function(e){var t=this.segsByType[e];t&&("bgEvent"===e&&this.context.view.triggerWillRemoveSegs(t,!1),this.detachSegs(e,t))},e.prototype.renderSegEls=function(e,t){var n,i=this,o="";if(t.length){for(n=0;n<t.length;n++)o+=this.renderSegHtml(e,t[n]);r(o).forEach(function(e,n){var r=t[n];e&&(r.el=e)}),"bgEvent"===e&&(t=Gt(this.context.view,t,!1)),t=t.filter(function(e){return f(e.el,i.fillSegTag)})}return t},e.prototype.renderSegHtml=function(e,t){var n=null,r=[];return"highlight"!==e&&"businessHours"!==e&&(n={"background-color":t.eventRange.ui.backgroundColor}),"highlight"!==e&&(r=r.concat(t.eventRange.ui.classNames)),"businessHours"===e?r.push("fc-bgevent"):r.push("fc-"+e.toLowerCase()),"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(n?' style="'+Tn(n)+'"':"")+"></"+this.fillSegTag+">"},e.prototype.detachSegs=function(e,t){var n=this.containerElsByType[e];n&&(n.forEach(c),delete this.containerElsByType[e])},e.prototype.computeSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.computeSegSizes(this.segsByType[t])},e.prototype.assignSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.assignSegSizes(this.segsByType[t]);this.dirtySizeFlags={}},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e}(),qo=function(){function e(e){this.timeZoneName=e}return e}(),Go=function(){function e(e){this.emitter=new Ki}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),Xo={startTime:ue,duration:ue,create:Boolean,sourceId:String},Jo={create:!0},Ko=function(e){function t(t,r){var i=e.call(this,t)||this;return r.innerHTML="",r.appendChild(i.el=n('<div class="fc-row '+i.theme.getClass("headerRow")+'"><table class="'+i.theme.getClass("tableGrid")+'"><thead></thead></table></div>')),i.thead=i.el.querySelector("thead"),i}return et(t,e),t.prototype.destroy=function(){c(this.el)},t.prototype.render=function(e){var t=e.dates,n=e.datesRepDistinctDays,r=[];e.renderIntroHtml&&r.push(e.renderIntroHtml());for(var i=Vt(this.opt("columnHeaderFormat")||vi(n,t.length)),o=0,a=t;o<a.length;o++){var s=a[o];r.push(gi(s,e.dateProfile,n,t.length,i,this.context))}this.isRtl&&r.reverse(),this.thead.innerHTML="<tr>"+r.join("")+"</tr>"},t}(oo),Qo=function(){function e(e,t){for(var n=e.start,r=e.end,i=[],o=[],a=-1;n<r;)t.isHiddenDay(n)?i.push(a+.5):(a++,i.push(a),o.push(n)),n=A(n,1);this.dates=o,this.indices=i,this.cnt=o.length}return e.prototype.sliceRange=function(e){var t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(A(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return r=Math.ceil(r),i=Math.floor(i),r<=i?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null},e.prototype.getDateDayIndex=function(e){var t=this.indices,n=Math.floor(F(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]},e}(),$o=function(){function e(e,t){var n,r,i,o=e.dates;if(t){for(r=o[0].getUTCDay(),n=1;n<o.length&&o[n].getUTCDay()!==r;n++);i=Math.ceil(o.length/n)}else i=1,n=o.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}return e.prototype.buildCells=function(){for(var e=[],t=0;t<this.rowCnt;t++){for(var n=[],r=0;r<this.colCnt;r++)n.push(this.buildCell(t,r));e.push(n)}return e},e.prototype.buildCell=function(e,t){return{date:this.daySeries.dates[e*this.colCnt+t]}},e.prototype.buildHeaderDates=function(){for(var e=[],t=0;t<this.colCnt;t++)e.push(this.cells[0][t].date);return e},e.prototype.sliceRange=function(e){var t=this.colCnt,n=this.daySeries.sliceRange(e),r=[];if(n)for(var i=n.firstIndex,o=n.lastIndex,a=i;a<=o;){var s=Math.floor(a/t),u=Math.min((s+1)*t,o+1);r.push({row:s,firstCol:a%t,lastCol:(u-1)%t,isStart:n.isStart&&a===i,isEnd:n.isEnd&&u-1===o}),a=u}return r},e}(),ea=function(){function e(){this.sliceBusinessHours=kt(this._sliceBusinessHours),this.sliceDateSelection=kt(this._sliceDateSpan),this.sliceEventStore=kt(this._sliceEventStore),this.sliceEventDrag=kt(this._sliceInteraction),this.sliceEventResize=kt(this._sliceInteraction)}return e.prototype.sliceProps=function(e,t,n,r){for(var i=[],o=4;o<arguments.length;o++)i[o-4]=arguments[o];var a=e.eventUiBases,s=this.sliceEventStore.apply(this,[e.eventStore,a,t,n,r].concat(i));return{dateSelectionSegs:this.sliceDateSelection.apply(this,[e.dateSelection,a,r].concat(i)),businessHourSegs:this.sliceBusinessHours.apply(this,[e.businessHours,t,n,r].concat(i)),fgEventSegs:s.fg,bgEventSegs:s.bg,eventDrag:this.sliceEventDrag.apply(this,[e.eventDrag,a,t,n,r].concat(i)),eventResize:this.sliceEventResize.apply(this,[e.eventResize,a,t,n,r].concat(i)),eventSelection:e.eventSelection}},e.prototype.sliceNowDate=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];return this._sliceDateSpan.apply(this,[{range:{start:e,end:V(e,1)},allDay:!1},{},t].concat(n))},e.prototype._sliceBusinessHours=function(e,t,n,r){for(var i=[],o=4;o<arguments.length;o++)i[o-4]=arguments[o];return e?this._sliceEventStore.apply(this,[ct(e,yi(t,Boolean(n)),r.calendar),{},t,n,r].concat(i)).bg:[]},e.prototype._sliceEventStore=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(e){var s=Yt(e,t,yi(n,Boolean(r)),r);return{bg:this.sliceEventRanges(s.bg,i,o),fg:this.sliceEventRanges(s.fg,i,o)}}return{bg:[],fg:[]}},e.prototype._sliceInteraction=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(!e)return null;var s=Yt(e.mutatedEvents,t,yi(n,Boolean(r)),r);return{segs:this.sliceEventRanges(s.fg,i,o),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent,sourceSeg:e.origSeg}},e.prototype._sliceDateSpan=function(e,t,n){for(var r=[],i=3;i<arguments.length;i++)r[i-3]=arguments[i];if(!e)return[];for(var o=jr(e,t,n.calendar),a=this.sliceRange.apply(this,[e.range].concat(r)),s=0,u=a;s<u.length;s++){var l=u[s];l.component=n,l.eventRange=o}return a},e.prototype.sliceEventRanges=function(e,t,n){for(var r=[],i=0,o=e;i<o.length;i++){var a=o[i];r.push.apply(r,this.sliceEventRange(a,t,n))}return r},e.prototype.sliceEventRange=function(e,t,n){for(var r=this.sliceRange.apply(this,[e.range].concat(n)),i=0,o=r;i<o.length;i++){var a=o[i];a.component=t,a.eventRange=e,a.isStart=e.isStart&&a.isStart,a.isEnd=e.isEnd&&a.isEnd}return r},e}();e.Calendar=Wo,e.Component=oo,e.DateComponent=ao,e.DateEnv=ko,e.DateProfileGenerator=Ho,e.DayHeader=Ko,e.DaySeries=Qo,e.DayTable=$o,e.ElementDragging=Go,e.ElementScrollController=eo,e.EmitterMixin=Ki,e.EventApi=Bi,e.FgEventRenderer=jo,e.FillRenderer=Yo,e.Interaction=Lo,e.Mixin=Ji,e.NamedTimeZoneImpl=qo,e.PositionCache=Qi,e.ScrollComponent=no,e.ScrollController=$i,e.Slicer=ea,e.Splitter=Xi,e.Theme=ro,e.View=Zo,e.WindowScrollController=to,e.addDays=A,e.addDurations=he,e.addMs=V,e.addWeeks=L,e.allowContextMenu=ze,e.allowSelection=xe,e.appendToElement=a,e.applyAll=je,e.applyMutationToEventStore=$t,e.applyStyle=g,e.applyStyleProp=y,e.asRoughMinutes=Se,e.asRoughMs=De,e.asRoughSeconds=be,e.buildGotoAnchorHtml=Yn,e.buildSegCompareObj=ci,e.capitaliseFirstLetter=Be,e.combineEventUis=Mn,e.compareByFieldSpec=Ae,e.compareByFieldSpecs=Le,e.compareNumbers=We,e.compensateScroll=Re,e.computeClippingRect=H,e.computeEdges=C,e.computeFallbackHeaderFormat=vi,e.computeHeightAndMargins=_,e.computeInnerRect=M,e.computeRect=k,e.computeVisibleDayRange=Ke,e.config=Eo,e.constrainPoint=b,e.createDuration=ue,e.createElement=t,e.createEmptyEventStore=vt,e.createEventInstance=Pn,e.createFormatter=Vt,e.createPlugin=$n,e.cssToStr=Tn,e.debounce=qe,e.diffDates=$e,e.diffDayAndTime=Y,e.diffDays=F,e.diffPoints=T,e.diffWeeks=B,e.diffWholeDays=G,e.diffWholeWeeks=q,e.disableCursor=Ce,e.distributeHeight=ke,e.elementClosest=d,e.elementMatches=f,e.enableCursor=Me,e.eventTupleToStore=lt,e.filterEventStoreDefs=yt,e.filterHash=it,e.findChildren=h,e.findElements=p,e.flexibleCompare=Ve,e.forceClassName=v,e.formatDate=di,e.formatIsoTimeString=Ft,e.formatRange=fi,e.freezeRaw=Xe,e.getAllDayHtml=qn,e.getClippingParents=P,e.getDayClasses=Gn,e.getElSeg=Jt,e.getRectCenter=D,e.getRelevantEvents=dt,e.globalDefaults=So,e.greatestDurationDenominator=we,e.hasBgRendering=qt,e.htmlEscape=Dn,e.htmlToElement=n,e.insertAfterElement=u,e.interactionSettingsStore=Ao,e.interactionSettingsToStore=ii,e.intersectRanges=bt,e.intersectRects=E,e.isArraysEqual=Mt,e.isDateSpansEqual=Br,e.isInt=Ze,e.isInteractionValid=dn,e.isMultiDayRange=Qe,e.isObjectsSimilar=Fn,e.isPropsValid=hn,e.isSingleDay=pe,e.isValidDate=ae,e.isValuesSimilar=Vn,e.listenBySelector=N,e.mapHash=ot,e.matchCellWidths=_e,e.memoize=kt,e.memoizeOutput=Ot,e.memoizeRendering=An,e.mergeEventStores=gt,e.multiplyDuration=ge,e.padStart=Fe,e.parseBusinessHours=Un,e.parseDragMeta=hi,e.parseEventDef=_n,e.parseFieldSpecs=Ue,e.parseMarker=gr,e.pointInsideRect=m,e.prependToElement=s,e.preventContextMenu=Ne,e.preventDefault=x,e.preventSelection=He,e.processScopedUiProps=Cn,e.rangeContainsMarker=Rt,e.rangeContainsRange=wt,e.rangesEqual=Dt,e.rangesIntersect=Tt,e.refineProps=Ge,e.removeElement=c,e.removeExact=Ct,e.renderDateCell=gi,e.requestJson=tr,e.sliceEventStore=Yt,e.startOfDay=X,e.subtractInnerElHeight=Pe,e.translateRect=S,e.uncompensateScroll=Ie,e.undistributeHeight=Oe,e.unpromisify=Xn,e.version="4.1.0",e.whenTransitionDone=U,e.wholeDivideDurations=Te,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/core/package.json b/backoffice/vendors/fullcalendar/core/package.json
new file mode 100644 (file)
index 0000000..28e1849
--- /dev/null
@@ -0,0 +1,59 @@
+{
+  "_from": "@fullcalendar/core",
+  "_id": "@fullcalendar/core@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-pyBRbNnppQH5iPnhENrNIkvOxjPdR46o7HMuSx3M+OlGVZLygbb97sKg5XuJx6Bn3hFP0EJXKmA9/GCfeP9PPQ==",
+  "_location": "/@fullcalendar/core",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/core",
+    "name": "@fullcalendar/core",
+    "escapedName": "@fullcalendar%2fcore",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/core/-/core-4.1.0.tgz",
+  "_shasum": "9f09c4c35e308a81a97e4d62c05f64548d0e5666",
+  "_spec": "@fullcalendar/core",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "Provides core functionality, including the Calendar class",
+  "docs": "https://fullcalendar.io/docs/initialize-es6",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/core",
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Core Package",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/daygrid/LICENSE.txt b/backoffice/vendors/fullcalendar/daygrid/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/daygrid/README.md b/backoffice/vendors/fullcalendar/daygrid/README.md
new file mode 100644 (file)
index 0000000..e009365
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Day Grid Plugin
+
+Display events on Month view or DayGrid view
+
+[View the docs &raquo;](https://fullcalendar.io/docs/month-view)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/daygrid/main.css b/backoffice/vendors/fullcalendar/daygrid/main.css
new file mode 100644 (file)
index 0000000..6898f45
--- /dev/null
@@ -0,0 +1,69 @@
+/*!
+FullCalendar Day Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+/* DayGridView
+--------------------------------------------------------------------------------------------------*/
+/* day row structure */
+.fc-dayGridWeek-view .fc-content-skeleton,
+.fc-dayGridDay-view .fc-content-skeleton {
+  /* there may be week numbers in these views, so no padding-top */
+  padding-bottom: 1em;
+  /* ensure a space at bottom of cell for user selecting/clicking */ }
+
+.fc-dayGrid-view .fc-body .fc-row {
+  min-height: 4em;
+  /* ensure that all rows are at least this tall */ }
+
+/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */
+.fc-row.fc-rigid {
+  overflow: hidden; }
+
+.fc-row.fc-rigid .fc-content-skeleton {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0; }
+
+/* week and day number styling */
+.fc-day-top.fc-other-month {
+  opacity: 0.3; }
+
+.fc-dayGrid-view .fc-week-number,
+.fc-dayGrid-view .fc-day-number {
+  padding: 2px; }
+
+.fc-dayGrid-view th.fc-week-number,
+.fc-dayGrid-view th.fc-day-number {
+  padding: 0 2px;
+  /* column headers can't have as much v space */ }
+
+.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number {
+  float: right; }
+
+.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number {
+  float: left; }
+
+.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number {
+  float: left;
+  border-radius: 0 0 3px 0; }
+
+.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number {
+  float: right;
+  border-radius: 0 0 0 3px; }
+
+.fc-dayGrid-view .fc-day-top .fc-week-number {
+  min-width: 1.5em;
+  text-align: center;
+  background-color: #f2f2f2;
+  color: #808080; }
+
+/* when week/day number have own column */
+.fc-dayGrid-view td.fc-week-number {
+  text-align: center; }
+
+.fc-dayGrid-view td.fc-week-number > * {
+  /* work around the way we do column resizing and ensure a minimum width */
+  display: inline-block;
+  min-width: 1.25em; }
diff --git a/backoffice/vendors/fullcalendar/daygrid/main.d.ts b/backoffice/vendors/fullcalendar/daygrid/main.d.ts
new file mode 100644 (file)
index 0000000..88402ba
--- /dev/null
@@ -0,0 +1,351 @@
+declare module "@fullcalendar/daygrid/DayGridDateProfileGenerator" {
+    import { DateProfileGenerator, DateRange } from "@fullcalendar/core";
+    export { DayGridDateProfileGenerator as default, DayGridDateProfileGenerator };
+    class DayGridDateProfileGenerator extends DateProfileGenerator {
+        buildRenderRange(currentRange: any, currentRangeUnit: any, isRangeAllDay: any): DateRange;
+    }
+}
+
+declare module "@fullcalendar/daygrid/Popover" {
+    export interface PopoverOptions {
+        className?: string;
+        content?: (el: HTMLElement) => void;
+        parentEl: HTMLElement;
+        autoHide?: boolean;
+        top?: number;
+        left?: number;
+        right?: number;
+        viewportConstrain?: boolean;
+    }
+    export { Popover as default, Popover };
+    class Popover {
+        isHidden: boolean;
+        options: PopoverOptions;
+        el: HTMLElement;
+        margin: number;
+        constructor(options: PopoverOptions);
+        show(): void;
+        hide(): void;
+        render(): void;
+        documentMousedown: (ev: any) => void;
+        destroy(): void;
+        position(): void;
+        trigger(name: any): void;
+    }
+}
+
+declare module "@fullcalendar/daygrid/SimpleDayGridEventRenderer" {
+    import { FgEventRenderer, Seg } from "@fullcalendar/core";
+    export { SimpleDayGridEventRenderer as default, SimpleDayGridEventRenderer };
+    abstract class SimpleDayGridEventRenderer extends FgEventRenderer {
+        renderSegHtml(seg: Seg, mirrorInfo: any): string;
+        computeEventTimeFormat(): {
+            hour: string;
+            minute: string;
+            omitZeroMinute: boolean;
+            meridiem: string;
+        };
+        computeDisplayEventEnd(): boolean;
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayGridEventRenderer" {
+    import { Seg } from "@fullcalendar/core";
+    import DayGrid from "@fullcalendar/daygrid/DayGrid";
+    import SimpleDayGridEventRenderer from "@fullcalendar/daygrid/SimpleDayGridEventRenderer";
+    export { DayGridEventRenderer as default, DayGridEventRenderer };
+    class DayGridEventRenderer extends SimpleDayGridEventRenderer {
+        dayGrid: DayGrid;
+        rowStructs: any;
+        constructor(dayGrid: DayGrid);
+        attachSegs(segs: Seg[], mirrorInfo: any): void;
+        detachSegs(): void;
+        renderSegRows(segs: Seg[]): any[];
+        renderSegRow(row: any, rowSegs: any): {
+            row: any;
+            tbodyEl: HTMLTableSectionElement;
+            cellMatrix: any[];
+            segMatrix: any[];
+            segLevels: any[];
+            segs: any;
+        };
+        buildSegLevels(segs: Seg[]): any[];
+        groupSegRows(segs: Seg[]): any[];
+        computeDisplayEventEnd(): boolean;
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayGridMirrorRenderer" {
+    import { Seg } from "@fullcalendar/core";
+    import DayGridEventRenderer from "@fullcalendar/daygrid/DayGridEventRenderer";
+    export { DayGridMirrorRenderer as default, DayGridMirrorRenderer };
+    class DayGridMirrorRenderer extends DayGridEventRenderer {
+        attachSegs(segs: Seg[], mirrorInfo: any): void;
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayGridFillRenderer" {
+    import { FillRenderer, Seg } from "@fullcalendar/core";
+    import DayGrid, { DayGridSeg } from "@fullcalendar/daygrid/DayGrid";
+    export { DayGridFillRenderer as default, DayGridFillRenderer };
+    class DayGridFillRenderer extends FillRenderer {
+        fillSegTag: string;
+        dayGrid: DayGrid;
+        constructor(dayGrid: DayGrid);
+        renderSegs(type: string, segs: DayGridSeg[]): void;
+        attachSegs(type: any, segs: Seg[]): any[];
+        renderFillRow(type: any, seg: Seg): HTMLElement;
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayTile" {
+    import { DateComponent, Seg, Hit, DateMarker, ComponentContext, EventInstanceHash } from "@fullcalendar/core";
+    import SimpleDayGridEventRenderer from "@fullcalendar/daygrid/SimpleDayGridEventRenderer";
+    export interface DayTileProps {
+        date: DateMarker;
+        fgSegs: Seg[];
+        eventSelection: string;
+        eventDragInstances: EventInstanceHash;
+        eventResizeInstances: EventInstanceHash;
+    }
+    export { DayTile as default, DayTile };
+    class DayTile extends DateComponent<DayTileProps> {
+        segContainerEl: HTMLElement;
+        private renderFrame;
+        private renderFgEvents;
+        private renderEventSelection;
+        private renderEventDrag;
+        private renderEventResize;
+        constructor(context: ComponentContext, el: HTMLElement);
+        render(props: DayTileProps): void;
+        destroy(): void;
+        _renderFrame(date: DateMarker): void;
+        queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
+    }
+    export class DayTileEventRenderer extends SimpleDayGridEventRenderer {
+        dayTile: DayTile;
+        constructor(dayTile: any);
+        attachSegs(segs: Seg[]): void;
+        detachSegs(segs: Seg[]): void;
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayBgRow" {
+    import { ComponentContext, DateMarker, DateProfile } from "@fullcalendar/core";
+    export interface DayBgCell {
+        date: DateMarker;
+        htmlAttrs?: string;
+    }
+    export interface DayBgRowProps {
+        cells: DayBgCell[];
+        dateProfile: DateProfile;
+        renderIntroHtml?: () => string;
+    }
+    export { DayBgRow as default, DayBgRow };
+    class DayBgRow {
+        context: ComponentContext;
+        constructor(context: ComponentContext);
+        renderHtml(props: DayBgRowProps): string;
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayGrid" {
+    import { PositionCache, DateMarker, DateComponent, EventSegUiInteractionState, Seg, DateProfile } from "@fullcalendar/core";
+    import Popover from "@fullcalendar/daygrid/Popover";
+    import DayGridEventRenderer from "@fullcalendar/daygrid/DayGridEventRenderer";
+    import DayTile from "@fullcalendar/daygrid/DayTile";
+    export interface RenderProps {
+        renderNumberIntroHtml: (row: number, dayGrid: DayGrid) => string;
+        renderBgIntroHtml: () => string;
+        renderIntroHtml: () => string;
+        colWeekNumbersVisible: boolean;
+        cellWeekNumbersVisible: boolean;
+    }
+    export interface DayGridSeg extends Seg {
+        row: number;
+        firstCol: number;
+        lastCol: number;
+    }
+    export interface DayGridCell {
+        date: DateMarker;
+        htmlAttrs?: string;
+    }
+    export interface DayGridProps {
+        dateProfile: DateProfile;
+        cells: DayGridCell[][];
+        businessHourSegs: DayGridSeg[];
+        bgEventSegs: DayGridSeg[];
+        fgEventSegs: DayGridSeg[];
+        dateSelectionSegs: DayGridSeg[];
+        eventSelection: string;
+        eventDrag: EventSegUiInteractionState | null;
+        eventResize: EventSegUiInteractionState | null;
+        isRigid: boolean;
+    }
+    export { DayGrid as default, DayGrid };
+    class DayGrid extends DateComponent<DayGridProps> {
+        eventRenderer: DayGridEventRenderer;
+        renderProps: RenderProps;
+        rowCnt: number;
+        colCnt: number;
+        bottomCoordPadding: number;
+        rowEls: HTMLElement[];
+        cellEls: HTMLElement[];
+        isCellSizesDirty: boolean;
+        rowPositions: PositionCache;
+        colPositions: PositionCache;
+        segPopover: Popover;
+        segPopoverTile: DayTile;
+        private renderCells;
+        private renderBusinessHours;
+        private renderDateSelection;
+        private renderBgEvents;
+        private renderFgEvents;
+        private renderEventSelection;
+        private renderEventDrag;
+        private renderEventResize;
+        constructor(context: any, el: any, renderProps: RenderProps);
+        render(props: DayGridProps): void;
+        destroy(): void;
+        getCellRange(row: any, col: any): {
+            start: Date;
+            end: Date;
+        };
+        updateSegPopoverTile(date?: any, segs?: any): void;
+        _renderCells(cells: DayGridCell[][], isRigid: boolean): void;
+        _unrenderCells(): void;
+        renderDayRowHtml(row: any, isRigid: any): string;
+        getIsNumbersVisible(): boolean;
+        getIsDayNumbersVisible(): boolean;
+        renderNumberTrHtml(row: number): string;
+        renderNumberCellsHtml(row: any): string;
+        renderNumberCellHtml(date: any): string;
+        updateSize(isResize: boolean): void;
+        buildPositionCaches(): void;
+        buildColPositions(): void;
+        buildRowPositions(): void;
+        positionToHit(leftPosition: any, topPosition: any): {
+            row: any;
+            col: any;
+            dateSpan: {
+                range: {
+                    start: Date;
+                    end: Date;
+                };
+                allDay: boolean;
+            };
+            dayEl: HTMLElement;
+            relativeRect: {
+                left: any;
+                right: any;
+                top: any;
+                bottom: any;
+            };
+        };
+        getCellEl(row: any, col: any): HTMLElement;
+        _renderEventDrag(state: EventSegUiInteractionState): void;
+        _unrenderEventDrag(state: EventSegUiInteractionState): void;
+        _renderEventResize(state: EventSegUiInteractionState): void;
+        _unrenderEventResize(state: EventSegUiInteractionState): void;
+        removeSegPopover(): void;
+        limitRows(levelLimit: any): void;
+        computeRowLevelLimit(row: any): (number | false);
+        limitRow(row: any, levelLimit: any): void;
+        unlimitRow(row: any): void;
+        renderMoreLink(row: any, col: any, hiddenSegs: any): HTMLElement;
+        showSegPopover(row: any, col: any, moreLink: HTMLElement, segs: any): void;
+        resliceDaySegs(segs: any, dayDate: any): any[];
+        getMoreLinkText(num: any): any;
+        getCellSegs(row: any, col: any, startLevel?: any): any[];
+    }
+}
+
+declare module "@fullcalendar/daygrid/AbstractDayGridView" {
+    import { ScrollComponent, View, ComponentContext, ViewSpec, DateProfileGenerator } from "@fullcalendar/core";
+    import DayGrid from "@fullcalendar/daygrid/DayGrid";
+    export { DayGridView as default, DayGridView };
+    abstract class DayGridView extends View {
+        scroller: ScrollComponent;
+        dayGrid: DayGrid;
+        colWeekNumbersVisible: boolean;
+        weekNumberWidth: number;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        renderSkeletonHtml(): string;
+        weekNumberStyleAttr(): string;
+        hasRigidRows(): boolean;
+        updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
+        updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
+        computeScrollerHeight(viewHeight: any): number;
+        setGridHeight(height: any, isAuto: any): void;
+        computeDateScroll(timeMs: number): {
+            top: number;
+        };
+        queryDateScroll(): {
+            top: number;
+        };
+        applyDateScroll(scroll: any): void;
+        renderHeadIntroHtml: () => string;
+        renderDayGridNumberIntroHtml: (row: number, dayGrid: DayGrid) => string;
+        renderDayGridBgIntroHtml: () => string;
+        renderDayGridIntroHtml: () => string;
+    }
+}
+
+declare module "@fullcalendar/daygrid/SimpleDayGrid" {
+    import { DateProfile, EventStore, EventUiHash, DateSpan, EventInteractionState, DayTable, Duration, DateComponent, DateRange, Slicer, Hit, ComponentContext } from "@fullcalendar/core";
+    import { default as DayGrid, DayGridSeg } from "@fullcalendar/daygrid/DayGrid";
+    export interface SimpleDayGridProps {
+        dateProfile: DateProfile | null;
+        dayTable: DayTable;
+        nextDayThreshold: Duration;
+        businessHours: EventStore;
+        eventStore: EventStore;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+        isRigid: boolean;
+    }
+    export { SimpleDayGrid as default, SimpleDayGrid };
+    class SimpleDayGrid extends DateComponent<SimpleDayGridProps> {
+        dayGrid: DayGrid;
+        private slicer;
+        constructor(context: ComponentContext, dayGrid: DayGrid);
+        destroy(): void;
+        render(props: SimpleDayGridProps): void;
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number): Hit;
+    }
+    export class DayGridSlicer extends Slicer<DayGridSeg, [DayTable]> {
+        sliceRange(dateRange: DateRange, dayTable: DayTable): DayGridSeg[];
+    }
+}
+
+declare module "@fullcalendar/daygrid/DayGridView" {
+    import { DayHeader, ComponentContext, ViewSpec, DateProfileGenerator, DateProfile, ViewProps, DayTable } from "@fullcalendar/core";
+    import AbstractDayGridView from "@fullcalendar/daygrid/AbstractDayGridView";
+    import SimpleDayGrid from "@fullcalendar/daygrid/SimpleDayGrid";
+    export { DayGridView as default, DayGridView };
+    class DayGridView extends AbstractDayGridView {
+        header: DayHeader;
+        simpleDayGrid: SimpleDayGrid;
+        dayTable: DayTable;
+        private buildDayTable;
+        constructor(_context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: ViewProps): void;
+    }
+    export function buildDayTable(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): DayTable;
+}
+
+declare module "@fullcalendar/daygrid" {
+    export { default as SimpleDayGrid, DayGridSlicer } from "@fullcalendar/daygrid/SimpleDayGrid";
+    export { default as DayGrid, DayGridSeg } from "@fullcalendar/daygrid/DayGrid";
+    export { default as AbstractDayGridView } from "@fullcalendar/daygrid/AbstractDayGridView";
+    export { default as DayGridView, buildDayTable as buildBasicDayTable } from "@fullcalendar/daygrid/DayGridView";
+    export { default as DayBgRow } from "@fullcalendar/daygrid/DayBgRow";
+    const _default_6: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_6;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/daygrid/main.js b/backoffice/vendors/fullcalendar/daygrid/main.js
new file mode 100644 (file)
index 0000000..debf219
--- /dev/null
@@ -0,0 +1,1639 @@
+/*!
+FullCalendar Day Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar));
+}(this, function (exports, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    var DayGridDateProfileGenerator = /** @class */ (function (_super) {
+        __extends(DayGridDateProfileGenerator, _super);
+        function DayGridDateProfileGenerator() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        // Computes the date range that will be rendered.
+        DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
+            var dateEnv = this.dateEnv;
+            var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
+            var start = renderRange.start;
+            var end = renderRange.end;
+            var endOfWeek;
+            // year and month views should be aligned with weeks. this is already done for week
+            if (/^(year|month)$/.test(currentRangeUnit)) {
+                start = dateEnv.startOfWeek(start);
+                // make end-of-week if not already
+                endOfWeek = dateEnv.startOfWeek(end);
+                if (endOfWeek.valueOf() !== end.valueOf()) {
+                    end = core.addWeeks(endOfWeek, 1);
+                }
+            }
+            // ensure 6 weeks
+            if (this.options.monthMode &&
+                this.options.fixedWeekCount) {
+                var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
+                core.diffWeeks(start, end));
+                end = core.addWeeks(end, 6 - rowCnt);
+            }
+            return { start: start, end: end };
+        };
+        return DayGridDateProfileGenerator;
+    }(core.DateProfileGenerator));
+
+    /* A rectangular panel that is absolutely positioned over other content
+    ------------------------------------------------------------------------------------------------------------------------
+    Options:
+      - className (string)
+      - content (HTML string, element, or element array)
+      - parentEl
+      - top
+      - left
+      - right (the x coord of where the right edge should be. not a "CSS" right)
+      - autoHide (boolean)
+      - show (callback)
+      - hide (callback)
+    */
+    var Popover = /** @class */ (function () {
+        function Popover(options) {
+            var _this = this;
+            this.isHidden = true;
+            this.margin = 10; // the space required between the popover and the edges of the scroll container
+            // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
+            this.documentMousedown = function (ev) {
+                // only hide the popover if the click happened outside the popover
+                if (_this.el && !_this.el.contains(ev.target)) {
+                    _this.hide();
+                }
+            };
+            this.options = options;
+        }
+        // Shows the popover on the specified position. Renders it if not already
+        Popover.prototype.show = function () {
+            if (this.isHidden) {
+                if (!this.el) {
+                    this.render();
+                }
+                this.el.style.display = '';
+                this.position();
+                this.isHidden = false;
+                this.trigger('show');
+            }
+        };
+        // Hides the popover, through CSS, but does not remove it from the DOM
+        Popover.prototype.hide = function () {
+            if (!this.isHidden) {
+                this.el.style.display = 'none';
+                this.isHidden = true;
+                this.trigger('hide');
+            }
+        };
+        // Creates `this.el` and renders content inside of it
+        Popover.prototype.render = function () {
+            var _this = this;
+            var options = this.options;
+            var el = this.el = core.createElement('div', {
+                className: 'fc-popover ' + (options.className || ''),
+                style: {
+                    top: '0',
+                    left: '0'
+                }
+            });
+            if (typeof options.content === 'function') {
+                options.content(el);
+            }
+            options.parentEl.appendChild(el);
+            // when a click happens on anything inside with a 'fc-close' className, hide the popover
+            core.listenBySelector(el, 'click', '.fc-close', function (ev) {
+                _this.hide();
+            });
+            if (options.autoHide) {
+                document.addEventListener('mousedown', this.documentMousedown);
+            }
+        };
+        // Hides and unregisters any handlers
+        Popover.prototype.destroy = function () {
+            this.hide();
+            if (this.el) {
+                core.removeElement(this.el);
+                this.el = null;
+            }
+            document.removeEventListener('mousedown', this.documentMousedown);
+        };
+        // Positions the popover optimally, using the top/left/right options
+        Popover.prototype.position = function () {
+            var options = this.options;
+            var el = this.el;
+            var elDims = el.getBoundingClientRect(); // only used for width,height
+            var origin = core.computeRect(el.offsetParent);
+            var clippingRect = core.computeClippingRect(options.parentEl);
+            var top; // the "position" (not "offset") values for the popover
+            var left; //
+            // compute top and left
+            top = options.top || 0;
+            if (options.left !== undefined) {
+                left = options.left;
+            }
+            else if (options.right !== undefined) {
+                left = options.right - elDims.width; // derive the left value from the right value
+            }
+            else {
+                left = 0;
+            }
+            // constrain to the view port. if constrained by two edges, give precedence to top/left
+            top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
+            top = Math.max(top, clippingRect.top + this.margin);
+            left = Math.min(left, clippingRect.right - elDims.width - this.margin);
+            left = Math.max(left, clippingRect.left + this.margin);
+            core.applyStyle(el, {
+                top: top - origin.top,
+                left: left - origin.left
+            });
+        };
+        // Triggers a callback. Calls a function in the option hash of the same name.
+        // Arguments beyond the first `name` are forwarded on.
+        // TODO: better code reuse for this. Repeat code
+        // can kill this???
+        Popover.prototype.trigger = function (name) {
+            if (this.options[name]) {
+                this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
+            }
+        };
+        return Popover;
+    }());
+
+    /* Event-rendering methods for the DayGrid class
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // "Simple" is bad a name. has nothing to do with SimpleDayGrid
+    var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
+        __extends(SimpleDayGridEventRenderer, _super);
+        function SimpleDayGridEventRenderer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        // Builds the HTML to be used for the default element for an individual segment
+        SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
+            var options = this.context.options;
+            var eventRange = seg.eventRange;
+            var eventDef = eventRange.def;
+            var eventUi = eventRange.ui;
+            var allDay = eventDef.allDay;
+            var isDraggable = eventUi.startEditable;
+            var isResizableFromStart = allDay && seg.isStart && eventUi.durationEditable && options.eventResizableFromStart;
+            var isResizableFromEnd = allDay && seg.isEnd && eventUi.durationEditable;
+            var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
+            var skinCss = core.cssToStr(this.getSkinCss(eventUi));
+            var timeHtml = '';
+            var timeText;
+            var titleHtml;
+            classes.unshift('fc-day-grid-event', 'fc-h-event');
+            // Only display a timed events time if it is the starting segment
+            if (seg.isStart) {
+                timeText = this.getTimeText(eventRange);
+                if (timeText) {
+                    timeHtml = '<span class="fc-time">' + core.htmlEscape(timeText) + '</span>';
+                }
+            }
+            titleHtml =
+                '<span class="fc-title">' +
+                    (core.htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
+                    '</span>';
+            return '<a class="' + classes.join(' ') + '"' +
+                (eventDef.url ?
+                    ' href="' + core.htmlEscape(eventDef.url) + '"' :
+                    '') +
+                (skinCss ?
+                    ' style="' + skinCss + '"' :
+                    '') +
+                '>' +
+                '<div class="fc-content">' +
+                (options.dir === 'rtl' ?
+                    titleHtml + ' ' + timeHtml : // put a natural space in between
+                    timeHtml + ' ' + titleHtml //
+                ) +
+                '</div>' +
+                (isResizableFromStart ?
+                    '<div class="fc-resizer fc-start-resizer"></div>' :
+                    '') +
+                (isResizableFromEnd ?
+                    '<div class="fc-resizer fc-end-resizer"></div>' :
+                    '') +
+                '</a>';
+        };
+        // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
+        SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
+            return {
+                hour: 'numeric',
+                minute: '2-digit',
+                omitZeroMinute: true,
+                meridiem: 'narrow'
+            };
+        };
+        SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
+            return false; // TODO: somehow consider the originating DayGrid's column count
+        };
+        return SimpleDayGridEventRenderer;
+    }(core.FgEventRenderer));
+
+    /* Event-rendering methods for the DayGrid class
+    ----------------------------------------------------------------------------------------------------------------------*/
+    var DayGridEventRenderer = /** @class */ (function (_super) {
+        __extends(DayGridEventRenderer, _super);
+        function DayGridEventRenderer(dayGrid) {
+            var _this = _super.call(this, dayGrid.context) || this;
+            _this.dayGrid = dayGrid;
+            return _this;
+        }
+        // Renders the given foreground event segments onto the grid
+        DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
+            var rowStructs = this.rowStructs = this.renderSegRows(segs);
+            // append to each row's content skeleton
+            this.dayGrid.rowEls.forEach(function (rowNode, i) {
+                rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
+            });
+            // removes the "more.." events popover
+            if (!mirrorInfo) {
+                this.dayGrid.removeSegPopover();
+            }
+        };
+        // Unrenders all currently rendered foreground event segments
+        DayGridEventRenderer.prototype.detachSegs = function () {
+            var rowStructs = this.rowStructs || [];
+            var rowStruct;
+            while ((rowStruct = rowStructs.pop())) {
+                core.removeElement(rowStruct.tbodyEl);
+            }
+            this.rowStructs = null;
+        };
+        // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
+        // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
+        // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
+        DayGridEventRenderer.prototype.renderSegRows = function (segs) {
+            var rowStructs = [];
+            var segRows;
+            var row;
+            segRows = this.groupSegRows(segs); // group into nested arrays
+            // iterate each row of segment groupings
+            for (row = 0; row < segRows.length; row++) {
+                rowStructs.push(this.renderSegRow(row, segRows[row]));
+            }
+            return rowStructs;
+        };
+        // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
+        // the segments. Returns object with a bunch of internal data about how the render was calculated.
+        // NOTE: modifies rowSegs
+        DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
+            var dayGrid = this.dayGrid;
+            var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
+            var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
+            var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
+            var tbody = document.createElement('tbody');
+            var segMatrix = []; // lookup for which segments are rendered into which level+col cells
+            var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
+            var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
+            var i;
+            var levelSegs;
+            var col;
+            var tr;
+            var j;
+            var seg;
+            var td;
+            // populates empty cells from the current column (`col`) to `endCol`
+            function emptyCellsUntil(endCol) {
+                while (col < endCol) {
+                    // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
+                    td = (loneCellMatrix[i - 1] || [])[col];
+                    if (td) {
+                        td.rowSpan = (td.rowSpan || 1) + 1;
+                    }
+                    else {
+                        td = document.createElement('td');
+                        tr.appendChild(td);
+                    }
+                    cellMatrix[i][col] = td;
+                    loneCellMatrix[i][col] = td;
+                    col++;
+                }
+            }
+            for (i = 0; i < levelCnt; i++) { // iterate through all levels
+                levelSegs = segLevels[i];
+                col = 0;
+                tr = document.createElement('tr');
+                segMatrix.push([]);
+                cellMatrix.push([]);
+                loneCellMatrix.push([]);
+                // levelCnt might be 1 even though there are no actual levels. protect against this.
+                // this single empty row is useful for styling.
+                if (levelSegs) {
+                    for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
+                        seg = levelSegs[j];
+                        var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
+                        var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
+                        emptyCellsUntil(leftCol);
+                        // create a container that occupies or more columns. append the event element.
+                        td = core.createElement('td', { className: 'fc-event-container' }, seg.el);
+                        if (leftCol !== rightCol) {
+                            td.colSpan = rightCol - leftCol + 1;
+                        }
+                        else { // a single-column segment
+                            loneCellMatrix[i][col] = td;
+                        }
+                        while (col <= rightCol) {
+                            cellMatrix[i][col] = td;
+                            segMatrix[i][col] = seg;
+                            col++;
+                        }
+                        tr.appendChild(td);
+                    }
+                }
+                emptyCellsUntil(colCnt); // finish off the row
+                var introHtml = dayGrid.renderProps.renderIntroHtml();
+                if (introHtml) {
+                    if (dayGrid.isRtl) {
+                        core.appendToElement(tr, introHtml);
+                    }
+                    else {
+                        core.prependToElement(tr, introHtml);
+                    }
+                }
+                tbody.appendChild(tr);
+            }
+            return {
+                row: row,
+                tbodyEl: tbody,
+                cellMatrix: cellMatrix,
+                segMatrix: segMatrix,
+                segLevels: segLevels,
+                segs: rowSegs
+            };
+        };
+        // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
+        // NOTE: modifies segs
+        DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
+            var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt;
+            var levels = [];
+            var i;
+            var seg;
+            var j;
+            // Give preference to elements with certain criteria, so they have
+            // a chance to be closer to the top.
+            segs = this.sortEventSegs(segs);
+            for (i = 0; i < segs.length; i++) {
+                seg = segs[i];
+                // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
+                for (j = 0; j < levels.length; j++) {
+                    if (!isDaySegCollision(seg, levels[j])) {
+                        break;
+                    }
+                }
+                // `j` now holds the desired subrow index
+                seg.level = j;
+                seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
+                seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
+                ;
+                (levels[j] || (levels[j] = [])).push(seg);
+            }
+            // order segments left-to-right. very important if calendar is RTL
+            for (j = 0; j < levels.length; j++) {
+                levels[j].sort(compareDaySegCols);
+            }
+            return levels;
+        };
+        // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
+        DayGridEventRenderer.prototype.groupSegRows = function (segs) {
+            var segRows = [];
+            var i;
+            for (i = 0; i < this.dayGrid.rowCnt; i++) {
+                segRows.push([]);
+            }
+            for (i = 0; i < segs.length; i++) {
+                segRows[segs[i].row].push(segs[i]);
+            }
+            return segRows;
+        };
+        // Computes a default `displayEventEnd` value if one is not expliclty defined
+        DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
+            return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
+        };
+        return DayGridEventRenderer;
+    }(SimpleDayGridEventRenderer));
+    // Computes whether two segments' columns collide. They are assumed to be in the same row.
+    function isDaySegCollision(seg, otherSegs) {
+        var i;
+        var otherSeg;
+        for (i = 0; i < otherSegs.length; i++) {
+            otherSeg = otherSegs[i];
+            if (otherSeg.firstCol <= seg.lastCol &&
+                otherSeg.lastCol >= seg.firstCol) {
+                return true;
+            }
+        }
+        return false;
+    }
+    // A cmp function for determining the leftmost event
+    function compareDaySegCols(a, b) {
+        return a.leftCol - b.leftCol;
+    }
+
+    var DayGridMirrorRenderer = /** @class */ (function (_super) {
+        __extends(DayGridMirrorRenderer, _super);
+        function DayGridMirrorRenderer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
+            var sourceSeg = mirrorInfo.sourceSeg;
+            var rowStructs = this.rowStructs = this.renderSegRows(segs);
+            // inject each new event skeleton into each associated row
+            this.dayGrid.rowEls.forEach(function (rowNode, row) {
+                var skeletonEl = core.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
+                var skeletonTopEl;
+                var skeletonTop;
+                // If there is an original segment, match the top position. Otherwise, put it at the row's top level
+                if (sourceSeg && sourceSeg.row === row) {
+                    skeletonTopEl = sourceSeg.el;
+                }
+                else {
+                    skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
+                    if (!skeletonTopEl) { // when no events
+                        skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
+                    }
+                }
+                skeletonTop = skeletonTopEl.getBoundingClientRect().top -
+                    rowNode.getBoundingClientRect().top; // the offsetParent origin
+                skeletonEl.style.top = skeletonTop + 'px';
+                skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
+                rowNode.appendChild(skeletonEl);
+            });
+        };
+        return DayGridMirrorRenderer;
+    }(DayGridEventRenderer));
+
+    var DayGridFillRenderer = /** @class */ (function (_super) {
+        __extends(DayGridFillRenderer, _super);
+        function DayGridFillRenderer(dayGrid) {
+            var _this = _super.call(this, dayGrid.context) || this;
+            _this.fillSegTag = 'td'; // override the default tag name
+            _this.dayGrid = dayGrid;
+            return _this;
+        }
+        DayGridFillRenderer.prototype.renderSegs = function (type, segs) {
+            // don't render timed background events
+            if (type === 'bgEvent') {
+                segs = segs.filter(function (seg) {
+                    return seg.eventRange.def.allDay;
+                });
+            }
+            _super.prototype.renderSegs.call(this, type, segs);
+        };
+        DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
+            var els = [];
+            var i;
+            var seg;
+            var skeletonEl;
+            for (i = 0; i < segs.length; i++) {
+                seg = segs[i];
+                skeletonEl = this.renderFillRow(type, seg);
+                this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
+                els.push(skeletonEl);
+            }
+            return els;
+        };
+        // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
+        DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
+            var dayGrid = this.dayGrid;
+            var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
+            var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
+            var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
+            var startCol = leftCol;
+            var endCol = rightCol + 1;
+            var className;
+            var skeletonEl;
+            var trEl;
+            if (type === 'businessHours') {
+                className = 'bgevent';
+            }
+            else {
+                className = type.toLowerCase();
+            }
+            skeletonEl = core.htmlToElement('<div class="fc-' + className + '-skeleton">' +
+                '<table><tr></tr></table>' +
+                '</div>');
+            trEl = skeletonEl.getElementsByTagName('tr')[0];
+            if (startCol > 0) {
+                core.appendToElement(trEl, 
+                // will create (startCol + 1) td's
+                new Array(startCol + 1).join('<td></td>'));
+            }
+            seg.el.colSpan = endCol - startCol;
+            trEl.appendChild(seg.el);
+            if (endCol < colCnt) {
+                core.appendToElement(trEl, 
+                // will create (colCnt - endCol) td's
+                new Array(colCnt - endCol + 1).join('<td></td>'));
+            }
+            var introHtml = dayGrid.renderProps.renderIntroHtml();
+            if (introHtml) {
+                if (dayGrid.isRtl) {
+                    core.appendToElement(trEl, introHtml);
+                }
+                else {
+                    core.prependToElement(trEl, introHtml);
+                }
+            }
+            return skeletonEl;
+        };
+        return DayGridFillRenderer;
+    }(core.FillRenderer));
+
+    var DayTile = /** @class */ (function (_super) {
+        __extends(DayTile, _super);
+        function DayTile(context, el) {
+            var _this = _super.call(this, context, el) || this;
+            var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
+            var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame);
+            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
+            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
+            _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
+            _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.el,
+                useEventCenter: false
+            });
+            return _this;
+        }
+        DayTile.prototype.render = function (props) {
+            this.renderFrame(props.date);
+            this.renderFgEvents(props.fgSegs);
+            this.renderEventSelection(props.eventSelection);
+            this.renderEventDrag(props.eventDragInstances);
+            this.renderEventResize(props.eventResizeInstances);
+        };
+        DayTile.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.renderFrame.unrender(); // should unrender everything else
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        DayTile.prototype._renderFrame = function (date) {
+            var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
+            var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache
+            );
+            this.el.innerHTML =
+                '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
+                    '<span class="fc-title">' +
+                    core.htmlEscape(title) +
+                    '</span>' +
+                    '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
+                    '</div>' +
+                    '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
+                    '<div class="fc-event-container"></div>' +
+                    '</div>';
+            this.segContainerEl = this.el.querySelector('.fc-event-container');
+        };
+        DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
+            var date = this.props.date; // HACK
+            if (positionLeft < elWidth && positionTop < elHeight) {
+                return {
+                    component: this,
+                    dateSpan: {
+                        allDay: true,
+                        range: { start: date, end: core.addDays(date, 1) }
+                    },
+                    dayEl: this.el,
+                    rect: {
+                        left: 0,
+                        top: 0,
+                        right: elWidth,
+                        bottom: elHeight
+                    },
+                    layer: 1
+                };
+            }
+        };
+        return DayTile;
+    }(core.DateComponent));
+    var DayTileEventRenderer = /** @class */ (function (_super) {
+        __extends(DayTileEventRenderer, _super);
+        function DayTileEventRenderer(dayTile) {
+            var _this = _super.call(this, dayTile.context) || this;
+            _this.dayTile = dayTile;
+            return _this;
+        }
+        DayTileEventRenderer.prototype.attachSegs = function (segs) {
+            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                var seg = segs_1[_i];
+                this.dayTile.segContainerEl.appendChild(seg.el);
+            }
+        };
+        DayTileEventRenderer.prototype.detachSegs = function (segs) {
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                core.removeElement(seg.el);
+            }
+        };
+        return DayTileEventRenderer;
+    }(SimpleDayGridEventRenderer));
+
+    var DayBgRow = /** @class */ (function () {
+        function DayBgRow(context) {
+            this.context = context;
+        }
+        DayBgRow.prototype.renderHtml = function (props) {
+            var parts = [];
+            if (props.renderIntroHtml) {
+                parts.push(props.renderIntroHtml());
+            }
+            for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
+                var cell = _a[_i];
+                parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
+            }
+            if (!props.cells.length) {
+                parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
+            }
+            if (this.context.options.dir === 'rtl') {
+                parts.reverse();
+            }
+            return '<tr>' + parts.join('') + '</tr>';
+        };
+        return DayBgRow;
+    }());
+    function renderCellHtml(date, dateProfile, context, otherAttrs) {
+        var dateEnv = context.dateEnv, theme = context.theme;
+        var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
+        var classes = core.getDayClasses(date, dateProfile, context);
+        classes.unshift('fc-day', theme.getClass('widgetContent'));
+        return '<td class="' + classes.join(' ') + '"' +
+            (isDateValid ?
+                ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
+                '') +
+            (otherAttrs ?
+                ' ' + otherAttrs :
+                '') +
+            '></td>';
+    }
+
+    var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' });
+    var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' });
+    var DayGrid = /** @class */ (function (_super) {
+        __extends(DayGrid, _super);
+        function DayGrid(context, el, renderProps) {
+            var _this = _super.call(this, context, el) || this;
+            _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
+            _this.isCellSizesDirty = false;
+            var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
+            var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
+            _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
+            var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells);
+            _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
+            _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
+            _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
+            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
+            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
+            _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
+            _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
+            _this.renderProps = renderProps;
+            return _this;
+        }
+        DayGrid.prototype.render = function (props) {
+            var cells = props.cells;
+            this.rowCnt = cells.length;
+            this.colCnt = cells[0].length;
+            this.renderCells(cells, props.isRigid);
+            this.renderBusinessHours(props.businessHourSegs);
+            this.renderDateSelection(props.dateSelectionSegs);
+            this.renderBgEvents(props.bgEventSegs);
+            this.renderFgEvents(props.fgEventSegs);
+            this.renderEventSelection(props.eventSelection);
+            this.renderEventDrag(props.eventDrag);
+            this.renderEventResize(props.eventResize);
+            if (this.segPopoverTile) {
+                this.updateSegPopoverTile();
+            }
+        };
+        DayGrid.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.renderCells.unrender(); // will unrender everything else
+        };
+        DayGrid.prototype.getCellRange = function (row, col) {
+            var start = this.props.cells[row][col].date;
+            var end = core.addDays(start, 1);
+            return { start: start, end: end };
+        };
+        DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
+            var ownProps = this.props;
+            this.segPopoverTile.receiveProps({
+                date: date || this.segPopoverTile.props.date,
+                fgSegs: segs || this.segPopoverTile.props.fgSegs,
+                eventSelection: ownProps.eventSelection,
+                eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
+                eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
+            });
+        };
+        /* Date Rendering
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype._renderCells = function (cells, isRigid) {
+            var _a = this, view = _a.view, dateEnv = _a.dateEnv;
+            var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
+            var html = '';
+            var row;
+            var col;
+            for (row = 0; row < rowCnt; row++) {
+                html += this.renderDayRowHtml(row, isRigid);
+            }
+            this.el.innerHTML = html;
+            this.rowEls = core.findElements(this.el, '.fc-row');
+            this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
+            if (this.isRtl) {
+                this.cellEls.reverse();
+            }
+            this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical
+            );
+            this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
+            true, false // horizontal
+            );
+            // trigger dayRender with each cell's element
+            for (row = 0; row < rowCnt; row++) {
+                for (col = 0; col < colCnt; col++) {
+                    this.publiclyTrigger('dayRender', [
+                        {
+                            date: dateEnv.toDate(cells[row][col].date),
+                            el: this.getCellEl(row, col),
+                            view: view
+                        }
+                    ]);
+                }
+            }
+            this.isCellSizesDirty = true;
+        };
+        DayGrid.prototype._unrenderCells = function () {
+            this.removeSegPopover();
+        };
+        // Generates the HTML for a single row, which is a div that wraps a table.
+        // `row` is the row number.
+        DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
+            var theme = this.theme;
+            var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
+            if (isRigid) {
+                classes.push('fc-rigid');
+            }
+            var bgRow = new DayBgRow(this.context);
+            return '' +
+                '<div class="' + classes.join(' ') + '">' +
+                '<div class="fc-bg">' +
+                '<table class="' + theme.getClass('tableGrid') + '">' +
+                bgRow.renderHtml({
+                    cells: this.props.cells[row],
+                    dateProfile: this.props.dateProfile,
+                    renderIntroHtml: this.renderProps.renderBgIntroHtml
+                }) +
+                '</table>' +
+                '</div>' +
+                '<div class="fc-content-skeleton">' +
+                '<table>' +
+                (this.getIsNumbersVisible() ?
+                    '<thead>' +
+                        this.renderNumberTrHtml(row) +
+                        '</thead>' :
+                    '') +
+                '</table>' +
+                '</div>' +
+                '</div>';
+        };
+        DayGrid.prototype.getIsNumbersVisible = function () {
+            return this.getIsDayNumbersVisible() ||
+                this.renderProps.cellWeekNumbersVisible ||
+                this.renderProps.colWeekNumbersVisible;
+        };
+        DayGrid.prototype.getIsDayNumbersVisible = function () {
+            return this.rowCnt > 1;
+        };
+        /* Grid Number Rendering
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype.renderNumberTrHtml = function (row) {
+            var intro = this.renderProps.renderNumberIntroHtml(row, this);
+            return '' +
+                '<tr>' +
+                (this.isRtl ? '' : intro) +
+                this.renderNumberCellsHtml(row) +
+                (this.isRtl ? intro : '') +
+                '</tr>';
+        };
+        DayGrid.prototype.renderNumberCellsHtml = function (row) {
+            var htmls = [];
+            var col;
+            var date;
+            for (col = 0; col < this.colCnt; col++) {
+                date = this.props.cells[row][col].date;
+                htmls.push(this.renderNumberCellHtml(date));
+            }
+            if (this.isRtl) {
+                htmls.reverse();
+            }
+            return htmls.join('');
+        };
+        // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
+        // The number row will only exist if either day numbers or week numbers are turned on.
+        DayGrid.prototype.renderNumberCellHtml = function (date) {
+            var _a = this, view = _a.view, dateEnv = _a.dateEnv;
+            var html = '';
+            var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
+            var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
+            var classes;
+            var weekCalcFirstDow;
+            if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
+                // no numbers in day cell (week number must be along the side)
+                return '<td></td>'; //  will create an empty space above events :(
+            }
+            classes = core.getDayClasses(date, this.props.dateProfile, this.context);
+            classes.unshift('fc-day-top');
+            if (this.renderProps.cellWeekNumbersVisible) {
+                weekCalcFirstDow = dateEnv.weekDow;
+            }
+            html += '<td class="' + classes.join(' ') + '"' +
+                (isDateValid ?
+                    ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
+                    '') +
+                '>';
+            if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
+                html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
+                );
+            }
+            if (isDayNumberVisible) {
+                html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
+                );
+            }
+            html += '</td>';
+            return html;
+        };
+        /* Sizing
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype.updateSize = function (isResize) {
+            var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
+            if (isResize ||
+                this.isCellSizesDirty ||
+                this.view.calendar.isEventsUpdated // hack
+            ) {
+                this.buildPositionCaches();
+                this.isCellSizesDirty = false;
+            }
+            fillRenderer.computeSizes(isResize);
+            eventRenderer.computeSizes(isResize);
+            mirrorRenderer.computeSizes(isResize);
+            fillRenderer.assignSizes(isResize);
+            eventRenderer.assignSizes(isResize);
+            mirrorRenderer.assignSizes(isResize);
+        };
+        DayGrid.prototype.buildPositionCaches = function () {
+            this.buildColPositions();
+            this.buildRowPositions();
+        };
+        DayGrid.prototype.buildColPositions = function () {
+            this.colPositions.build();
+        };
+        DayGrid.prototype.buildRowPositions = function () {
+            this.rowPositions.build();
+            this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
+        };
+        /* Hit System
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
+            var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
+            var col = colPositions.leftToIndex(leftPosition);
+            var row = rowPositions.topToIndex(topPosition);
+            if (row != null && col != null) {
+                return {
+                    row: row,
+                    col: col,
+                    dateSpan: {
+                        range: this.getCellRange(row, col),
+                        allDay: true
+                    },
+                    dayEl: this.getCellEl(row, col),
+                    relativeRect: {
+                        left: colPositions.lefts[col],
+                        right: colPositions.rights[col],
+                        top: rowPositions.tops[row],
+                        bottom: rowPositions.bottoms[row]
+                    }
+                };
+            }
+        };
+        /* Cell System
+        ------------------------------------------------------------------------------------------------------------------*/
+        // FYI: the first column is the leftmost column, regardless of date
+        DayGrid.prototype.getCellEl = function (row, col) {
+            return this.cellEls[row * this.colCnt + col];
+        };
+        /* Event Drag Visualization
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype._renderEventDrag = function (state) {
+            if (state) {
+                this.eventRenderer.hideByHash(state.affectedInstances);
+                this.fillRenderer.renderSegs('highlight', state.segs);
+            }
+        };
+        DayGrid.prototype._unrenderEventDrag = function (state) {
+            if (state) {
+                this.eventRenderer.showByHash(state.affectedInstances);
+                this.fillRenderer.unrender('highlight');
+            }
+        };
+        /* Event Resize Visualization
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype._renderEventResize = function (state) {
+            if (state) {
+                this.eventRenderer.hideByHash(state.affectedInstances);
+                this.fillRenderer.renderSegs('highlight', state.segs);
+                this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        DayGrid.prototype._unrenderEventResize = function (state) {
+            if (state) {
+                this.eventRenderer.showByHash(state.affectedInstances);
+                this.fillRenderer.unrender('highlight');
+                this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        /* More+ Link Popover
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGrid.prototype.removeSegPopover = function () {
+            if (this.segPopover) {
+                this.segPopover.hide(); // in handler, will call segPopover's removeElement
+            }
+        };
+        // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
+        // `levelLimit` can be false (don't limit), a number, or true (should be computed).
+        DayGrid.prototype.limitRows = function (levelLimit) {
+            var rowStructs = this.eventRenderer.rowStructs || [];
+            var row; // row #
+            var rowLevelLimit;
+            for (row = 0; row < rowStructs.length; row++) {
+                this.unlimitRow(row);
+                if (!levelLimit) {
+                    rowLevelLimit = false;
+                }
+                else if (typeof levelLimit === 'number') {
+                    rowLevelLimit = levelLimit;
+                }
+                else {
+                    rowLevelLimit = this.computeRowLevelLimit(row);
+                }
+                if (rowLevelLimit !== false) {
+                    this.limitRow(row, rowLevelLimit);
+                }
+            }
+        };
+        // Computes the number of levels a row will accomodate without going outside its bounds.
+        // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
+        // `row` is the row number.
+        DayGrid.prototype.computeRowLevelLimit = function (row) {
+            var rowEl = this.rowEls[row]; // the containing "fake" row div
+            var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
+            var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
+            var i;
+            var trEl;
+            // Reveal one level <tr> at a time and stop when we find one out of bounds
+            for (i = 0; i < trEls.length; i++) {
+                trEl = trEls[i];
+                trEl.classList.remove('fc-limited'); // reset to original state (reveal)
+                if (trEl.getBoundingClientRect().bottom > rowBottom) {
+                    return i;
+                }
+            }
+            return false; // should not limit at all
+        };
+        // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
+        // `row` is the row number.
+        // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
+        DayGrid.prototype.limitRow = function (row, levelLimit) {
+            var _this = this;
+            var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl;
+            var rowStruct = this.eventRenderer.rowStructs[row];
+            var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
+            var col = 0; // col #, left-to-right (not chronologically)
+            var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
+            var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
+            var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
+            var i;
+            var seg;
+            var segsBelow; // array of segment objects below `seg` in the current `col`
+            var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
+            var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
+            var td;
+            var rowSpan;
+            var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
+            var j;
+            var moreTd;
+            var moreWrap;
+            var moreLink;
+            // Iterates through empty level cells and places "more" links inside if need be
+            var emptyCellsUntil = function (endCol) {
+                while (col < endCol) {
+                    segsBelow = _this.getCellSegs(row, col, levelLimit);
+                    if (segsBelow.length) {
+                        td = cellMatrix[levelLimit - 1][col];
+                        moreLink = _this.renderMoreLink(row, col, segsBelow);
+                        moreWrap = core.createElement('div', null, moreLink);
+                        td.appendChild(moreWrap);
+                        moreNodes.push(moreWrap);
+                    }
+                    col++;
+                }
+            };
+            if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
+                levelSegs = rowStruct.segLevels[levelLimit - 1];
+                cellMatrix = rowStruct.cellMatrix;
+                limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
+                limitedNodes.forEach(function (node) {
+                    node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
+                });
+                // iterate though segments in the last allowable level
+                for (i = 0; i < levelSegs.length; i++) {
+                    seg = levelSegs[i];
+                    var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
+                    var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
+                    emptyCellsUntil(leftCol); // process empty cells before the segment
+                    // determine *all* segments below `seg` that occupy the same columns
+                    colSegsBelow = [];
+                    totalSegsBelow = 0;
+                    while (col <= rightCol) {
+                        segsBelow = this.getCellSegs(row, col, levelLimit);
+                        colSegsBelow.push(segsBelow);
+                        totalSegsBelow += segsBelow.length;
+                        col++;
+                    }
+                    if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
+                        td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
+                        rowSpan = td.rowSpan || 1;
+                        segMoreNodes = [];
+                        // make a replacement <td> for each column the segment occupies. will be one for each colspan
+                        for (j = 0; j < colSegsBelow.length; j++) {
+                            moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
+                            segsBelow = colSegsBelow[j];
+                            moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
+                            );
+                            moreWrap = core.createElement('div', null, moreLink);
+                            moreTd.appendChild(moreWrap);
+                            segMoreNodes.push(moreTd);
+                            moreNodes.push(moreTd);
+                        }
+                        td.classList.add('fc-limited');
+                        core.insertAfterElement(td, segMoreNodes);
+                        limitedNodes.push(td);
+                    }
+                }
+                emptyCellsUntil(this.colCnt); // finish off the level
+                rowStruct.moreEls = moreNodes; // for easy undoing later
+                rowStruct.limitedEls = limitedNodes; // for easy undoing later
+            }
+        };
+        // Reveals all levels and removes all "more"-related elements for a grid's row.
+        // `row` is a row number.
+        DayGrid.prototype.unlimitRow = function (row) {
+            var rowStruct = this.eventRenderer.rowStructs[row];
+            if (rowStruct.moreEls) {
+                rowStruct.moreEls.forEach(core.removeElement);
+                rowStruct.moreEls = null;
+            }
+            if (rowStruct.limitedEls) {
+                rowStruct.limitedEls.forEach(function (limitedEl) {
+                    limitedEl.classList.remove('fc-limited');
+                });
+                rowStruct.limitedEls = null;
+            }
+        };
+        // Renders an <a> element that represents hidden event element for a cell.
+        // Responsible for attaching click handler as well.
+        DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
+            var _this = this;
+            var _a = this, view = _a.view, dateEnv = _a.dateEnv;
+            var a = core.createElement('a', { className: 'fc-more' });
+            a.innerText = this.getMoreLinkText(hiddenSegs.length);
+            a.addEventListener('click', function (ev) {
+                var clickOption = _this.opt('eventLimitClick');
+                var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
+                var date = _this.props.cells[row][_col].date;
+                var moreEl = ev.currentTarget;
+                var dayEl = _this.getCellEl(row, col);
+                var allSegs = _this.getCellSegs(row, col);
+                // rescope the segments to be within the cell's date
+                var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
+                var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
+                if (typeof clickOption === 'function') {
+                    // the returned value can be an atomic option
+                    clickOption = _this.publiclyTrigger('eventLimitClick', [
+                        {
+                            date: dateEnv.toDate(date),
+                            allDay: true,
+                            dayEl: dayEl,
+                            moreEl: moreEl,
+                            segs: reslicedAllSegs,
+                            hiddenSegs: reslicedHiddenSegs,
+                            jsEvent: ev,
+                            view: view
+                        }
+                    ]);
+                }
+                if (clickOption === 'popover') {
+                    _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
+                }
+                else if (typeof clickOption === 'string') { // a view name
+                    view.calendar.zoomTo(date, clickOption);
+                }
+            });
+            return a;
+        };
+        // Reveals the popover that displays all events within a cell
+        DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
+            var _this = this;
+            var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme;
+            var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
+            var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
+            var topEl; // the element we want to match the top coordinate of
+            var options;
+            if (this.rowCnt === 1) {
+                topEl = view.el; // will cause the popover to cover any sort of header
+            }
+            else {
+                topEl = this.rowEls[row]; // will align with top of row
+            }
+            options = {
+                className: 'fc-more-popover ' + theme.getClass('popover'),
+                parentEl: view.el,
+                top: core.computeRect(topEl).top,
+                autoHide: true,
+                content: function (el) {
+                    _this.segPopoverTile = new DayTile(_this.context, el);
+                    _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
+                },
+                hide: function () {
+                    _this.segPopoverTile.destroy();
+                    _this.segPopoverTile = null;
+                    _this.segPopover.destroy();
+                    _this.segPopover = null;
+                }
+            };
+            // Determine horizontal coordinate.
+            // We use the moreWrap instead of the <td> to avoid border confusion.
+            if (this.isRtl) {
+                options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border
+            }
+            else {
+                options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border
+            }
+            this.segPopover = new Popover(options);
+            this.segPopover.show();
+            calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
+        };
+        // Given the events within an array of segment objects, reslice them to be in a single day
+        DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
+            var dayStart = dayDate;
+            var dayEnd = core.addDays(dayStart, 1);
+            var dayRange = { start: dayStart, end: dayEnd };
+            var newSegs = [];
+            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                var seg = segs_1[_i];
+                var eventRange = seg.eventRange;
+                var origRange = eventRange.range;
+                var slicedRange = core.intersectRanges(origRange, dayRange);
+                if (slicedRange) {
+                    newSegs.push(__assign({}, seg, { eventRange: {
+                            def: eventRange.def,
+                            ui: __assign({}, eventRange.ui, { durationEditable: false }),
+                            instance: eventRange.instance,
+                            range: slicedRange
+                        }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
+                }
+            }
+            return newSegs;
+        };
+        // Generates the text that should be inside a "more" link, given the number of events it represents
+        DayGrid.prototype.getMoreLinkText = function (num) {
+            var opt = this.opt('eventLimitText');
+            if (typeof opt === 'function') {
+                return opt(num);
+            }
+            else {
+                return '+' + num + ' ' + opt;
+            }
+        };
+        // Returns segments within a given cell.
+        // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
+        DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
+            var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
+            var level = startLevel || 0;
+            var segs = [];
+            var seg;
+            while (level < segMatrix.length) {
+                seg = segMatrix[level][col];
+                if (seg) {
+                    segs.push(seg);
+                }
+                level++;
+            }
+            return segs;
+        };
+        return DayGrid;
+    }(core.DateComponent));
+
+    var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' });
+    /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
+    // It is responsible for managing width/height.
+    var DayGridView = /** @class */ (function (_super) {
+        __extends(DayGridView, _super);
+        function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            /* Header Rendering
+            ------------------------------------------------------------------------------------------------------------------*/
+            // Generates the HTML that will go before the day-of week header cells
+            _this.renderHeadIntroHtml = function () {
+                var theme = _this.theme;
+                if (_this.colWeekNumbersVisible) {
+                    return '' +
+                        '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
+                        '<span>' + // needed for matchCellWidths
+                        core.htmlEscape(_this.opt('weekLabel')) +
+                        '</span>' +
+                        '</th>';
+                }
+                return '';
+            };
+            /* Day Grid Rendering
+            ------------------------------------------------------------------------------------------------------------------*/
+            // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
+            _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
+                var dateEnv = _this.dateEnv;
+                var weekStart = dayGrid.props.cells[row][0].date;
+                if (_this.colWeekNumbersVisible) {
+                    return '' +
+                        '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
+                        core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
+                        _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
+                        ) +
+                        '</td>';
+                }
+                return '';
+            };
+            // Generates the HTML that goes before the day bg cells for each day-row
+            _this.renderDayGridBgIntroHtml = function () {
+                var theme = _this.theme;
+                if (_this.colWeekNumbersVisible) {
+                    return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
+                }
+                return '';
+            };
+            // Generates the HTML that goes before every other type of row generated by DayGrid.
+            // Affects mirror-skeleton and highlight-skeleton rows.
+            _this.renderDayGridIntroHtml = function () {
+                if (_this.colWeekNumbersVisible) {
+                    return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
+                }
+                return '';
+            };
+            _this.el.classList.add('fc-dayGrid-view');
+            _this.el.innerHTML = _this.renderSkeletonHtml();
+            _this.scroller = new core.ScrollComponent('hidden', // overflow x
+            'auto' // overflow y
+            );
+            var dayGridContainerEl = _this.scroller.el;
+            _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
+            dayGridContainerEl.classList.add('fc-day-grid-container');
+            var dayGridEl = core.createElement('div', { className: 'fc-day-grid' });
+            dayGridContainerEl.appendChild(dayGridEl);
+            var cellWeekNumbersVisible;
+            if (_this.opt('weekNumbers')) {
+                if (_this.opt('weekNumbersWithinDays')) {
+                    cellWeekNumbersVisible = true;
+                    _this.colWeekNumbersVisible = false;
+                }
+                else {
+                    cellWeekNumbersVisible = false;
+                    _this.colWeekNumbersVisible = true;
+                }
+            }
+            else {
+                _this.colWeekNumbersVisible = false;
+                cellWeekNumbersVisible = false;
+            }
+            _this.dayGrid = new DayGrid(_this.context, dayGridEl, {
+                renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml,
+                renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
+                renderIntroHtml: _this.renderDayGridIntroHtml,
+                colWeekNumbersVisible: _this.colWeekNumbersVisible,
+                cellWeekNumbersVisible: cellWeekNumbersVisible
+            });
+            return _this;
+        }
+        DayGridView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.dayGrid.destroy();
+            this.scroller.destroy();
+        };
+        // Builds the HTML skeleton for the view.
+        // The day-grid component will render inside of a container defined by this HTML.
+        DayGridView.prototype.renderSkeletonHtml = function () {
+            var theme = this.theme;
+            return '' +
+                '<table class="' + theme.getClass('tableGrid') + '">' +
+                (this.opt('columnHeader') ?
+                    '<thead class="fc-head">' +
+                        '<tr>' +
+                        '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
+                        '</tr>' +
+                        '</thead>' :
+                    '') +
+                '<tbody class="fc-body">' +
+                '<tr>' +
+                '<td class="' + theme.getClass('widgetContent') + '"></td>' +
+                '</tr>' +
+                '</tbody>' +
+                '</table>';
+        };
+        // Generates an HTML attribute string for setting the width of the week number column, if it is known
+        DayGridView.prototype.weekNumberStyleAttr = function () {
+            if (this.weekNumberWidth != null) {
+                return 'style="width:' + this.weekNumberWidth + 'px"';
+            }
+            return '';
+        };
+        // Determines whether each row should have a constant height
+        DayGridView.prototype.hasRigidRows = function () {
+            var eventLimit = this.opt('eventLimit');
+            return eventLimit && typeof eventLimit !== 'number';
+        };
+        /* Dimensions
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
+            _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
+            this.dayGrid.updateSize(isResize);
+        };
+        // Refreshes the horizontal dimensions of the view
+        DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
+            var dayGrid = this.dayGrid;
+            var eventLimit = this.opt('eventLimit');
+            var headRowEl = this.header ? this.header.el : null; // HACK
+            var scrollerHeight;
+            var scrollbarWidths;
+            // hack to give the view some height prior to dayGrid's columns being rendered
+            // TODO: separate setting height from scroller VS dayGrid.
+            if (!dayGrid.rowEls) {
+                if (!isAuto) {
+                    scrollerHeight = this.computeScrollerHeight(viewHeight);
+                    this.scroller.setHeight(scrollerHeight);
+                }
+                return;
+            }
+            if (this.colWeekNumbersVisible) {
+                // Make sure all week number cells running down the side have the same width.
+                this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number'));
+            }
+            // reset all heights to be natural
+            this.scroller.clear();
+            if (headRowEl) {
+                core.uncompensateScroll(headRowEl);
+            }
+            dayGrid.removeSegPopover(); // kill the "more" popover if displayed
+            // is the event limit a constant level number?
+            if (eventLimit && typeof eventLimit === 'number') {
+                dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
+            }
+            // distribute the height to the rows
+            // (viewHeight is a "recommended" value if isAuto)
+            scrollerHeight = this.computeScrollerHeight(viewHeight);
+            this.setGridHeight(scrollerHeight, isAuto);
+            // is the event limit dynamically calculated?
+            if (eventLimit && typeof eventLimit !== 'number') {
+                dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
+            }
+            if (!isAuto) { // should we force dimensions of the scroll container?
+                this.scroller.setHeight(scrollerHeight);
+                scrollbarWidths = this.scroller.getScrollbarWidths();
+                if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
+                    if (headRowEl) {
+                        core.compensateScroll(headRowEl, scrollbarWidths);
+                    }
+                    // doing the scrollbar compensation might have created text overflow which created more height. redo
+                    scrollerHeight = this.computeScrollerHeight(viewHeight);
+                    this.scroller.setHeight(scrollerHeight);
+                }
+                // guarantees the same scrollbar widths
+                this.scroller.lockOverflow(scrollbarWidths);
+            }
+        };
+        // given a desired total height of the view, returns what the height of the scroller should be
+        DayGridView.prototype.computeScrollerHeight = function (viewHeight) {
+            return viewHeight -
+                core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
+        };
+        // Sets the height of just the DayGrid component in this view
+        DayGridView.prototype.setGridHeight = function (height, isAuto) {
+            if (this.opt('monthMode')) {
+                // if auto, make the height of each row the height that it would be if there were 6 weeks
+                if (isAuto) {
+                    height *= this.dayGrid.rowCnt / 6;
+                }
+                core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
+            }
+            else {
+                if (isAuto) {
+                    core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
+                }
+                else {
+                    core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
+                }
+            }
+        };
+        /* Scroll
+        ------------------------------------------------------------------------------------------------------------------*/
+        DayGridView.prototype.computeDateScroll = function (timeMs) {
+            return { top: 0 };
+        };
+        DayGridView.prototype.queryDateScroll = function () {
+            return { top: this.scroller.getScrollTop() };
+        };
+        DayGridView.prototype.applyDateScroll = function (scroll) {
+            if (scroll.top !== undefined) {
+                this.scroller.setScrollTop(scroll.top);
+            }
+        };
+        return DayGridView;
+    }(core.View));
+    DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
+
+    var SimpleDayGrid = /** @class */ (function (_super) {
+        __extends(SimpleDayGrid, _super);
+        function SimpleDayGrid(context, dayGrid) {
+            var _this = _super.call(this, context, dayGrid.el) || this;
+            _this.slicer = new DayGridSlicer();
+            _this.dayGrid = dayGrid;
+            context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el });
+            return _this;
+        }
+        SimpleDayGrid.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        SimpleDayGrid.prototype.render = function (props) {
+            var dayGrid = this.dayGrid;
+            var dateProfile = props.dateProfile, dayTable = props.dayTable;
+            dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }));
+        };
+        SimpleDayGrid.prototype.buildPositionCaches = function () {
+            this.dayGrid.buildPositionCaches();
+        };
+        SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this.dayGrid,
+                    dateSpan: rawHit.dateSpan,
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return SimpleDayGrid;
+    }(core.DateComponent));
+    var DayGridSlicer = /** @class */ (function (_super) {
+        __extends(DayGridSlicer, _super);
+        function DayGridSlicer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
+            return dayTable.sliceRange(dateRange);
+        };
+        return DayGridSlicer;
+    }(core.Slicer));
+
+    var DayGridView$1 = /** @class */ (function (_super) {
+        __extends(DayGridView, _super);
+        function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.buildDayTable = core.memoize(buildDayTable);
+            if (_this.opt('columnHeader')) {
+                _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
+            }
+            _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);
+            return _this;
+        }
+        DayGridView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            if (this.header) {
+                this.header.destroy();
+            }
+            this.simpleDayGrid.destroy();
+        };
+        DayGridView.prototype.render = function (props) {
+            _super.prototype.render.call(this, props);
+            var dateProfile = this.props.dateProfile;
+            var dayTable = this.dayTable =
+                this.buildDayTable(dateProfile, this.dateProfileGenerator);
+            if (this.header) {
+                this.header.receiveProps({
+                    dateProfile: dateProfile,
+                    dates: dayTable.headerDates,
+                    datesRepDistinctDays: dayTable.rowCnt === 1,
+                    renderIntroHtml: this.renderHeadIntroHtml
+                });
+            }
+            this.simpleDayGrid.receiveProps({
+                dateProfile: dateProfile,
+                dayTable: dayTable,
+                businessHours: props.businessHours,
+                dateSelection: props.dateSelection,
+                eventStore: props.eventStore,
+                eventUiBases: props.eventUiBases,
+                eventSelection: props.eventSelection,
+                eventDrag: props.eventDrag,
+                eventResize: props.eventResize,
+                isRigid: this.hasRigidRows(),
+                nextDayThreshold: this.nextDayThreshold
+            });
+        };
+        return DayGridView;
+    }(DayGridView));
+    function buildDayTable(dateProfile, dateProfileGenerator) {
+        var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
+        return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
+    }
+
+    var main = core.createPlugin({
+        defaultView: 'dayGridMonth',
+        views: {
+            dayGrid: DayGridView$1,
+            dayGridDay: {
+                type: 'dayGrid',
+                duration: { days: 1 }
+            },
+            dayGridWeek: {
+                type: 'dayGrid',
+                duration: { weeks: 1 }
+            },
+            dayGridMonth: {
+                type: 'dayGrid',
+                duration: { months: 1 },
+                monthMode: true,
+                fixedWeekCount: true
+            }
+        }
+    });
+
+    exports.AbstractDayGridView = DayGridView;
+    exports.DayBgRow = DayBgRow;
+    exports.DayGrid = DayGrid;
+    exports.DayGridSlicer = DayGridSlicer;
+    exports.DayGridView = DayGridView$1;
+    exports.SimpleDayGrid = SimpleDayGrid;
+    exports.buildBasicDayTable = buildDayTable;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/daygrid/main.min.css b/backoffice/vendors/fullcalendar/daygrid/main.min.css
new file mode 100644 (file)
index 0000000..2848b37
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar Day Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/.fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/daygrid/main.min.js b/backoffice/vendors/fullcalendar/daygrid/main.min.js
new file mode 100644 (file)
index 0000000..056cfc0
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Day Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarDayGrid={},e.FullCalendar))}(this,function(e,t){"use strict";function r(e,t){function r(){this.constructor=e}l(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function n(e,t){var r,n;for(r=0;r<t.length;r++)if(n=t[r],n.firstCol<=e.lastCol&&n.lastCol>=e.firstCol)return!0;return!1}function i(e,t){return e.leftCol-t.leftCol}function o(e,r,n,i){var o=n.dateEnv,s=n.theme,l=t.rangeContainsMarker(r.activeRange,e),a=t.getDayClasses(e,r,n);return a.unshift("fc-day",s.getClass("widgetContent")),'<td class="'+a.join(" ")+'"'+(l?' data-date="'+o.formatIso(e,{omitTime:!0})+'"':"")+(i?" "+i:"")+"></td>"}function s(e,r){var n=new t.DaySeries(e.renderRange,r);return new t.DayTable(n,/year|month|week/.test(e.currentRangeUnit))}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var l=function(e,t){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},a=function(){return a=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++){t=arguments[r];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e},a.apply(this,arguments)},d=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return r(n,e),n.prototype.buildRenderRange=function(r,n,i){var o,s=this.dateEnv,l=e.prototype.buildRenderRange.call(this,r,n,i),a=l.start,d=l.end;if(/^(year|month)$/.test(n)&&(a=s.startOfWeek(a),o=s.startOfWeek(d),o.valueOf()!==d.valueOf()&&(d=t.addWeeks(o,1))),this.options.monthMode&&this.options.fixedWeekCount){var c=Math.ceil(t.diffWeeks(a,d));d=t.addWeeks(d,6-c)}return{start:a,end:d}},n}(t.DateProfileGenerator),c=function(){function e(e){var t=this;this.isHidden=!0,this.margin=10,this.documentMousedown=function(e){t.el&&!t.el.contains(e.target)&&t.hide()},this.options=e}return e.prototype.show=function(){this.isHidden&&(this.el||this.render(),this.el.style.display="",this.position(),this.isHidden=!1,this.trigger("show"))},e.prototype.hide=function(){this.isHidden||(this.el.style.display="none",this.isHidden=!0,this.trigger("hide"))},e.prototype.render=function(){var e=this,r=this.options,n=this.el=t.createElement("div",{className:"fc-popover "+(r.className||""),style:{top:"0",left:"0"}});"function"==typeof r.content&&r.content(n),r.parentEl.appendChild(n),t.listenBySelector(n,"click",".fc-close",function(t){e.hide()}),r.autoHide&&document.addEventListener("mousedown",this.documentMousedown)},e.prototype.destroy=function(){this.hide(),this.el&&(t.removeElement(this.el),this.el=null),document.removeEventListener("mousedown",this.documentMousedown)},e.prototype.position=function(){var e,r,n=this.options,i=this.el,o=i.getBoundingClientRect(),s=t.computeRect(i.offsetParent),l=t.computeClippingRect(n.parentEl);e=n.top||0,r=void 0!==n.left?n.left:void 0!==n.right?n.right-o.width:0,e=Math.min(e,l.bottom-o.height-this.margin),e=Math.max(e,l.top+this.margin),r=Math.min(r,l.right-o.width-this.margin),r=Math.max(r,l.left+this.margin),t.applyStyle(i,{top:e-s.top,left:r-s.left})},e.prototype.trigger=function(e){this.options[e]&&this.options[e].apply(this,Array.prototype.slice.call(arguments,1))},e}(),h=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return r(n,e),n.prototype.renderSegHtml=function(e,r){var n,i,o=this.context.options,s=e.eventRange,l=s.def,a=s.ui,d=l.allDay,c=a.startEditable,h=d&&e.isStart&&a.durationEditable&&o.eventResizableFromStart,p=d&&e.isEnd&&a.durationEditable,u=this.getSegClasses(e,c,h||p,r),f=t.cssToStr(this.getSkinCss(a)),g="";return u.unshift("fc-day-grid-event","fc-h-event"),e.isStart&&(n=this.getTimeText(s))&&(g='<span class="fc-time">'+t.htmlEscape(n)+"</span>"),i='<span class="fc-title">'+(t.htmlEscape(l.title||"")||"&nbsp;")+"</span>",'<a class="'+u.join(" ")+'"'+(l.url?' href="'+t.htmlEscape(l.url)+'"':"")+(f?' style="'+f+'"':"")+'><div class="fc-content">'+("rtl"===o.dir?i+" "+g:g+" "+i)+"</div>"+(h?'<div class="fc-resizer fc-start-resizer"></div>':"")+(p?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},n.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},n.prototype.computeDisplayEventEnd=function(){return!1},n}(t.FgEventRenderer),p=function(e){function o(t){var r=e.call(this,t.context)||this;return r.dayGrid=t,r}return r(o,e),o.prototype.attachSegs=function(e,t){var r=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,t){e.querySelector(".fc-content-skeleton > table").appendChild(r[t].tbodyEl)}),t||this.dayGrid.removeSegPopover()},o.prototype.detachSegs=function(){for(var e,r=this.rowStructs||[];e=r.pop();)t.removeElement(e.tbodyEl);this.rowStructs=null},o.prototype.renderSegRows=function(e){var t,r,n=[];for(t=this.groupSegRows(e),r=0;r<t.length;r++)n.push(this.renderSegRow(r,t[r]));return n},o.prototype.renderSegRow=function(e,r){function n(e){for(;s<e;)c=(b[i-1]||[])[s],c?c.rowSpan=(c.rowSpan||1)+1:(c=document.createElement("td"),l.appendChild(c)),v[i][s]=c,b[i][s]=c,s++}var i,o,s,l,a,d,c,h=this.dayGrid,p=h.colCnt,u=h.isRtl,f=this.buildSegLevels(r),g=Math.max(1,f.length),m=document.createElement("tbody"),y=[],v=[],b=[];for(i=0;i<g;i++){if(o=f[i],s=0,l=document.createElement("tr"),y.push([]),v.push([]),b.push([]),o)for(a=0;a<o.length;a++){d=o[a];var w=u?p-1-d.lastCol:d.firstCol,S=u?p-1-d.firstCol:d.lastCol;for(n(w),c=t.createElement("td",{className:"fc-event-container"},d.el),w!==S?c.colSpan=S-w+1:b[i][s]=c;s<=S;)v[i][s]=c,y[i][s]=d,s++;l.appendChild(c)}n(p);var C=h.renderProps.renderIntroHtml();C&&(h.isRtl?t.appendToElement(l,C):t.prependToElement(l,C)),m.appendChild(l)}return{row:e,tbodyEl:m,cellMatrix:v,segMatrix:y,segLevels:f,segs:r}},o.prototype.buildSegLevels=function(e){var t,r,o,s=this.dayGrid,l=s.isRtl,a=s.colCnt,d=[];for(e=this.sortEventSegs(e),t=0;t<e.length;t++){for(r=e[t],o=0;o<d.length&&n(r,d[o]);o++);r.level=o,r.leftCol=l?a-1-r.lastCol:r.firstCol,r.rightCol=l?a-1-r.firstCol:r.lastCol,(d[o]||(d[o]=[])).push(r)}for(o=0;o<d.length;o++)d[o].sort(i);return d},o.prototype.groupSegRows=function(e){var t,r=[];for(t=0;t<this.dayGrid.rowCnt;t++)r.push([]);for(t=0;t<e.length;t++)r[e[t].row].push(e[t]);return r},o.prototype.computeDisplayEventEnd=function(){return 1===this.dayGrid.colCnt},o}(h),u=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return r(n,e),n.prototype.attachSegs=function(e,r){var n=r.sourceSeg,i=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,r){var o,s,l=t.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>');n&&n.row===r?o=n.el:(o=e.querySelector(".fc-content-skeleton tbody"))||(o=e.querySelector(".fc-content-skeleton table")),s=o.getBoundingClientRect().top-e.getBoundingClientRect().top,l.style.top=s+"px",l.querySelector("table").appendChild(i[r].tbodyEl),e.appendChild(l)})},n}(p),f=function(e){function n(t){var r=e.call(this,t.context)||this;return r.fillSegTag="td",r.dayGrid=t,r}return r(n,e),n.prototype.renderSegs=function(t,r){"bgEvent"===t&&(r=r.filter(function(e){return e.eventRange.def.allDay})),e.prototype.renderSegs.call(this,t,r)},n.prototype.attachSegs=function(e,t){var r,n,i,o=[];for(r=0;r<t.length;r++)n=t[r],i=this.renderFillRow(e,n),this.dayGrid.rowEls[n.row].appendChild(i),o.push(i);return o},n.prototype.renderFillRow=function(e,r){var n,i,o,s=this.dayGrid,l=s.colCnt,a=s.isRtl,d=a?l-1-r.lastCol:r.firstCol,c=a?l-1-r.firstCol:r.lastCol,h=d,p=c+1;n="businessHours"===e?"bgevent":e.toLowerCase(),i=t.htmlToElement('<div class="fc-'+n+'-skeleton"><table><tr></tr></table></div>'),o=i.getElementsByTagName("tr")[0],h>0&&t.appendToElement(o,new Array(h+1).join("<td></td>")),r.el.colSpan=p-h,o.appendChild(r.el),p<l&&t.appendToElement(o,new Array(l-p+1).join("<td></td>"));var u=s.renderProps.renderIntroHtml();return u&&(s.isRtl?t.appendToElement(o,u):t.prependToElement(o,u)),i},n}(t.FillRenderer),g=function(e){function n(r,n){var i=e.call(this,r,n)||this,o=i.eventRenderer=new m(i),s=i.renderFrame=t.memoizeRendering(i._renderFrame);return i.renderFgEvents=t.memoizeRendering(o.renderSegs.bind(o),o.unrender.bind(o),[s]),i.renderEventSelection=t.memoizeRendering(o.selectByInstanceId.bind(o),o.unselectByInstanceId.bind(o),[i.renderFgEvents]),i.renderEventDrag=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),i.renderEventResize=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),r.calendar.registerInteractiveComponent(i,{el:i.el,useEventCenter:!1}),i}return r(n,e),n.prototype.render=function(e){this.renderFrame(e.date),this.renderFgEvents(e.fgSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDragInstances),this.renderEventResize(e.eventResizeInstances)},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderFrame.unrender(),this.calendar.unregisterInteractiveComponent(this)},n.prototype._renderFrame=function(e){var r=this,n=r.theme,i=r.dateEnv,o=i.format(e,t.createFormatter(this.opt("dayPopoverFormat")));this.el.innerHTML='<div class="fc-header '+n.getClass("popoverHeader")+'"><span class="fc-title">'+t.htmlEscape(o)+'</span><span class="fc-close '+n.getIconClass("close")+'"></span></div><div class="fc-body '+n.getClass("popoverContent")+'"><div class="fc-event-container"></div></div>',this.segContainerEl=this.el.querySelector(".fc-event-container")},n.prototype.queryHit=function(e,r,n,i){var o=this.props.date;if(e<n&&r<i)return{component:this,dateSpan:{allDay:!0,range:{start:o,end:t.addDays(o,1)}},dayEl:this.el,rect:{left:0,top:0,right:n,bottom:i},layer:1}},n}(t.DateComponent),m=function(e){function n(t){var r=e.call(this,t.context)||this;return r.dayTile=t,r}return r(n,e),n.prototype.attachSegs=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.dayTile.segContainerEl.appendChild(n.el)}},n.prototype.detachSegs=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.removeElement(i.el)}},n}(h),y=function(){function e(e){this.context=e}return e.prototype.renderHtml=function(e){var t=[];e.renderIntroHtml&&t.push(e.renderIntroHtml());for(var r=0,n=e.cells;r<n.length;r++){var i=n[r];t.push(o(i.date,e.dateProfile,this.context,i.htmlAttrs))}return e.cells.length||t.push('<td class="fc-day '+this.context.theme.getClass("widgetContent")+'"></td>'),"rtl"===this.context.options.dir&&t.reverse(),"<tr>"+t.join("")+"</tr>"},e}(),v=t.createFormatter({day:"numeric"}),b=t.createFormatter({week:"numeric"}),w=function(e){function n(r,n,i){var o=e.call(this,r,n)||this;o.bottomCoordPadding=0,o.isCellSizesDirty=!1;var s=o.eventRenderer=new p(o),l=o.fillRenderer=new f(o);o.mirrorRenderer=new u(o);var a=o.renderCells=t.memoizeRendering(o._renderCells,o._unrenderCells);return o.renderBusinessHours=t.memoizeRendering(l.renderSegs.bind(l,"businessHours"),l.unrender.bind(l,"businessHours"),[a]),o.renderDateSelection=t.memoizeRendering(l.renderSegs.bind(l,"highlight"),l.unrender.bind(l,"highlight"),[a]),o.renderBgEvents=t.memoizeRendering(l.renderSegs.bind(l,"bgEvent"),l.unrender.bind(l,"bgEvent"),[a]),o.renderFgEvents=t.memoizeRendering(s.renderSegs.bind(s),s.unrender.bind(s),[a]),o.renderEventSelection=t.memoizeRendering(s.selectByInstanceId.bind(s),s.unselectByInstanceId.bind(s),[o.renderFgEvents]),o.renderEventDrag=t.memoizeRendering(o._renderEventDrag,o._unrenderEventDrag,[a]),o.renderEventResize=t.memoizeRendering(o._renderEventResize,o._unrenderEventResize,[a]),o.renderProps=i,o}return r(n,e),n.prototype.render=function(e){var t=e.cells;this.rowCnt=t.length,this.colCnt=t[0].length,this.renderCells(t,e.isRigid),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderBgEvents(e.bgEventSegs),this.renderFgEvents(e.fgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize),this.segPopoverTile&&this.updateSegPopoverTile()},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderCells.unrender()},n.prototype.getCellRange=function(e,r){var n=this.props.cells[e][r].date;return{start:n,end:t.addDays(n,1)}},n.prototype.updateSegPopoverTile=function(e,t){var r=this.props;this.segPopoverTile.receiveProps({date:e||this.segPopoverTile.props.date,fgSegs:t||this.segPopoverTile.props.fgSegs,eventSelection:r.eventSelection,eventDragInstances:r.eventDrag?r.eventDrag.affectedInstances:null,eventResizeInstances:r.eventResize?r.eventResize.affectedInstances:null})},n.prototype._renderCells=function(e,r){var n,i,o=this,s=o.view,l=o.dateEnv,a=this,d=a.rowCnt,c=a.colCnt,h="";for(n=0;n<d;n++)h+=this.renderDayRowHtml(n,r);for(this.el.innerHTML=h,this.rowEls=t.findElements(this.el,".fc-row"),this.cellEls=t.findElements(this.el,".fc-day, .fc-disabled-day"),this.isRtl&&this.cellEls.reverse(),this.rowPositions=new t.PositionCache(this.el,this.rowEls,!1,!0),this.colPositions=new t.PositionCache(this.el,this.cellEls.slice(0,c),!0,!1),n=0;n<d;n++)for(i=0;i<c;i++)this.publiclyTrigger("dayRender",[{date:l.toDate(e[n][i].date),el:this.getCellEl(n,i),view:s}]);this.isCellSizesDirty=!0},n.prototype._unrenderCells=function(){this.removeSegPopover()},n.prototype.renderDayRowHtml=function(e,t){var r=this.theme,n=["fc-row","fc-week",r.getClass("dayRow")];t&&n.push("fc-rigid");var i=new y(this.context);return'<div class="'+n.join(" ")+'"><div class="fc-bg"><table class="'+r.getClass("tableGrid")+'">'+i.renderHtml({cells:this.props.cells[e],dateProfile:this.props.dateProfile,renderIntroHtml:this.renderProps.renderBgIntroHtml})+'</table></div><div class="fc-content-skeleton"><table>'+(this.getIsNumbersVisible()?"<thead>"+this.renderNumberTrHtml(e)+"</thead>":"")+"</table></div></div>"},n.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.renderProps.cellWeekNumbersVisible||this.renderProps.colWeekNumbersVisible},n.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},n.prototype.renderNumberTrHtml=function(e){var t=this.renderProps.renderNumberIntroHtml(e,this);return"<tr>"+(this.isRtl?"":t)+this.renderNumberCellsHtml(e)+(this.isRtl?t:"")+"</tr>"},n.prototype.renderNumberCellsHtml=function(e){var t,r,n=[];for(t=0;t<this.colCnt;t++)r=this.props.cells[e][t].date,n.push(this.renderNumberCellHtml(r));return this.isRtl&&n.reverse(),n.join("")},n.prototype.renderNumberCellHtml=function(e){var r,n,i=this,o=i.view,s=i.dateEnv,l="",a=t.rangeContainsMarker(this.props.dateProfile.activeRange,e),d=this.getIsDayNumbersVisible()&&a;return d||this.renderProps.cellWeekNumbersVisible?(r=t.getDayClasses(e,this.props.dateProfile,this.context),r.unshift("fc-day-top"),this.renderProps.cellWeekNumbersVisible&&(n=s.weekDow),l+='<td class="'+r.join(" ")+'"'+(a?' data-date="'+s.formatIso(e,{omitTime:!0})+'"':"")+">",this.renderProps.cellWeekNumbersVisible&&e.getUTCDay()===n&&(l+=t.buildGotoAnchorHtml(o,{date:e,type:"week"},{class:"fc-week-number"},s.format(e,b))),d&&(l+=t.buildGotoAnchorHtml(o,e,{class:"fc-day-number"},s.format(e,v))),l+="</td>"):"<td></td>"},n.prototype.updateSize=function(e){var t=this,r=t.fillRenderer,n=t.eventRenderer,i=t.mirrorRenderer;(e||this.isCellSizesDirty||this.view.calendar.isEventsUpdated)&&(this.buildPositionCaches(),this.isCellSizesDirty=!1),r.computeSizes(e),n.computeSizes(e),i.computeSizes(e),r.assignSizes(e),n.assignSizes(e),i.assignSizes(e)},n.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildRowPositions()},n.prototype.buildColPositions=function(){this.colPositions.build()},n.prototype.buildRowPositions=function(){this.rowPositions.build(),this.rowPositions.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},n.prototype.positionToHit=function(e,t){var r=this,n=r.colPositions,i=r.rowPositions,o=n.leftToIndex(e),s=i.topToIndex(t);if(null!=s&&null!=o)return{row:s,col:o,dateSpan:{range:this.getCellRange(s,o),allDay:!0},dayEl:this.getCellEl(s,o),relativeRect:{left:n.lefts[o],right:n.rights[o],top:i.tops[s],bottom:i.bottoms[s]}}},n.prototype.getCellEl=function(e,t){return this.cellEls[e*this.colCnt+t]},n.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs))},n.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"))},n.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs),this.mirrorRenderer.renderSegs(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},n.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"),this.mirrorRenderer.unrender(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},n.prototype.removeSegPopover=function(){this.segPopover&&this.segPopover.hide()},n.prototype.limitRows=function(e){var t,r,n=this.eventRenderer.rowStructs||[];for(t=0;t<n.length;t++)this.unlimitRow(t),!1!==(r=!!e&&("number"==typeof e?e:this.computeRowLevelLimit(t)))&&this.limitRow(t,r)},n.prototype.computeRowLevelLimit=function(e){var r,n,i=this.rowEls[e],o=i.getBoundingClientRect().bottom,s=t.findChildren(this.eventRenderer.rowStructs[e].tbodyEl);for(r=0;r<s.length;r++)if(n=s[r],n.classList.remove("fc-limited"),n.getBoundingClientRect().bottom>o)return r;return!1},n.prototype.limitRow=function(e,r){var n,i,o,s,l,a,d,c,h,p,u,f,g,m,y,v=this,b=this,w=b.colCnt,S=b.isRtl,C=this.eventRenderer.rowStructs[e],E=[],R=0,H=function(n){for(;R<n;)a=v.getCellSegs(e,R,r),a.length&&(h=i[r-1][R],y=v.renderMoreLink(e,R,a),m=t.createElement("div",null,y),h.appendChild(m),E.push(m)),R++};if(r&&r<C.segLevels.length){for(n=C.segLevels[r-1],i=C.cellMatrix,o=t.findChildren(C.tbodyEl).slice(r),o.forEach(function(e){e.classList.add("fc-limited")}),s=0;s<n.length;s++){l=n[s];var D=S?w-1-l.lastCol:l.firstCol,P=S?w-1-l.firstCol:l.lastCol;for(H(D),c=[],d=0;R<=P;)a=this.getCellSegs(e,R,r),c.push(a),d+=a.length,R++;if(d){for(h=i[r-1][D],p=h.rowSpan||1,u=[],f=0;f<c.length;f++)g=t.createElement("td",{className:"fc-more-cell",rowSpan:p}),a=c[f],y=this.renderMoreLink(e,D+f,[l].concat(a)),m=t.createElement("div",null,y),g.appendChild(m),u.push(g),E.push(g);h.classList.add("fc-limited"),t.insertAfterElement(h,u),o.push(h)}}H(this.colCnt),C.moreEls=E,C.limitedEls=o}},n.prototype.unlimitRow=function(e){var r=this.eventRenderer.rowStructs[e];r.moreEls&&(r.moreEls.forEach(t.removeElement),r.moreEls=null),r.limitedEls&&(r.limitedEls.forEach(function(e){e.classList.remove("fc-limited")}),r.limitedEls=null)},n.prototype.renderMoreLink=function(e,r,n){var i=this,o=this,s=o.view,l=o.dateEnv,a=t.createElement("a",{className:"fc-more"});return a.innerText=this.getMoreLinkText(n.length),a.addEventListener("click",function(t){var o=i.opt("eventLimitClick"),a=i.isRtl?i.colCnt-r-1:r,d=i.props.cells[e][a].date,c=t.currentTarget,h=i.getCellEl(e,r),p=i.getCellSegs(e,r),u=i.resliceDaySegs(p,d),f=i.resliceDaySegs(n,d);"function"==typeof o&&(o=i.publiclyTrigger("eventLimitClick",[{date:l.toDate(d),allDay:!0,dayEl:h,moreEl:c,segs:u,hiddenSegs:f,jsEvent:t,view:s}])),"popover"===o?i.showSegPopover(e,r,c,u):"string"==typeof o&&s.calendar.zoomTo(d,o)}),a},n.prototype.showSegPopover=function(e,r,n,i){var o,s,l=this,a=this,d=a.calendar,h=a.view,p=a.theme,u=this.isRtl?this.colCnt-r-1:r,f=n.parentNode;o=1===this.rowCnt?h.el:this.rowEls[e],s={className:"fc-more-popover "+p.getClass("popover"),parentEl:h.el,top:t.computeRect(o).top,autoHide:!0,content:function(t){l.segPopoverTile=new g(l.context,t),l.updateSegPopoverTile(l.props.cells[e][u].date,i)},hide:function(){l.segPopoverTile.destroy(),l.segPopoverTile=null,l.segPopover.destroy(),l.segPopover=null}},this.isRtl?s.right=t.computeRect(f).right+1:s.left=t.computeRect(f).left-1,this.segPopover=new c(s),this.segPopover.show(),d.releaseAfterSizingTriggers()},n.prototype.resliceDaySegs=function(e,r){for(var n=r,i=t.addDays(n,1),o={start:n,end:i},s=[],l=0,d=e;l<d.length;l++){var c=d[l],h=c.eventRange,p=h.range,u=t.intersectRanges(p,o);u&&s.push(a({},c,{eventRange:{def:h.def,ui:a({},h.ui,{durationEditable:!1}),instance:h.instance,range:u},isStart:c.isStart&&u.start.valueOf()===p.start.valueOf(),isEnd:c.isEnd&&u.end.valueOf()===p.end.valueOf()}))}return s},n.prototype.getMoreLinkText=function(e){var t=this.opt("eventLimitText");return"function"==typeof t?t(e):"+"+e+" "+t},n.prototype.getCellSegs=function(e,t,r){for(var n,i=this.eventRenderer.rowStructs[e].segMatrix,o=r||0,s=[];o<i.length;)n=i[o][t],n&&s.push(n),o++;return s},n}(t.DateComponent),S=t.createFormatter({week:"numeric"}),C=function(e){function n(r,n,i,o){var s=e.call(this,r,n,i,o)||this;s.renderHeadIntroHtml=function(){var e=s.theme;return s.colWeekNumbersVisible?'<th class="fc-week-number '+e.getClass("widgetHeader")+'" '+s.weekNumberStyleAttr()+"><span>"+t.htmlEscape(s.opt("weekLabel"))+"</span></th>":""},s.renderDayGridNumberIntroHtml=function(e,r){var n=s.dateEnv,i=r.props.cells[e][0].date;return s.colWeekNumbersVisible?'<td class="fc-week-number" '+s.weekNumberStyleAttr()+">"+t.buildGotoAnchorHtml(s,{date:i,type:"week",forceOff:1===r.colCnt},n.format(i,S))+"</td>":""},s.renderDayGridBgIntroHtml=function(){var e=s.theme;return s.colWeekNumbersVisible?'<td class="fc-week-number '+e.getClass("widgetContent")+'" '+s.weekNumberStyleAttr()+"></td>":""},s.renderDayGridIntroHtml=function(){return s.colWeekNumbersVisible?'<td class="fc-week-number" '+s.weekNumberStyleAttr()+"></td>":""},s.el.classList.add("fc-dayGrid-view"),s.el.innerHTML=s.renderSkeletonHtml(),s.scroller=new t.ScrollComponent("hidden","auto");var l=s.scroller.el;s.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-day-grid-container");var a=t.createElement("div",{className:"fc-day-grid"});l.appendChild(a);var d;return s.opt("weekNumbers")?s.opt("weekNumbersWithinDays")?(d=!0,s.colWeekNumbersVisible=!1):(d=!1,s.colWeekNumbersVisible=!0):(s.colWeekNumbersVisible=!1,d=!1),s.dayGrid=new w(s.context,a,{renderNumberIntroHtml:s.renderDayGridNumberIntroHtml,renderBgIntroHtml:s.renderDayGridBgIntroHtml,renderIntroHtml:s.renderDayGridIntroHtml,colWeekNumbersVisible:s.colWeekNumbersVisible,cellWeekNumbersVisible:d}),s}return r(n,e),n.prototype.destroy=function(){e.prototype.destroy.call(this),this.dayGrid.destroy(),this.scroller.destroy()},n.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'">'+(this.opt("columnHeader")?'<thead class="fc-head"><tr><td class="fc-head-container '+e.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+e.getClass("widgetContent")+'"></td></tr></tbody></table>'},n.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},n.prototype.hasRigidRows=function(){var e=this.opt("eventLimit");return e&&"number"!=typeof e},n.prototype.updateSize=function(t,r,n){e.prototype.updateSize.call(this,t,r,n),this.dayGrid.updateSize(t)},n.prototype.updateBaseSize=function(e,r,n){var i,o,s=this.dayGrid,l=this.opt("eventLimit"),a=this.header?this.header.el:null;if(!s.rowEls)return void(n||(i=this.computeScrollerHeight(r),this.scroller.setHeight(i)));this.colWeekNumbersVisible&&(this.weekNumberWidth=t.matchCellWidths(t.findElements(this.el,".fc-week-number"))),this.scroller.clear(),a&&t.uncompensateScroll(a),s.removeSegPopover(),l&&"number"==typeof l&&s.limitRows(l),i=this.computeScrollerHeight(r),this.setGridHeight(i,n),l&&"number"!=typeof l&&s.limitRows(l),n||(this.scroller.setHeight(i),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(a&&t.compensateScroll(a,o),i=this.computeScrollerHeight(r),this.scroller.setHeight(i)),this.scroller.lockOverflow(o))},n.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},n.prototype.setGridHeight=function(e,r){this.opt("monthMode")?(r&&(e*=this.dayGrid.rowCnt/6),t.distributeHeight(this.dayGrid.rowEls,e,!r)):r?t.undistributeHeight(this.dayGrid.rowEls):t.distributeHeight(this.dayGrid.rowEls,e,!0)},n.prototype.computeDateScroll=function(e){return{top:0}},n.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},n.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},n}(t.View);C.prototype.dateProfileGeneratorClass=d;var E=function(e){function t(t,r){var n=e.call(this,t,r.el)||this;return n.slicer=new R,n.dayGrid=r,t.calendar.registerInteractiveComponent(n,{el:n.dayGrid.el}),n}return r(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},t.prototype.render=function(e){var t=this.dayGrid,r=e.dateProfile,n=e.dayTable;t.receiveProps(a({},this.slicer.sliceProps(e,r,e.nextDayThreshold,t,n),{dateProfile:r,cells:n.cells,isRigid:e.isRigid}))},t.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},t.prototype.queryHit=function(e,t){var r=this.dayGrid.positionToHit(e,t);if(r)return{component:this.dayGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},t}(t.DateComponent),R=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return r(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(t.Slicer),H=function(e){function n(r,n,i,o){var l=e.call(this,r,n,i,o)||this;return l.buildDayTable=t.memoize(s),l.opt("columnHeader")&&(l.header=new t.DayHeader(l.context,l.el.querySelector(".fc-head-container"))),l.simpleDayGrid=new E(l.context,l.dayGrid),l}return r(n,e),n.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.simpleDayGrid.destroy()},n.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.props.dateProfile,n=this.dayTable=this.buildDayTable(r,this.dateProfileGenerator);this.header&&this.header.receiveProps({dateProfile:r,dates:n.headerDates,datesRepDistinctDays:1===n.rowCnt,renderIntroHtml:this.renderHeadIntroHtml}),this.simpleDayGrid.receiveProps({dateProfile:r,dayTable:n,businessHours:t.businessHours,dateSelection:t.dateSelection,eventStore:t.eventStore,eventUiBases:t.eventUiBases,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},n}(C),D=t.createPlugin({defaultView:"dayGridMonth",views:{dayGrid:H,dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.AbstractDayGridView=C,e.DayBgRow=y,e.DayGrid=w,e.DayGridSlicer=R,e.DayGridView=H,e.SimpleDayGrid=E,e.buildBasicDayTable=s,e.default=D,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/daygrid/package.json b/backoffice/vendors/fullcalendar/daygrid/package.json
new file mode 100644 (file)
index 0000000..88bbfe0
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "@fullcalendar/daygrid",
+  "_id": "@fullcalendar/daygrid@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-y2w+js+cr0SFC3f88QIS91V8LeZ5TEG/W6hX+CcokP+KTZdepW0uCjPzf9QwVE0LM904tZ2kjCe209hZGfSNGg==",
+  "_location": "/@fullcalendar/daygrid",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/daygrid",
+    "name": "@fullcalendar/daygrid",
+    "escapedName": "@fullcalendar%2fdaygrid",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-4.1.0.tgz",
+  "_shasum": "058b02585d17a63f448e2ab42f65db7bacca2296",
+  "_spec": "@fullcalendar/daygrid",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "Display events on Month view or DayGrid view",
+  "docs": "https://fullcalendar.io/docs/month-view",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/daygrid",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Day Grid Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.css b/backoffice/vendors/fullcalendar/fullcalendar.css
deleted file mode 100644 (file)
index dcbc999..0000000
+++ /dev/null
@@ -1,1293 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-.fc {
-  direction: ltr;
-  text-align: left; }
-
-.fc-rtl {
-  text-align: right; }
-
-body .fc {
-  /* extra precedence to overcome jqui */
-  font-size: 1em; }
-
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-highlight {
-  /* when user is selecting cells */
-  background: #bce8f1;
-  opacity: .3; }
-
-.fc-bgevent {
-  /* default look for background events */
-  background: #8fdf82;
-  opacity: .3; }
-
-.fc-nonbusiness {
-  /* default look for non-business-hours areas */
-  /* will inherit .fc-bgevent's styles */
-  background: #d7d7d7; }
-
-/* Buttons (styled <button> tags, normalized to work cross-browser)
---------------------------------------------------------------------------------------------------*/
-.fc button {
-  /* force height to include the border and padding */
-  -moz-box-sizing: border-box;
-  -webkit-box-sizing: border-box;
-  box-sizing: border-box;
-  /* dimensions */
-  margin: 0;
-  height: 2.1em;
-  padding: 0 .6em;
-  /* text & cursor */
-  font-size: 1em;
-  /* normalize */
-  white-space: nowrap;
-  cursor: pointer; }
-
-/* Firefox has an annoying inner border */
-.fc button::-moz-focus-inner {
-  margin: 0;
-  padding: 0; }
-
-.fc-state-default {
-  /* non-theme */
-  border: 1px solid; }
-
-.fc-state-default.fc-corner-left {
-  /* non-theme */
-  border-top-left-radius: 4px;
-  border-bottom-left-radius: 4px; }
-
-.fc-state-default.fc-corner-right {
-  /* non-theme */
-  border-top-right-radius: 4px;
-  border-bottom-right-radius: 4px; }
-
-/* icons in buttons */
-.fc button .fc-icon {
-  /* non-theme */
-  position: relative;
-  top: -0.05em;
-  /* seems to be a good adjustment across browsers */
-  margin: 0 .2em;
-  vertical-align: middle; }
-
-/*
-  button states
-  borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)
-*/
-.fc-state-default {
-  background-color: #f5f5f5;
-  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
-  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
-  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
-  background-repeat: repeat-x;
-  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
-  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
-  color: #333;
-  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
-  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); }
-
-.fc-state-hover,
-.fc-state-down,
-.fc-state-active,
-.fc-state-disabled {
-  color: #333333;
-  background-color: #e6e6e6; }
-
-.fc-state-hover {
-  color: #333333;
-  text-decoration: none;
-  background-position: 0 -15px;
-  -webkit-transition: background-position 0.1s linear;
-  -moz-transition: background-position 0.1s linear;
-  -o-transition: background-position 0.1s linear;
-  transition: background-position 0.1s linear; }
-
-.fc-state-down,
-.fc-state-active {
-  background-color: #cccccc;
-  background-image: none;
-  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); }
-
-.fc-state-disabled {
-  cursor: default;
-  background-image: none;
-  opacity: 0.65;
-  box-shadow: none; }
-
-/* Buttons Groups
---------------------------------------------------------------------------------------------------*/
-.fc-button-group {
-  display: inline-block; }
-
-/*
-every button that is not first in a button group should scootch over one pixel and cover the
-previous button's border...
-*/
-.fc .fc-button-group > * {
-  /* extra precedence b/c buttons have margin set to zero */
-  float: left;
-  margin: 0 0 0 -1px; }
-
-.fc .fc-button-group > :first-child {
-  /* same */
-  margin-left: 0; }
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-popover {
-  position: absolute;
-  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); }
-
-.fc-popover .fc-header {
-  /* TODO: be more consistent with fc-head/fc-body */
-  padding: 2px 4px; }
-
-.fc-popover .fc-header .fc-title {
-  margin: 0 2px; }
-
-.fc-popover .fc-header .fc-close {
-  cursor: pointer; }
-
-.fc-ltr .fc-popover .fc-header .fc-title,
-.fc-rtl .fc-popover .fc-header .fc-close {
-  float: left; }
-
-.fc-rtl .fc-popover .fc-header .fc-title,
-.fc-ltr .fc-popover .fc-header .fc-close {
-  float: right; }
-
-/* Misc Reusable Components
---------------------------------------------------------------------------------------------------*/
-.fc-divider {
-  border-style: solid;
-  border-width: 1px; }
-
-hr.fc-divider {
-  height: 0;
-  margin: 0;
-  padding: 0 0 2px;
-  /* height is unreliable across browsers, so use padding */
-  border-width: 1px 0; }
-
-.fc-clear {
-  clear: both; }
-
-.fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-helper-skeleton {
-  /* these element should always cling to top-left/right corners */
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0; }
-
-.fc-bg {
-  bottom: 0;
-  /* strech bg to bottom edge */ }
-
-.fc-bg table {
-  height: 100%;
-  /* strech bg to bottom edge */ }
-
-/* Tables
---------------------------------------------------------------------------------------------------*/
-.fc table {
-  width: 100%;
-  box-sizing: border-box;
-  /* fix scrollbar issue in firefox */
-  table-layout: fixed;
-  border-collapse: collapse;
-  border-spacing: 0;
-  font-size: 1em;
-  /* normalize cross-browser */ }
-
-.fc th {
-  text-align: center; }
-
-.fc th,
-.fc td {
-  border-style: solid;
-  border-width: 1px;
-  padding: 0;
-  vertical-align: top; }
-
-.fc td.fc-today {
-  border-style: double;
-  /* overcome neighboring borders */ }
-
-/* Internal Nav Links
---------------------------------------------------------------------------------------------------*/
-a[data-goto] {
-  cursor: pointer; }
-
-a[data-goto]:hover {
-  text-decoration: underline; }
-
-/* Fake Table Rows
---------------------------------------------------------------------------------------------------*/
-.fc .fc-row {
-  /* extra precedence to overcome themes w/ .ui-widget-content forcing a 1px border */
-  /* no visible border by default. but make available if need be (scrollbar width compensation) */
-  border-style: solid;
-  border-width: 0; }
-
-.fc-row table {
-  /* don't put left/right border on anything within a fake row.
-     the outer tbody will worry about this */
-  border-left: 0 hidden transparent;
-  border-right: 0 hidden transparent;
-  /* no bottom borders on rows */
-  border-bottom: 0 hidden transparent; }
-
-.fc-row:first-child table {
-  border-top: 0 hidden transparent;
-  /* no top border on first row */ }
-
-/* Day Row (used within the header and the DayGrid)
---------------------------------------------------------------------------------------------------*/
-.fc-row {
-  position: relative; }
-
-.fc-row .fc-bg {
-  z-index: 1; }
-
-/* highlighting cells & background event skeleton */
-.fc-row .fc-bgevent-skeleton,
-.fc-row .fc-highlight-skeleton {
-  bottom: 0;
-  /* stretch skeleton to bottom of row */ }
-
-.fc-row .fc-bgevent-skeleton table,
-.fc-row .fc-highlight-skeleton table {
-  height: 100%;
-  /* stretch skeleton to bottom of row */ }
-
-.fc-row .fc-highlight-skeleton td,
-.fc-row .fc-bgevent-skeleton td {
-  border-color: transparent; }
-
-.fc-row .fc-bgevent-skeleton {
-  z-index: 2; }
-
-.fc-row .fc-highlight-skeleton {
-  z-index: 3; }
-
-/*
-row content (which contains day/week numbers and events) as well as "helper" (which contains
-temporary rendered events).
-*/
-.fc-row .fc-content-skeleton {
-  position: relative;
-  z-index: 4;
-  padding-bottom: 2px;
-  /* matches the space above the events */ }
-
-.fc-row .fc-helper-skeleton {
-  z-index: 5; }
-
-.fc .fc-row .fc-content-skeleton table,
-.fc .fc-row .fc-content-skeleton td,
-.fc .fc-row .fc-helper-skeleton td {
-  /* see-through to the background below */
-  /* extra precedence to prevent theme-provided backgrounds */
-  background: none;
-  /* in case <td>s are globally styled */
-  border-color: transparent; }
-
-.fc-row .fc-content-skeleton td,
-.fc-row .fc-helper-skeleton td {
-  /* don't put a border between events and/or the day number */
-  border-bottom: 0; }
-
-.fc-row .fc-content-skeleton tbody td,
-.fc-row .fc-helper-skeleton tbody td {
-  /* don't put a border between event cells */
-  border-top: 0; }
-
-/* Scrolling Container
---------------------------------------------------------------------------------------------------*/
-.fc-scroller {
-  -webkit-overflow-scrolling: touch; }
-
-/* TODO: move to agenda/basic */
-.fc-scroller > .fc-day-grid,
-.fc-scroller > .fc-time-grid {
-  position: relative;
-  /* re-scope all positions */
-  width: 100%;
-  /* hack to force re-sizing this inner element when scrollbars appear/disappear */ }
-
-/* Global Event Styles
---------------------------------------------------------------------------------------------------*/
-.fc-event {
-  position: relative;
-  /* for resize handle and other inner positioning */
-  display: block;
-  /* make the <a> tag block */
-  font-size: .85em;
-  line-height: 1.3;
-  border-radius: 3px;
-  border: 1px solid #3a87ad;
-  /* default BORDER color */ }
-
-.fc-event,
-.fc-event-dot {
-  background-color: #3a87ad;
-  /* default BACKGROUND color */ }
-
-.fc-event,
-.fc-event:hover {
-  color: #fff;
-  /* default TEXT color */
-  text-decoration: none;
-  /* if <a> has an href */ }
-
-.fc-event[href],
-.fc-event.fc-draggable {
-  cursor: pointer;
-  /* give events with links and draggable events a hand mouse pointer */ }
-
-.fc-not-allowed,
-.fc-not-allowed .fc-event {
-  /* to override an event's custom cursor */
-  cursor: not-allowed; }
-
-.fc-event .fc-bg {
-  /* the generic .fc-bg already does position */
-  z-index: 1;
-  background: #fff;
-  opacity: .25; }
-
-.fc-event .fc-content {
-  position: relative;
-  z-index: 2; }
-
-/* resizer (cursor AND touch devices) */
-.fc-event .fc-resizer {
-  position: absolute;
-  z-index: 4; }
-
-/* resizer (touch devices) */
-.fc-event .fc-resizer {
-  display: none; }
-
-.fc-event.fc-allow-mouse-resize .fc-resizer,
-.fc-event.fc-selected .fc-resizer {
-  /* only show when hovering or selected (with touch) */
-  display: block; }
-
-/* hit area */
-.fc-event.fc-selected .fc-resizer:before {
-  /* 40x40 touch area */
-  content: "";
-  position: absolute;
-  z-index: 9999;
-  /* user of this util can scope within a lower z-index */
-  top: 50%;
-  left: 50%;
-  width: 40px;
-  height: 40px;
-  margin-left: -20px;
-  margin-top: -20px; }
-
-/* Event Selection (only for touch devices)
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-selected {
-  z-index: 9999 !important;
-  /* overcomes inline z-index */
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); }
-
-.fc-event.fc-selected.fc-dragging {
-  box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3); }
-
-/* Horizontal Events
---------------------------------------------------------------------------------------------------*/
-/* bigger touch area when selected */
-.fc-h-event.fc-selected:before {
-  content: "";
-  position: absolute;
-  z-index: 3;
-  /* below resizers */
-  top: -10px;
-  bottom: -10px;
-  left: 0;
-  right: 0; }
-
-/* events that are continuing to/from another week. kill rounded corners and butt up against edge */
-.fc-ltr .fc-h-event.fc-not-start,
-.fc-rtl .fc-h-event.fc-not-end {
-  margin-left: 0;
-  border-left-width: 0;
-  padding-left: 1px;
-  /* replace the border with padding */
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0; }
-
-.fc-ltr .fc-h-event.fc-not-end,
-.fc-rtl .fc-h-event.fc-not-start {
-  margin-right: 0;
-  border-right-width: 0;
-  padding-right: 1px;
-  /* replace the border with padding */
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0; }
-
-/* resizer (cursor AND touch devices) */
-/* left resizer  */
-.fc-ltr .fc-h-event .fc-start-resizer,
-.fc-rtl .fc-h-event .fc-end-resizer {
-  cursor: w-resize;
-  left: -1px;
-  /* overcome border */ }
-
-/* right resizer */
-.fc-ltr .fc-h-event .fc-end-resizer,
-.fc-rtl .fc-h-event .fc-start-resizer {
-  cursor: e-resize;
-  right: -1px;
-  /* overcome border */ }
-
-/* resizer (mouse devices) */
-.fc-h-event.fc-allow-mouse-resize .fc-resizer {
-  width: 7px;
-  top: -1px;
-  /* overcome top border */
-  bottom: -1px;
-  /* overcome bottom border */ }
-
-/* resizer (touch devices) */
-.fc-h-event.fc-selected .fc-resizer {
-  /* 8x8 little dot */
-  border-radius: 4px;
-  border-width: 1px;
-  width: 6px;
-  height: 6px;
-  border-style: solid;
-  border-color: inherit;
-  background: #fff;
-  /* vertically center */
-  top: 50%;
-  margin-top: -4px; }
-
-/* left resizer  */
-.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-end-resizer {
-  margin-left: -4px;
-  /* centers the 8x8 dot on the left edge */ }
-
-/* right resizer */
-.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-start-resizer {
-  margin-right: -4px;
-  /* centers the 8x8 dot on the right edge */ }
-
-/* DayGrid events
-----------------------------------------------------------------------------------------------------
-We use the full "fc-day-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-day-grid-event {
-  margin: 1px 2px 0;
-  /* spacing between events and edges */
-  padding: 0 1px; }
-
-tr:first-child > td > .fc-day-grid-event {
-  margin-top: 2px;
-  /* a little bit more space before the first event */ }
-
-.fc-day-grid-event.fc-selected:after {
-  content: "";
-  position: absolute;
-  z-index: 1;
-  /* same z-index as fc-bg, behind text */
-  /* overcome the borders */
-  top: -1px;
-  right: -1px;
-  bottom: -1px;
-  left: -1px;
-  /* darkening effect */
-  background: #000;
-  opacity: .25; }
-
-.fc-day-grid-event .fc-content {
-  /* force events to be one-line tall */
-  white-space: nowrap;
-  overflow: hidden; }
-
-.fc-day-grid-event .fc-time {
-  font-weight: bold; }
-
-/* resizer (cursor devices) */
-/* left resizer  */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer {
-  margin-left: -2px;
-  /* to the day cell's edge */ }
-
-/* right resizer */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer {
-  margin-right: -2px;
-  /* to the day cell's edge */ }
-
-/* Event Limiting
---------------------------------------------------------------------------------------------------*/
-/* "more" link that represents hidden events */
-a.fc-more {
-  margin: 1px 3px;
-  font-size: .85em;
-  cursor: pointer;
-  text-decoration: none; }
-
-a.fc-more:hover {
-  text-decoration: underline; }
-
-.fc-limited {
-  /* rows and cells that are hidden because of a "more" link */
-  display: none; }
-
-/* popover that appears when "more" link is clicked */
-.fc-day-grid .fc-row {
-  z-index: 1;
-  /* make the "more" popover one higher than this */ }
-
-.fc-more-popover {
-  z-index: 2;
-  width: 220px; }
-
-.fc-more-popover .fc-event-container {
-  padding: 10px; }
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-now-indicator {
-  position: absolute;
-  border: 0 solid red; }
-
-/* Utilities
---------------------------------------------------------------------------------------------------*/
-.fc-unselectable {
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-touch-callout: none;
-  -webkit-tap-highlight-color: transparent; }
-
-/*
-TODO: more distinction between this file and common.css
-*/
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed th,
-.fc-unthemed td,
-.fc-unthemed thead,
-.fc-unthemed tbody,
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-row,
-.fc-unthemed .fc-content,
-.fc-unthemed .fc-popover,
-.fc-unthemed .fc-list-view,
-.fc-unthemed .fc-list-heading td {
-  border-color: #ddd; }
-
-.fc-unthemed .fc-popover {
-  background-color: #fff; }
-
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-popover .fc-header,
-.fc-unthemed .fc-list-heading td {
-  background: #eee; }
-
-.fc-unthemed .fc-popover .fc-header .fc-close {
-  color: #666; }
-
-.fc-unthemed td.fc-today {
-  background: #fcf8e3; }
-
-.fc-unthemed .fc-disabled-day {
-  background: #d7d7d7;
-  opacity: .3; }
-
-/* Icons (inline elements with styled text that mock arrow icons)
---------------------------------------------------------------------------------------------------*/
-.fc-icon {
-  display: inline-block;
-  height: 1em;
-  line-height: 1em;
-  font-size: 1em;
-  text-align: center;
-  overflow: hidden;
-  font-family: "Courier New", Courier, monospace;
-  /* don't allow browser text-selection */
-  -webkit-touch-callout: none;
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none; }
-
-/*
-Acceptable font-family overrides for individual icons:
-  "Arial", sans-serif
-  "Times New Roman", serif
-
-NOTE: use percentage font sizes or else old IE chokes
-*/
-.fc-icon:after {
-  position: relative; }
-
-.fc-icon-left-single-arrow:after {
-  content: "\2039";
-  font-weight: bold;
-  font-size: 200%;
-  top: -7%; }
-
-.fc-icon-right-single-arrow:after {
-  content: "\203A";
-  font-weight: bold;
-  font-size: 200%;
-  top: -7%; }
-
-.fc-icon-left-double-arrow:after {
-  content: "\AB";
-  font-size: 160%;
-  top: -7%; }
-
-.fc-icon-right-double-arrow:after {
-  content: "\BB";
-  font-size: 160%;
-  top: -7%; }
-
-.fc-icon-left-triangle:after {
-  content: "\25C4";
-  font-size: 125%;
-  top: 3%; }
-
-.fc-icon-right-triangle:after {
-  content: "\25BA";
-  font-size: 125%;
-  top: 3%; }
-
-.fc-icon-down-triangle:after {
-  content: "\25BC";
-  font-size: 125%;
-  top: 2%; }
-
-.fc-icon-x:after {
-  content: "\D7";
-  font-size: 200%;
-  top: 6%; }
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-popover {
-  border-width: 1px;
-  border-style: solid; }
-
-.fc-unthemed .fc-popover .fc-header .fc-close {
-  font-size: .9em;
-  margin-top: 2px; }
-
-/* List View
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-list-item:hover td {
-  background-color: #f5f5f5; }
-
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.ui-widget .fc-disabled-day {
-  background-image: none; }
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-popover > .ui-widget-header + .ui-widget-content {
-  border-top: 0;
-  /* where they meet, let the header have the border */ }
-
-/* Global Event Styles
---------------------------------------------------------------------------------------------------*/
-.ui-widget .fc-event {
-  /* overpower jqui's styles on <a> tags. TODO: more DRY */
-  color: #fff;
-  /* default TEXT color */
-  text-decoration: none;
-  /* if <a> has an href */
-  /* undo ui-widget-header bold */
-  font-weight: normal; }
-
-/* TimeGrid axis running down the side (for both the all-day area and the slot area)
---------------------------------------------------------------------------------------------------*/
-.ui-widget td.fc-axis {
-  font-weight: normal;
-  /* overcome bold */ }
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-slats .ui-widget-content {
-  background: none;
-  /* see through to fc-bg */ }
-
-.fc.fc-bootstrap3 a {
-  text-decoration: none; }
-
-.fc.fc-bootstrap3 a[data-goto]:hover {
-  text-decoration: underline; }
-
-.fc-bootstrap3 hr.fc-divider {
-  border-color: inherit; }
-
-.fc-bootstrap3 .fc-today.alert {
-  border-radius: 0; }
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap3 .fc-popover .panel-body {
-  padding: 0; }
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap3 .fc-time-grid .fc-slats table {
-  /* some themes have background color. see through to slats */
-  background: none; }
-
-.fc.fc-bootstrap4 a {
-  text-decoration: none; }
-
-.fc.fc-bootstrap4 a[data-goto]:hover {
-  text-decoration: underline; }
-
-.fc-bootstrap4 hr.fc-divider {
-  border-color: inherit; }
-
-.fc-bootstrap4 .fc-today.alert {
-  border-radius: 0; }
-
-.fc-bootstrap4 a.fc-event:not([href]):not([tabindex]) {
-  color: #fff; }
-
-.fc-bootstrap4 .fc-popover.card {
-  position: absolute; }
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap4 .fc-popover .card-body {
-  padding: 0; }
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap4 .fc-time-grid .fc-slats table {
-  /* some themes have background color. see through to slats */
-  background: none; }
-
-/* Toolbar
---------------------------------------------------------------------------------------------------*/
-.fc-toolbar {
-  text-align: center; }
-
-.fc-toolbar.fc-header-toolbar {
-  margin-bottom: 1em; }
-
-.fc-toolbar.fc-footer-toolbar {
-  margin-top: 1em; }
-
-.fc-toolbar .fc-left {
-  float: left; }
-
-.fc-toolbar .fc-right {
-  float: right; }
-
-.fc-toolbar .fc-center {
-  display: inline-block; }
-
-/* the things within each left/right/center section */
-.fc .fc-toolbar > * > * {
-  /* extra precedence to override button border margins */
-  float: left;
-  margin-left: .75em; }
-
-/* the first thing within each left/center/right section */
-.fc .fc-toolbar > * > :first-child {
-  /* extra precedence to override button border margins */
-  margin-left: 0; }
-
-/* title text */
-.fc-toolbar h2 {
-  margin: 0; }
-
-/* button layering (for border precedence) */
-.fc-toolbar button {
-  position: relative; }
-
-.fc-toolbar .fc-state-hover,
-.fc-toolbar .ui-state-hover {
-  z-index: 2; }
-
-.fc-toolbar .fc-state-down {
-  z-index: 3; }
-
-.fc-toolbar .fc-state-active,
-.fc-toolbar .ui-state-active {
-  z-index: 4; }
-
-.fc-toolbar button:focus {
-  z-index: 5; }
-
-/* View Structure
---------------------------------------------------------------------------------------------------*/
-/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
-/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
-.fc-view-container *,
-.fc-view-container *:before,
-.fc-view-container *:after {
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box; }
-
-.fc-view,
-.fc-view > table {
-  /* so dragged elements can be above the view's main element */
-  position: relative;
-  z-index: 1; }
-
-/* BasicView
---------------------------------------------------------------------------------------------------*/
-/* day row structure */
-.fc-basicWeek-view .fc-content-skeleton,
-.fc-basicDay-view .fc-content-skeleton {
-  /* there may be week numbers in these views, so no padding-top */
-  padding-bottom: 1em;
-  /* ensure a space at bottom of cell for user selecting/clicking */ }
-
-.fc-basic-view .fc-body .fc-row {
-  min-height: 4em;
-  /* ensure that all rows are at least this tall */ }
-
-/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */
-.fc-row.fc-rigid {
-  overflow: hidden; }
-
-.fc-row.fc-rigid .fc-content-skeleton {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0; }
-
-/* week and day number styling */
-.fc-day-top.fc-other-month {
-  opacity: 0.3; }
-
-.fc-basic-view .fc-week-number,
-.fc-basic-view .fc-day-number {
-  padding: 2px; }
-
-.fc-basic-view th.fc-week-number,
-.fc-basic-view th.fc-day-number {
-  padding: 0 2px;
-  /* column headers can't have as much v space */ }
-
-.fc-ltr .fc-basic-view .fc-day-top .fc-day-number {
-  float: right; }
-
-.fc-rtl .fc-basic-view .fc-day-top .fc-day-number {
-  float: left; }
-
-.fc-ltr .fc-basic-view .fc-day-top .fc-week-number {
-  float: left;
-  border-radius: 0 0 3px 0; }
-
-.fc-rtl .fc-basic-view .fc-day-top .fc-week-number {
-  float: right;
-  border-radius: 0 0 0 3px; }
-
-.fc-basic-view .fc-day-top .fc-week-number {
-  min-width: 1.5em;
-  text-align: center;
-  background-color: #f2f2f2;
-  color: #808080; }
-
-/* when week/day number have own column */
-.fc-basic-view td.fc-week-number {
-  text-align: center; }
-
-.fc-basic-view td.fc-week-number > * {
-  /* work around the way we do column resizing and ensure a minimum width */
-  display: inline-block;
-  min-width: 1.25em; }
-
-/* AgendaView all-day area
---------------------------------------------------------------------------------------------------*/
-.fc-agenda-view .fc-day-grid {
-  position: relative;
-  z-index: 2;
-  /* so the "more.." popover will be over the time grid */ }
-
-.fc-agenda-view .fc-day-grid .fc-row {
-  min-height: 3em;
-  /* all-day section will never get shorter than this */ }
-
-.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton {
-  padding-bottom: 1em;
-  /* give space underneath events for clicking/selecting days */ }
-
-/* TimeGrid axis running down the side (for both the all-day area and the slot area)
---------------------------------------------------------------------------------------------------*/
-.fc .fc-axis {
-  /* .fc to overcome default cell styles */
-  vertical-align: middle;
-  padding: 0 4px;
-  white-space: nowrap; }
-
-.fc-ltr .fc-axis {
-  text-align: right; }
-
-.fc-rtl .fc-axis {
-  text-align: left; }
-
-/* TimeGrid Structure
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid-container,
-.fc-time-grid {
-  /* so slats/bg/content/etc positions get scoped within here */
-  position: relative;
-  z-index: 1; }
-
-.fc-time-grid {
-  min-height: 100%;
-  /* so if height setting is 'auto', .fc-bg stretches to fill height */ }
-
-.fc-time-grid table {
-  /* don't put outer borders on slats/bg/content/etc */
-  border: 0 hidden transparent; }
-
-.fc-time-grid > .fc-bg {
-  z-index: 1; }
-
-.fc-time-grid .fc-slats,
-.fc-time-grid > hr {
-  /* the <hr> AgendaView injects when grid is shorter than scroller */
-  position: relative;
-  z-index: 2; }
-
-.fc-time-grid .fc-content-col {
-  position: relative;
-  /* because now-indicator lives directly inside */ }
-
-.fc-time-grid .fc-content-skeleton {
-  position: absolute;
-  z-index: 3;
-  top: 0;
-  left: 0;
-  right: 0; }
-
-/* divs within a cell within the fc-content-skeleton */
-.fc-time-grid .fc-business-container {
-  position: relative;
-  z-index: 1; }
-
-.fc-time-grid .fc-bgevent-container {
-  position: relative;
-  z-index: 2; }
-
-.fc-time-grid .fc-highlight-container {
-  position: relative;
-  z-index: 3; }
-
-.fc-time-grid .fc-event-container {
-  position: relative;
-  z-index: 4; }
-
-.fc-time-grid .fc-now-indicator-line {
-  z-index: 5; }
-
-.fc-time-grid .fc-helper-container {
-  /* also is fc-event-container */
-  position: relative;
-  z-index: 6; }
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-slats td {
-  height: 1.5em;
-  border-bottom: 0;
-  /* each cell is responsible for its top border */ }
-
-.fc-time-grid .fc-slats .fc-minor td {
-  border-top-style: dotted; }
-
-/* TimeGrid Highlighting Slots
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-highlight-container {
-  /* a div within a cell within the fc-highlight-skeleton */
-  position: relative;
-  /* scopes the left/right of the fc-highlight to be in the column */ }
-
-.fc-time-grid .fc-highlight {
-  position: absolute;
-  left: 0;
-  right: 0;
-  /* top and bottom will be in by JS */ }
-
-/* TimeGrid Event Containment
---------------------------------------------------------------------------------------------------*/
-.fc-ltr .fc-time-grid .fc-event-container {
-  /* space on the sides of events for LTR (default) */
-  margin: 0 2.5% 0 2px; }
-
-.fc-rtl .fc-time-grid .fc-event-container {
-  /* space on the sides of events for RTL */
-  margin: 0 2px 0 2.5%; }
-
-.fc-time-grid .fc-event,
-.fc-time-grid .fc-bgevent {
-  position: absolute;
-  z-index: 1;
-  /* scope inner z-index's */ }
-
-.fc-time-grid .fc-bgevent {
-  /* background events always span full width */
-  left: 0;
-  right: 0; }
-
-/* Generic Vertical Event
---------------------------------------------------------------------------------------------------*/
-.fc-v-event.fc-not-start {
-  /* events that are continuing from another day */
-  /* replace space made by the top border with padding */
-  border-top-width: 0;
-  padding-top: 1px;
-  /* remove top rounded corners */
-  border-top-left-radius: 0;
-  border-top-right-radius: 0; }
-
-.fc-v-event.fc-not-end {
-  /* replace space made by the top border with padding */
-  border-bottom-width: 0;
-  padding-bottom: 1px;
-  /* remove bottom rounded corners */
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0; }
-
-/* TimeGrid Event Styling
-----------------------------------------------------------------------------------------------------
-We use the full "fc-time-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-time-grid-event {
-  overflow: hidden;
-  /* don't let the bg flow over rounded corners */ }
-
-.fc-time-grid-event.fc-selected {
-  /* need to allow touch resizers to extend outside event's bounding box */
-  /* common fc-selected styles hide the fc-bg, so don't need this anyway */
-  overflow: visible; }
-
-.fc-time-grid-event.fc-selected .fc-bg {
-  display: none;
-  /* hide semi-white background, to appear darker */ }
-
-.fc-time-grid-event .fc-content {
-  overflow: hidden;
-  /* for when .fc-selected */ }
-
-.fc-time-grid-event .fc-time,
-.fc-time-grid-event .fc-title {
-  padding: 0 1px; }
-
-.fc-time-grid-event .fc-time {
-  font-size: .85em;
-  white-space: nowrap; }
-
-/* short mode, where time and title are on the same line */
-.fc-time-grid-event.fc-short .fc-content {
-  /* don't wrap to second line (now that contents will be inline) */
-  white-space: nowrap; }
-
-.fc-time-grid-event.fc-short .fc-time,
-.fc-time-grid-event.fc-short .fc-title {
-  /* put the time and title on the same line */
-  display: inline-block;
-  vertical-align: top; }
-
-.fc-time-grid-event.fc-short .fc-time span {
-  display: none;
-  /* don't display the full time text... */ }
-
-.fc-time-grid-event.fc-short .fc-time:before {
-  content: attr(data-start);
-  /* ...instead, display only the start time */ }
-
-.fc-time-grid-event.fc-short .fc-time:after {
-  content: "\A0-\A0";
-  /* seperate with a dash, wrapped in nbsp's */ }
-
-.fc-time-grid-event.fc-short .fc-title {
-  font-size: .85em;
-  /* make the title text the same size as the time */
-  padding: 0;
-  /* undo padding from above */ }
-
-/* resizer (cursor device) */
-.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer {
-  left: 0;
-  right: 0;
-  bottom: 0;
-  height: 8px;
-  overflow: hidden;
-  line-height: 8px;
-  font-size: 11px;
-  font-family: monospace;
-  text-align: center;
-  cursor: s-resize; }
-
-.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after {
-  content: "="; }
-
-/* resizer (touch device) */
-.fc-time-grid-event.fc-selected .fc-resizer {
-  /* 10x10 dot */
-  border-radius: 5px;
-  border-width: 1px;
-  width: 8px;
-  height: 8px;
-  border-style: solid;
-  border-color: inherit;
-  background: #fff;
-  /* horizontally center */
-  left: 50%;
-  margin-left: -5px;
-  /* center on the bottom edge */
-  bottom: -5px; }
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-now-indicator-line {
-  border-top-width: 1px;
-  left: 0;
-  right: 0; }
-
-/* arrow on axis */
-.fc-time-grid .fc-now-indicator-arrow {
-  margin-top: -5px;
-  /* vertically center on top coordinate */ }
-
-.fc-ltr .fc-time-grid .fc-now-indicator-arrow {
-  left: 0;
-  /* triangle pointing right... */
-  border-width: 5px 0 5px 6px;
-  border-top-color: transparent;
-  border-bottom-color: transparent; }
-
-.fc-rtl .fc-time-grid .fc-now-indicator-arrow {
-  right: 0;
-  /* triangle pointing left... */
-  border-width: 5px 6px 5px 0;
-  border-top-color: transparent;
-  border-bottom-color: transparent; }
-
-/* List View
---------------------------------------------------------------------------------------------------*/
-/* possibly reusable */
-.fc-event-dot {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  border-radius: 5px; }
-
-/* view wrapper */
-.fc-rtl .fc-list-view {
-  direction: rtl;
-  /* unlike core views, leverage browser RTL */ }
-
-.fc-list-view {
-  border-width: 1px;
-  border-style: solid; }
-
-/* table resets */
-.fc .fc-list-table {
-  table-layout: auto;
-  /* for shrinkwrapping cell content */ }
-
-.fc-list-table td {
-  border-width: 1px 0 0;
-  padding: 8px 14px; }
-
-.fc-list-table tr:first-child td {
-  border-top-width: 0; }
-
-/* day headings with the list */
-.fc-list-heading {
-  border-bottom-width: 1px; }
-
-.fc-list-heading td {
-  font-weight: bold; }
-
-.fc-ltr .fc-list-heading-main {
-  float: left; }
-
-.fc-ltr .fc-list-heading-alt {
-  float: right; }
-
-.fc-rtl .fc-list-heading-main {
-  float: right; }
-
-.fc-rtl .fc-list-heading-alt {
-  float: left; }
-
-/* event list items */
-.fc-list-item.fc-has-url {
-  cursor: pointer;
-  /* whole row will be clickable */ }
-
-.fc-list-item-marker,
-.fc-list-item-time {
-  white-space: nowrap;
-  width: 1px; }
-
-/* make the dot closer to the event title */
-.fc-ltr .fc-list-item-marker {
-  padding-right: 0; }
-
-.fc-rtl .fc-list-item-marker {
-  padding-left: 0; }
-
-.fc-list-item-title a {
-  /* every event title cell has an <a> tag */
-  text-decoration: none;
-  color: inherit; }
-
-.fc-list-item-title a[href]:hover {
-  /* hover effect only on titles with hrefs */
-  text-decoration: underline; }
-
-/* message when no events */
-.fc-list-empty-wrap2 {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0; }
-
-.fc-list-empty-wrap1 {
-  width: 100%;
-  height: 100%;
-  display: table; }
-
-.fc-list-empty {
-  display: table-cell;
-  vertical-align: middle;
-  text-align: center; }
-
-.fc-unthemed .fc-list-empty {
-  /* theme will provide own background */
-  background-color: #eee; }
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.d.ts b/backoffice/vendors/fullcalendar/fullcalendar.d.ts
deleted file mode 100644 (file)
index 9221fe9..0000000
+++ /dev/null
@@ -1,2640 +0,0 @@
-declare module 'fullcalendar/src/util' {
-       import * as moment from 'moment';
-       export function compensateScroll(rowEls: any, scrollbarWidths: any): void;
-       export function uncompensateScroll(rowEls: any): void;
-       export function disableCursor(): void;
-       export function enableCursor(): void;
-       export function distributeHeight(els: any, availableHeight: any, shouldRedistribute: any): void;
-       export function undistributeHeight(els: any): void;
-       export function matchCellWidths(els: any): number;
-       export function subtractInnerElHeight(outerEl: any, innerEl: any): any;
-       export function getScrollParent(el: any): any;
-       export function getOuterRect(el: any, origin?: any): {
-           left: number;
-           right: any;
-           top: number;
-           bottom: any;
-       };
-       export function getClientRect(el: any, origin?: any): {
-           left: number;
-           right: any;
-           top: number;
-           bottom: any;
-       };
-       export function getContentRect(el: any, origin: any): {
-           left: number;
-           right: any;
-           top: number;
-           bottom: any;
-       };
-       export function getScrollbarWidths(el: any): any;
-       export function isPrimaryMouseButton(ev: any): boolean;
-       export function getEvX(ev: any): any;
-       export function getEvY(ev: any): any;
-       export function getEvIsTouch(ev: any): boolean;
-       export function preventSelection(el: any): void;
-       export function allowSelection(el: any): void;
-       export function preventDefault(ev: any): void;
-       export function intersectRects(rect1: any, rect2: any): false | {
-           left: number;
-           right: number;
-           top: number;
-           bottom: number;
-       };
-       export function constrainPoint(point: any, rect: any): {
-           left: number;
-           top: number;
-       };
-       export function getRectCenter(rect: any): {
-           left: number;
-           top: number;
-       };
-       export function diffPoints(point1: any, point2: any): {
-           left: number;
-           top: number;
-       };
-       export function parseFieldSpecs(input: any): any[];
-       export function compareByFieldSpecs(obj1: any, obj2: any, fieldSpecs: any, obj1fallback?: any, obj2fallback?: any): any;
-       export function compareByFieldSpec(obj1: any, obj2: any, fieldSpec: any, obj1fallback: any, obj2fallback: any): any;
-       export function flexibleCompare(a: any, b: any): number;
-       export const dayIDs: string[];
-       export const unitsDesc: string[];
-       export function diffDayTime(a: any, b: any): moment.Duration;
-       export function diffDay(a: any, b: any): moment.Duration;
-       export function diffByUnit(a: any, b: any, unit: any): moment.Duration;
-       export function computeGreatestUnit(start: any, end?: any): any;
-       export function computeDurationGreatestUnit(duration: any, durationInput: any): any;
-       export function divideRangeByDuration(start: any, end: any, dur: any): number;
-       export function divideDurationByDuration(dur1: any, dur2: any): number;
-       export function multiplyDuration(dur: any, n: any): moment.Duration;
-       export function durationHasTime(dur: any): boolean;
-       export function isNativeDate(input: any): boolean;
-       export function isTimeString(str: any): boolean;
-       export function log(...args: any[]): any;
-       export function warn(...args: any[]): any;
-       export function mergeProps(propObjs: any, complexProps?: any): {};
-       export function copyOwnProps(src: any, dest: any): void;
-       export function hasOwnProp(obj: any, name: any): any;
-       export function applyAll(functions: any, thisObj: any, args: any): any;
-       export function removeMatching(array: any, testFunc: any): number;
-       export function removeExact(array: any, exactVal: any): number;
-       export function isArraysEqual(a0: any, a1: any): boolean;
-       export function firstDefined(...args: any[]): any;
-       export function htmlEscape(s: any): string;
-       export function stripHtmlEntities(text: any): any;
-       export function cssToStr(cssProps: any): string;
-       export function attrsToStr(attrs: any): string;
-       export function capitaliseFirstLetter(str: any): any;
-       export function compareNumbers(a: any, b: any): number;
-       export function isInt(n: any): boolean;
-       export function proxy(obj: any, methodName: any): () => any;
-       export function debounce(func: any, wait: any, immediate?: boolean): () => any;
-}
-declare module 'fullcalendar/Mixin' {
-       export class Default {
-           static mixInto(destClass: any): void;
-           static mixOver(destClass: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EmitterMixin' {
-       import Mixin from 'fullcalendar/Mixin';
-       export interface EmitterInterface {
-           on(types: any, handler: any): any;
-           one(types: any, handler: any): any;
-           off(types: any, handler: any): any;
-           trigger(types: any, ...args: any[]): any;
-           triggerWith(types: any, context: any, args: any): any;
-           hasHandlers(type: any): any;
-       }
-       export class Default extends Mixin implements EmitterInterface {
-           on(types: any, handler: any): this;
-           one(types: any, handler: any): this;
-           _prepareIntercept(handler: any): (ev: any, extra: any) => any;
-           off(types: any, handler: any): this;
-           trigger(types: any, ...args: any[]): this;
-           triggerWith(types: any, context: any, args: any): this;
-           hasHandlers(type: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/TaskQueue' {
-       import { EmitterInterface } from 'fullcalendar/EmitterMixin';
-       export class Default {
-           on: EmitterInterface['on'];
-           one: EmitterInterface['one'];
-           off: EmitterInterface['off'];
-           trigger: EmitterInterface['trigger'];
-           triggerWith: EmitterInterface['triggerWith'];
-           hasHandlers: EmitterInterface['hasHandlers'];
-           q: any;
-           isPaused: boolean;
-           isRunning: boolean;
-           queue(...args: any[]): void;
-           pause(): void;
-           resume(): void;
-           getIsIdle(): boolean;
-           tryStart(): void;
-           canRunNext(): any;
-           runRemaining(): void;
-           runTask(task: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/RenderQueue' {
-       import TaskQueue from 'fullcalendar/TaskQueue';
-       export class Default extends TaskQueue {
-           waitsByNamespace: any;
-           waitNamespace: any;
-           waitId: any;
-           constructor(waitsByNamespace: any);
-           queue(taskFunc: any, namespace: any, type: any): void;
-           startWait(namespace: any, waitMs: any): void;
-           delayWait(waitMs: any): void;
-           spawnWait(waitMs: any): void;
-           clearWait(): void;
-           canRunNext(): boolean;
-           runTask(task: any): void;
-           compoundTask(newTask: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/options' {
-       export const globalDefaults: {
-           titleRangeSeparator: string;
-           monthYearFormat: string;
-           defaultTimedEventDuration: string;
-           defaultAllDayEventDuration: {
-               days: number;
-           };
-           forceEventDuration: boolean;
-           nextDayThreshold: string;
-           columnHeader: boolean;
-           defaultView: string;
-           aspectRatio: number;
-           header: {
-               left: string;
-               center: string;
-               right: string;
-           };
-           weekends: boolean;
-           weekNumbers: boolean;
-           weekNumberTitle: string;
-           weekNumberCalculation: string;
-           scrollTime: string;
-           minTime: string;
-           maxTime: string;
-           showNonCurrentDates: boolean;
-           lazyFetching: boolean;
-           startParam: string;
-           endParam: string;
-           timezoneParam: string;
-           timezone: boolean;
-           locale: any;
-           isRTL: boolean;
-           buttonText: {
-               prev: string;
-               next: string;
-               prevYear: string;
-               nextYear: string;
-               year: string;
-               today: string;
-               month: string;
-               week: string;
-               day: string;
-           };
-           allDayText: string;
-           agendaEventMinHeight: number;
-           theme: boolean;
-           dragOpacity: number;
-           dragRevertDuration: number;
-           dragScroll: boolean;
-           unselectAuto: boolean;
-           dropAccept: string;
-           eventOrder: string;
-           eventLimit: boolean;
-           eventLimitText: string;
-           eventLimitClick: string;
-           dayPopoverFormat: string;
-           handleWindowResize: boolean;
-           windowResizeDelay: number;
-           longPressDelay: number;
-       };
-       export const englishDefaults: {
-           dayPopoverFormat: string;
-       };
-       export const rtlDefaults: {
-           header: {
-               left: string;
-               center: string;
-               right: string;
-           };
-           buttonIcons: {
-               prev: string;
-               next: string;
-               prevYear: string;
-               nextYear: string;
-           };
-           themeButtonIcons: {
-               prev: string;
-               next: string;
-               nextYear: string;
-               prevYear: string;
-           };
-       };
-       export function mergeOptions(optionObjs: any): {};
-}
-declare module 'fullcalendar/Iterator' {
-       export class Default {
-           items: any;
-           constructor(items: any);
-           proxyCall(methodName: any, ...args: any[]): any[];
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ListenerMixin' {
-       import Mixin from 'fullcalendar/Mixin';
-       export interface ListenerInterface {
-           listenTo(other: any, arg: any, callback?: any): any;
-           stopListeningTo(other: any, eventName?: any): any;
-       }
-       export class Default extends Mixin implements ListenerInterface {
-           listenerId: any;
-           listenTo(other: any, arg: any, callback?: any): void;
-           stopListeningTo(other: any, eventName?: any): void;
-           getListenerNamespace(): string;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/GlobalEmitter' {
-       import { EmitterInterface } from 'fullcalendar/EmitterMixin';
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export class Default {
-           on: EmitterInterface['on'];
-           one: EmitterInterface['one'];
-           off: EmitterInterface['off'];
-           trigger: EmitterInterface['trigger'];
-           triggerWith: EmitterInterface['triggerWith'];
-           hasHandlers: EmitterInterface['hasHandlers'];
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           isTouching: boolean;
-           mouseIgnoreDepth: number;
-           handleScrollProxy: (ev: Event) => void;
-           handleTouchMoveProxy: (ev: Event) => void;
-           static get(): any;
-           static needed(): void;
-           static unneeded(): void;
-           bind(): void;
-           unbind(): void;
-           handleTouchStart(ev: any): void;
-           handleTouchMove(ev: any): void;
-           handleTouchCancel(ev: any): void;
-           handleTouchEnd(ev: any): void;
-           handleMouseDown(ev: any): void;
-           handleMouseMove(ev: any): void;
-           handleMouseUp(ev: any): void;
-           handleClick(ev: any): void;
-           handleSelectStart(ev: any): void;
-           handleContextMenu(ev: any): void;
-           handleScroll(ev: any): void;
-           stopTouch(ev: any, skipMouseIgnore?: boolean): void;
-           startTouchMouseIgnore(): void;
-           shouldIgnoreMouse(): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Toolbar' {
-       export class Default {
-           calendar: any;
-           toolbarOptions: any;
-           el: any;
-           viewsWithButtons: any;
-           constructor(calendar: any, toolbarOptions: any);
-           setToolbarOptions(newToolbarOptions: any): void;
-           render(): void;
-           removeElement(): void;
-           renderSection(position: any): JQuery;
-           updateTitle(text: any): void;
-           activateButton(buttonName: any): void;
-           deactivateButton(buttonName: any): void;
-           disableButton(buttonName: any): void;
-           enableButton(buttonName: any): void;
-           getViewsWithButtons(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/locale' {
-       import * as moment from 'moment';
-       export const localeOptionHash: {};
-       export function populateInstanceComputableOptions(options: any): void;
-       export function datepickerLocale(localeCode: any, dpLocaleCode: any, dpOptions: any): void;
-       export function locale(localeCode: any, newFcOptions: any): void;
-       export function getMomentLocaleData(localeCode: any): moment.Locale;
-}
-declare module 'fullcalendar/Class' {
-       export class Default {
-           static extend(members: any): any;
-           static mixin(members: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Model' {
-       import Class from 'fullcalendar/Class';
-       import { EmitterInterface } from 'fullcalendar/EmitterMixin';
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export class Default extends Class {
-           on: EmitterInterface['on'];
-           one: EmitterInterface['one'];
-           off: EmitterInterface['off'];
-           trigger: EmitterInterface['trigger'];
-           triggerWith: EmitterInterface['triggerWith'];
-           hasHandlers: EmitterInterface['hasHandlers'];
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           _props: any;
-           _watchers: any;
-           _globalWatchArgs: any;
-           constructor();
-           static watch(name: any, ...args: any[]): void;
-           constructed(): void;
-           applyGlobalWatchers(): void;
-           has(name: any): boolean;
-           get(name: any): any;
-           set(name: any, val: any): void;
-           reset(newProps: any): void;
-           unset(name: any): void;
-           setProps(newProps: any): void;
-           watch(name: any, depList: any, startFunc: any, stopFunc?: any): void;
-           unwatch(name: any): void;
-           _watchDeps(depList: any, startFunc: any, stopFunc: any): {
-               teardown: () => void;
-               flash: () => void;
-           };
-           flash(name: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/OptionsManager' {
-       import Model from 'fullcalendar/Model';
-       export class Default extends Model {
-           _calendar: any;
-           dirDefaults: any;
-           localeDefaults: any;
-           overrides: any;
-           dynamicOverrides: any;
-           constructor(_calendar: any, overrides: any);
-           add(newOptionHash: any): void;
-           compute(): void;
-           recordOverrides(newOptionHash: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ViewRegistry' {
-       export const viewHash: {};
-       export function defineView(viewName: any, viewConfig: any): void;
-       export function getViewConfig(viewName: any): any;
-}
-declare module 'fullcalendar/ViewSpecManager' {
-       export class Default {
-           _calendar: any;
-           optionsManager: any;
-           viewSpecCache: any;
-           constructor(optionsManager: any, _calendar: any);
-           clearCache(): void;
-           getViewSpec(viewType: any): any;
-           getUnitViewSpec(unit: any): any;
-           buildViewSpec(requestedViewType: any): any;
-           buildViewSpecOptions(spec: any): void;
-           buildViewSpecButtonText(spec: any, requestedViewType: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Theme' {
-       export class Default {
-           optionsManager: any;
-           classes: any;
-           iconClasses: any;
-           baseIconClass: string;
-           iconOverrideOption: any;
-           iconOverrideCustomButtonOption: any;
-           iconOverridePrefix: string;
-           constructor(optionsManager: any);
-           processIconOverride(): void;
-           setIconOverride(iconOverrideHash: any): void;
-           applyIconOverridePrefix(className: any): any;
-           getClass(key: any): any;
-           getIconClass(buttonName: any): string;
-           getCustomButtonIconClass(customButtonProps: any): string;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/moment-ext' {
-       import * as moment from 'moment'; module 'moment' {
-           interface Moment {
-               hasTime(): boolean;
-               time(): moment.Duration;
-               stripZone(): any;
-               stripTime(): any;
-           }
-       } let newMomentProto: any; let oldMomentProto: any; function oldMomentFormat(mom: any, formatStr?: any): any;
-       export { newMomentProto, oldMomentProto, oldMomentFormat }; const momentExt: any;
-       export default momentExt;
-}
-declare module 'fullcalendar/UnzonedRange' {
-       export class Default {
-           startMs: number;
-           endMs: number;
-           isStart: boolean;
-           isEnd: boolean;
-           constructor(startInput?: any, endInput?: any);
-           static invertRanges(ranges: any, constraintRange: any): any[];
-           intersect(otherRange: any): any;
-           intersectsWith(otherRange: any): boolean;
-           containsRange(innerRange: any): boolean;
-           containsDate(date: any): boolean;
-           constrainDate(date: any): any;
-           equals(otherRange: any): boolean;
-           clone(): Default;
-           getStart(): any;
-           getEnd(): any;
-           as(unit: any): number;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ComponentFootprint' {
-       export class Default {
-           unzonedRange: any;
-           isAllDay: boolean;
-           constructor(unzonedRange: any, isAllDay: any);
-           toLegacy(calendar: any): {
-               start: any;
-               end: any;
-           };
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventFootprint' {
-       export class Default {
-           componentFootprint: any;
-           eventDef: any;
-           eventInstance: any;
-           constructor(componentFootprint: any, eventDef: any, eventInstance: any);
-           getEventLegacy(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ParsableModelMixin' {
-       import Mixin from 'fullcalendar/Mixin';
-       export interface ParsableModelInterface {
-           applyProps(rawProps: any): any;
-           applyManualStandardProps(rawProps: any): any;
-           applyMiscProps(rawProps: any): any;
-           isStandardProp(propName: any): any;
-       }
-       export class Default extends Mixin implements ParsableModelInterface {
-           standardPropMap: any;
-           static defineStandardProps(propDefs: any): void;
-           static copyVerbatimStandardProps(src: any, dest: any): void;
-           applyProps(rawProps: any): boolean;
-           applyManualStandardProps(rawProps: any): boolean;
-           applyMiscProps(rawProps: any): void;
-           isStandardProp(propName: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventDef' {
-       import { default as ParsableModelMixin, ParsableModelInterface } from 'fullcalendar/ParsableModelMixin';
-       export abstract class Default {
-           static uuid: number;
-           static defineStandardProps: typeof ParsableModelMixin.defineStandardProps;
-           static copyVerbatimStandardProps: typeof ParsableModelMixin.copyVerbatimStandardProps;
-           applyProps: ParsableModelInterface['applyProps'];
-           isStandardProp: ParsableModelInterface['isStandardProp'];
-           source: any;
-           id: any;
-           rawId: any;
-           uid: any;
-           title: any;
-           url: any;
-           rendering: any;
-           constraint: any;
-           overlap: any;
-           editable: any;
-           startEditable: any;
-           durationEditable: any;
-           color: any;
-           backgroundColor: any;
-           borderColor: any;
-           textColor: any;
-           className: any;
-           miscProps: any;
-           constructor(source: any);
-           static parse(rawInput: any, source: any): any;
-           static normalizeId(id: any): string;
-           static generateId(): string;
-           abstract isAllDay(): any;
-           abstract buildInstances(unzonedRange: any): any;
-           clone(): any;
-           hasInverseRendering(): boolean;
-           hasBgRendering(): boolean;
-           getRendering(): any;
-           getConstraint(): any;
-           getOverlap(): any;
-           isStartExplicitlyEditable(): any;
-           isDurationExplicitlyEditable(): any;
-           isExplicitlyEditable(): any;
-           toLegacy(): any;
-           applyManualStandardProps(rawProps: any): boolean;
-           applyMiscProps(rawProps: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventInstance' {
-       export class Default {
-           def: any;
-           dateProfile: any;
-           constructor(def: any, dateProfile: any);
-           toLegacy(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventDateProfile' {
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       export class Default {
-           start: any;
-           end: any;
-           unzonedRange: any;
-           constructor(start: any, end: any, calendar: any);
-           static parse(rawProps: any, source: any): false | Default;
-           static isStandardProp(propName: any): boolean;
-           isAllDay(): boolean;
-           buildUnzonedRange(calendar: any): UnzonedRange;
-           getEnd(calendar: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/SingleEventDef' {
-       import EventDef from 'fullcalendar/EventDef';
-       import EventInstance from 'fullcalendar/EventInstance';
-       export class Default extends EventDef {
-           dateProfile: any;
-           buildInstances(): EventInstance[];
-           buildInstance(): EventInstance;
-           isAllDay(): any;
-           clone(): any;
-           rezone(): void;
-           applyManualStandardProps(rawProps: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/RecurringEventDef' {
-       import EventDef from 'fullcalendar/EventDef';
-       export class Default extends EventDef {
-           startTime: any;
-           endTime: any;
-           dowHash: any;
-           isAllDay(): boolean;
-           buildInstances(unzonedRange: any): any[];
-           setDow(dowNumbers: any): void;
-           clone(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventDefParser' {
-        const _default: {
-           parse: (eventInput: any, source: any) => any;
-       };
-       export default _default;
-}
-declare module 'fullcalendar/EventSource' {
-       import { default as ParsableModelMixin, ParsableModelInterface } from 'fullcalendar/ParsableModelMixin';
-       import Class from 'fullcalendar/Class';
-       import Calendar from 'fullcalendar/Calendar';
-       export class Default extends Class {
-           static uuid: number;
-           static defineStandardProps: typeof ParsableModelMixin.defineStandardProps;
-           static copyVerbatimStandardProps: typeof ParsableModelMixin.copyVerbatimStandardProps;
-           applyProps: ParsableModelInterface['applyProps'];
-           isStandardProp: ParsableModelInterface['isStandardProp'];
-           calendar: Calendar;
-           id: string;
-           uid: string;
-           color: string;
-           backgroundColor: string;
-           borderColor: string;
-           textColor: string;
-           className: string[];
-           editable: boolean;
-           startEditable: boolean;
-           durationEditable: boolean;
-           rendering: string | null;
-           overlap: boolean;
-           constraint: any;
-           allDayDefault: boolean;
-           eventDataTransform: any;
-           constructor(calendar: any);
-           static parse(rawInput: any, calendar: any): false | Default;
-           static normalizeId(id: any): string;
-           fetch(start: any, end: any, timezone: any): void;
-           removeEventDefsById(eventDefId: any): void;
-           removeAllEventDefs(): void;
-           getPrimitive(otherSource: any): void;
-           parseEventDefs(rawEventDefs: any): any[];
-           parseEventDef(rawInput: any): any;
-           applyManualStandardProps(rawProps: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventRange' {
-       export class Default {
-           unzonedRange: any;
-           eventDef: any;
-           eventInstance: any;
-           constructor(unzonedRange: any, eventDef: any, eventInstance?: any);
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/models/event/util' {
-       import EventRange from 'fullcalendar/EventRange';
-       import EventFootprint from 'fullcalendar/EventFootprint';
-       export function eventDefsToEventInstances(eventDefs: any, unzonedRange: any): any[];
-       export function eventInstanceToEventRange(eventInstance: any): EventRange;
-       export function eventRangeToEventFootprint(eventRange: any): EventFootprint;
-       export function eventInstanceToUnzonedRange(eventInstance: any): any;
-       export function eventFootprintToComponentFootprint(eventFootprint: any): any;
-}
-declare module 'fullcalendar/Constraints' {
-       import ComponentFootprint from 'fullcalendar/ComponentFootprint';
-       import EventFootprint from 'fullcalendar/EventFootprint';
-       export class Default {
-           eventManager: any;
-           _calendar: any;
-           constructor(eventManager: any, _calendar: any);
-           opt(name: any): any;
-           isEventInstanceGroupAllowed(eventInstanceGroup: any): boolean;
-           getPeerEventInstances(eventDef: any): any;
-           isSelectionFootprintAllowed(componentFootprint: any): boolean;
-           isFootprintAllowed(componentFootprint: any, peerEventFootprints: any, constraintVal: any, overlapVal: any, subjectEventInstance?: any): boolean;
-           isFootprintWithinConstraints(componentFootprint: any, constraintFootprints: any): boolean;
-           constraintValToFootprints(constraintVal: any, isAllDay: any): any[];
-           buildCurrentBusinessFootprints(isAllDay: any): any[];
-           eventInstancesToFootprints(eventInstances: any): any[];
-           collectOverlapEventFootprints(peerEventFootprints: any, targetFootprint: any): any[];
-           parseEventDefToInstances(eventInput: any): any;
-           eventRangesToEventFootprints(eventRanges: any): any[];
-           eventRangeToEventFootprints(eventRange: any): EventFootprint[];
-           parseFootprints(rawInput: any): ComponentFootprint[];
-           footprintContainsFootprint(outerFootprint: any, innerFootprint: any): any;
-           footprintsIntersect(footprint0: any, footprint1: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Promise' {
-        const PromiseStub: {
-           construct: (executor: any) => JQueryPromise<{}>;
-           resolve: (val: any) => JQueryPromise<{}>;
-           reject: () => JQueryPromise<{}>;
-       };
-       export default PromiseStub;
-}
-declare module 'fullcalendar/EventInstanceGroup' {
-       export class Default {
-           eventInstances: any;
-           explicitEventDef: any;
-           constructor(eventInstances?: any);
-           getAllEventRanges(constraintRange: any): any;
-           sliceRenderRanges(constraintRange: any): any;
-           sliceNormalRenderRanges(constraintRange: any): any[];
-           sliceInverseRenderRanges(constraintRange: any): any;
-           isInverse(): any;
-           getEventDef(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventPeriod' {
-       /// <reference types="jquery" />
-       import * as moment from 'moment';
-       import { EmitterInterface } from 'fullcalendar/EmitterMixin';
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       export class Default {
-           on: EmitterInterface['on'];
-           one: EmitterInterface['one'];
-           off: EmitterInterface['off'];
-           trigger: EmitterInterface['trigger'];
-           triggerWith: EmitterInterface['triggerWith'];
-           hasHandlers: EmitterInterface['hasHandlers'];
-           start: moment.Moment;
-           end: moment.Moment;
-           timezone: any;
-           unzonedRange: UnzonedRange;
-           requestsByUid: any;
-           pendingCnt: number;
-           freezeDepth: number;
-           stuntedReleaseCnt: number;
-           releaseCnt: number;
-           eventDefsByUid: any;
-           eventDefsById: any;
-           eventInstanceGroupsById: any;
-           constructor(start: any, end: any, timezone: any);
-           isWithinRange(start: any, end: any): boolean;
-           requestSources(sources: any): void;
-           requestSource(source: any): void;
-           purgeSource(source: any): void;
-           purgeAllSources(): void;
-           getEventDefByUid(eventDefUid: any): any;
-           getEventDefsById(eventDefId: any): any;
-           addEventDefs(eventDefs: any): void;
-           addEventDef(eventDef: any): void;
-           removeEventDefsById(eventDefId: any): void;
-           removeAllEventDefs(): void;
-           removeEventDef(eventDef: any): void;
-           getEventInstances(): any[];
-           getEventInstancesWithId(eventDefId: any): any;
-           getEventInstancesWithoutId(eventDefId: any): any[];
-           addEventInstance(eventInstance: any, eventDefId: any): void;
-           removeEventInstancesForDef(eventDef: any): void;
-           tryRelease(): void;
-           release(): void;
-           whenReleased(): JQueryPromise<{}>;
-           freeze(): void;
-           thaw(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ArrayEventSource' {
-       /// <reference types="jquery" />
-       import EventSource from 'fullcalendar/EventSource';
-       export class Default extends EventSource {
-           rawEventDefs: any;
-           eventDefs: any;
-           currentTimezone: any;
-           constructor(calendar: any);
-           static parse(rawInput: any, calendar: any): any;
-           setRawEventDefs(rawEventDefs: any): void;
-           fetch(start: any, end: any, timezone: any): JQueryPromise<{}>;
-           addEventDef(eventDef: any): void;
-           removeEventDefsById(eventDefId: any): number;
-           removeAllEventDefs(): void;
-           getPrimitive(): any;
-           applyManualStandardProps(rawProps: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventSourceParser' {
-        const _default: {
-           sourceClasses: any[];
-           registerClass: (EventSourceClass: any) => void;
-           parse: (rawInput: any, calendar: any) => any;
-       };
-       export default _default;
-}
-declare module 'fullcalendar/EventManager' {
-       import EventInstanceGroup from 'fullcalendar/EventInstanceGroup';
-       import { EmitterInterface } from 'fullcalendar/EmitterMixin';
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export class Default {
-           on: EmitterInterface['on'];
-           one: EmitterInterface['one'];
-           off: EmitterInterface['off'];
-           trigger: EmitterInterface['trigger'];
-           triggerWith: EmitterInterface['triggerWith'];
-           hasHandlers: EmitterInterface['hasHandlers'];
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           currentPeriod: any;
-           calendar: any;
-           stickySource: any;
-           otherSources: any;
-           constructor(calendar: any);
-           requestEvents(start: any, end: any, timezone: any, force: any): any;
-           addSource(eventSource: any): void;
-           removeSource(doomedSource: any): void;
-           removeAllSources(): void;
-           refetchSource(eventSource: any): void;
-           refetchAllSources(): void;
-           getSources(): any[];
-           multiQuerySources(matchInputs: any): any[];
-           querySources(matchInput: any): any[];
-           getSourceById(id: any): any;
-           setPeriod(eventPeriod: any): void;
-           bindPeriod(eventPeriod: any): void;
-           unbindPeriod(eventPeriod: any): void;
-           getEventDefByUid(uid: any): any;
-           addEventDef(eventDef: any, isSticky: any): void;
-           removeEventDefsById(eventId: any): void;
-           removeAllEventDefs(): void;
-           mutateEventsWithId(eventDefId: any, eventDefMutation: any): () => void;
-           buildMutatedEventInstanceGroup(eventDefId: any, eventDefMutation: any): EventInstanceGroup;
-           freeze(): void;
-           thaw(): void;
-           getEventDefsById(eventDefId: any): any;
-           getEventInstances(): any;
-           getEventInstancesWithId(eventDefId: any): any;
-           getEventInstancesWithoutId(eventDefId: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/BusinessHourGenerator' {
-       export class Default {
-           rawComplexDef: any;
-           calendar: any;
-           constructor(rawComplexDef: any, calendar: any);
-           buildEventInstanceGroup(isAllDay: any, unzonedRange: any): any;
-           buildEventDefs(isAllDay: any): any[];
-           buildEventDef(isAllDay: any, rawDef: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventDefDateMutation' {
-       import EventDateProfile from 'fullcalendar/EventDateProfile';
-       export class Default {
-           clearEnd: boolean;
-           forceTimed: boolean;
-           forceAllDay: boolean;
-           dateDelta: any;
-           startDelta: any;
-           endDelta: any;
-           static createFromDiff(dateProfile0: any, dateProfile1: any, largeUnit: any): any;
-           buildNewDateProfile(eventDateProfile: any, calendar: any): EventDateProfile;
-           setDateDelta(dateDelta: any): void;
-           setStartDelta(startDelta: any): void;
-           setEndDelta(endDelta: any): void;
-           isEmpty(): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventDefMutation' {
-       export class Default {
-           dateMutation: any;
-           eventDefId: any;
-           className: any;
-           verbatimStandardProps: any;
-           miscProps: any;
-           static createFromRawProps(eventInstance: any, rawProps: any, largeUnit: any): any;
-           mutateSingle(eventDef: any): () => void;
-           setDateMutation(dateMutation: any): void;
-           isEmpty(): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/StandardTheme' {
-       import Theme from 'fullcalendar/Theme';
-       export class Default extends Theme {
-       }
-       export default Default;
-}
-declare module 'fullcalendar/JqueryUiTheme' {
-       import Theme from 'fullcalendar/Theme';
-       export class Default extends Theme {
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ThemeRegistry' {
-       export function defineThemeSystem(themeName: any, themeClass: any): void;
-       export function getThemeSystemClass(themeSetting: any): any;
-}
-declare module 'fullcalendar/Calendar' {
-       /// <reference types="jquery" />
-       import * as moment from 'moment';
-       import Iterator from 'fullcalendar/Iterator';
-       import { EmitterInterface } from 'fullcalendar/EmitterMixin';
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       import Toolbar from 'fullcalendar/Toolbar';
-       import OptionsManager from 'fullcalendar/OptionsManager';
-       import ViewSpecManager from 'fullcalendar/ViewSpecManager';
-       import View from 'fullcalendar/View';
-       import Theme from 'fullcalendar/Theme';
-       import Constraints from 'fullcalendar/Constraints';
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       import ComponentFootprint from 'fullcalendar/ComponentFootprint';
-       import EventDateProfile from 'fullcalendar/EventDateProfile';
-       import EventManager from 'fullcalendar/EventManager';
-       import BusinessHourGenerator from 'fullcalendar/BusinessHourGenerator';
-       import EventSource from 'fullcalendar/EventSource';
-       import { RangeInput, MomentInput, OptionsInput, EventObjectInput, EventSourceInput } from 'fullcalendar/src/types/input-types';
-       export class Default {
-           static defaults: any;
-           static englishDefaults: any;
-           static rtlDefaults: any;
-           on: EmitterInterface['on'];
-           one: EmitterInterface['one'];
-           off: EmitterInterface['off'];
-           trigger: EmitterInterface['trigger'];
-           triggerWith: EmitterInterface['triggerWith'];
-           hasHandlers: EmitterInterface['hasHandlers'];
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           view: View;
-           viewsByType: {
-               [viewName: string]: View;
-           };
-           currentDate: moment.Moment;
-           theme: Theme;
-           eventManager: EventManager;
-           constraints: Constraints;
-           optionsManager: OptionsManager;
-           viewSpecManager: ViewSpecManager;
-           businessHourGenerator: BusinessHourGenerator;
-           loadingLevel: number;
-           defaultAllDayEventDuration: moment.Duration;
-           defaultTimedEventDuration: moment.Duration;
-           localeData: object;
-           el: JQuery;
-           contentEl: JQuery;
-           suggestedViewHeight: number;
-           ignoreUpdateViewSize: number;
-           freezeContentHeightDepth: number;
-           windowResizeProxy: any;
-           header: Toolbar;
-           footer: Toolbar;
-           toolbarsManager: Iterator;
-           constructor(el: JQuery, overrides: OptionsInput);
-           constructed(): void;
-           getView(): View;
-           publiclyTrigger(name: string, triggerInfo: any): any;
-           hasPublicHandlers(name: string): boolean;
-           option(name: string | object, value?: any): any;
-           opt(name: string): any;
-           instantiateView(viewType: string): View;
-           isValidViewType(viewType: string): boolean;
-           changeView(viewName: string, dateOrRange: RangeInput | MomentInput): void;
-           zoomTo(newDate: moment.Moment, viewType?: string): void;
-           initCurrentDate(): void;
-           prev(): void;
-           next(): void;
-           prevYear(): void;
-           nextYear(): void;
-           today(): void;
-           gotoDate(zonedDateInput: any): void;
-           incrementDate(delta: any): void;
-           getDate(): moment.Moment;
-           pushLoading(): void;
-           popLoading(): void;
-           render(): void;
-           initialRender(): void;
-           destroy(): void;
-           elementVisible(): boolean;
-           bindViewHandlers(view: any): void;
-           unbindViewHandlers(view: any): void;
-           renderView(viewType?: string): void;
-           clearView(): void;
-           reinitView(): void;
-           getSuggestedViewHeight(): number;
-           isHeightAuto(): boolean;
-           updateViewSize(isResize?: boolean): boolean;
-           calcSize(): void;
-           _calcSize(): void;
-           windowResize(ev: JQueryEventObject): void;
-           freezeContentHeight(): void;
-           forceFreezeContentHeight(): void;
-           thawContentHeight(): void;
-           initToolbars(): void;
-           computeHeaderOptions(): {
-               extraClasses: string;
-               layout: any;
-           };
-           computeFooterOptions(): {
-               extraClasses: string;
-               layout: any;
-           };
-           renderHeader(): void;
-           renderFooter(): void;
-           setToolbarsTitle(title: string): void;
-           updateToolbarButtons(dateProfile: any): void;
-           queryToolbarsHeight(): any;
-           select(zonedStartInput: MomentInput, zonedEndInput?: MomentInput): void;
-           unselect(): void;
-           buildSelectFootprint(zonedStartInput: MomentInput, zonedEndInput?: MomentInput): ComponentFootprint;
-           initMomentInternals(): void;
-           moment(...args: any[]): moment.Moment;
-           msToMoment(ms: number, forceAllDay: boolean): moment.Moment;
-           msToUtcMoment(ms: number, forceAllDay: boolean): moment.Moment;
-           localizeMoment(mom: any): void;
-           getIsAmbigTimezone(): boolean;
-           applyTimezone(date: moment.Moment): moment.Moment;
-           footprintToDateProfile(componentFootprint: any, ignoreEnd?: boolean): EventDateProfile;
-           getNow(): moment.Moment;
-           humanizeDuration(duration: moment.Duration): string;
-           parseUnzonedRange(rangeInput: RangeInput): UnzonedRange;
-           initEventManager(): void;
-           requestEvents(start: moment.Moment, end: moment.Moment): any;
-           getEventEnd(event: any): moment.Moment;
-           getDefaultEventEnd(allDay: boolean, zonedStart: moment.Moment): moment.Moment;
-           rerenderEvents(): void;
-           refetchEvents(): void;
-           renderEvents(eventInputs: EventObjectInput[], isSticky?: boolean): void;
-           renderEvent(eventInput: EventObjectInput, isSticky?: boolean): void;
-           removeEvents(legacyQuery: any): void;
-           clientEvents(legacyQuery: any): any;
-           updateEvents(eventPropsArray: EventObjectInput[]): void;
-           updateEvent(eventProps: EventObjectInput): void;
-           getEventSources(): EventSource;
-           getEventSourceById(id: any): EventSource;
-           addEventSource(sourceInput: EventSourceInput): void;
-           removeEventSources(sourceMultiQuery: any): void;
-           removeEventSource(sourceQuery: any): void;
-           refetchEventSources(sourceMultiQuery: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DateProfileGenerator' {
-       import * as moment from 'moment';
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       export class Default {
-           _view: any;
-           constructor(_view: any);
-           opt(name: any): any;
-           trimHiddenDays(unzonedRange: any): any;
-           msToUtcMoment(ms: any, forceAllDay: any): any;
-           buildPrev(currentDateProfile: any): {
-               validUnzonedRange: any;
-               currentUnzonedRange: any;
-               currentRangeUnit: any;
-               isRangeAllDay: any;
-               activeUnzonedRange: any;
-               renderUnzonedRange: any;
-               minTime: any;
-               maxTime: any;
-               isValid: any;
-               date: any;
-               dateIncrement: any;
-           };
-           buildNext(currentDateProfile: any): {
-               validUnzonedRange: any;
-               currentUnzonedRange: any;
-               currentRangeUnit: any;
-               isRangeAllDay: any;
-               activeUnzonedRange: any;
-               renderUnzonedRange: any;
-               minTime: any;
-               maxTime: any;
-               isValid: any;
-               date: any;
-               dateIncrement: any;
-           };
-           build(date: any, direction: any, forceToValid?: boolean): {
-               validUnzonedRange: any;
-               currentUnzonedRange: any;
-               currentRangeUnit: any;
-               isRangeAllDay: any;
-               activeUnzonedRange: any;
-               renderUnzonedRange: any;
-               minTime: any;
-               maxTime: any;
-               isValid: any;
-               date: any;
-               dateIncrement: any;
-           };
-           buildValidRange(): any;
-           buildCurrentRangeInfo(date: any, direction: any): {
-               duration: any;
-               unit: any;
-               unzonedRange: any;
-           };
-           getFallbackDuration(): moment.Duration;
-           adjustActiveRange(unzonedRange: any, minTime: any, maxTime: any): UnzonedRange;
-           buildRangeFromDuration(date: any, direction: any, duration: any, unit: any): any;
-           buildRangeFromDayCount(date: any, direction: any, dayCount: any): UnzonedRange;
-           buildCustomVisibleRange(date: any): any;
-           buildRenderRange(currentUnzonedRange: any, currentRangeUnit: any, isRangeAllDay: any): any;
-           buildDateIncrement(fallback: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/date-formatting' {
-       export function formatDate(date: any, formatStr: any): any;
-       export function formatRange(date1: any, date2: any, formatStr: any, separator: any, isRTL: any): any;
-       export function queryMostGranularFormatUnit(formatStr: any): any;
-}
-declare module 'fullcalendar/Component' {
-       import Model from 'fullcalendar/Model';
-       export class Default extends Model {
-           el: any;
-           setElement(el: any): void;
-           removeElement(): void;
-           bindGlobalHandlers(): void;
-           unbindGlobalHandlers(): void;
-           renderSkeleton(): void;
-           unrenderSkeleton(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DateComponent' {
-       import Component from 'fullcalendar/Component';
-       import EventFootprint from 'fullcalendar/EventFootprint';
-       export abstract class Default extends Component {
-           static guid: number;
-           eventRendererClass: any;
-           helperRendererClass: any;
-           businessHourRendererClass: any;
-           fillRendererClass: any;
-           uid: any;
-           childrenByUid: any;
-           isRTL: boolean;
-           nextDayThreshold: any;
-           dateProfile: any;
-           eventRenderer: any;
-           helperRenderer: any;
-           businessHourRenderer: any;
-           fillRenderer: any;
-           hitsNeededDepth: number;
-           hasAllDayBusinessHours: boolean;
-           isDatesRendered: boolean;
-           constructor(_view?: any, _options?: any);
-           addChild(child: any): boolean;
-           removeChild(child: any): boolean;
-           updateSize(totalHeight: any, isAuto: any, isResize: any): void;
-           opt(name: any): any;
-           publiclyTrigger(...args: any[]): any;
-           hasPublicHandlers(...args: any[]): any;
-           executeDateRender(dateProfile: any): void;
-           executeDateUnrender(): void;
-           renderDates(dateProfile: any): void;
-           unrenderDates(): void;
-           getNowIndicatorUnit(): void;
-           renderNowIndicator(date: any): void;
-           unrenderNowIndicator(): void;
-           renderBusinessHours(businessHourGenerator: any): void;
-           unrenderBusinessHours(): void;
-           executeEventRender(eventsPayload: any): void;
-           executeEventUnrender(): void;
-           getBusinessHourSegs(): any;
-           getOwnBusinessHourSegs(): any;
-           getEventSegs(): any;
-           getOwnEventSegs(): any;
-           triggerAfterEventsRendered(): void;
-           triggerAfterEventSegsRendered(segs: any): void;
-           triggerBeforeEventsDestroyed(): void;
-           triggerBeforeEventSegsDestroyed(segs: any): void;
-           showEventsWithId(eventDefId: any): void;
-           hideEventsWithId(eventDefId: any): void;
-           renderDrag(eventFootprints: any, seg: any, isTouch: any): boolean;
-           unrenderDrag(): void;
-           renderEventResize(eventFootprints: any, seg: any, isTouch: any): void;
-           unrenderEventResize(): void;
-           renderSelectionFootprint(componentFootprint: any): void;
-           unrenderSelection(): void;
-           renderHighlight(componentFootprint: any): void;
-           unrenderHighlight(): void;
-           hitsNeeded(): void;
-           hitsNotNeeded(): void;
-           prepareHits(): void;
-           releaseHits(): void;
-           queryHit(leftOffset: any, topOffset: any): any;
-           getSafeHitFootprint(hit: any): any;
-           getHitFootprint(hit: any): any;
-           getHitEl(hit: any): any;
-           eventRangesToEventFootprints(eventRanges: any): any[];
-           eventRangeToEventFootprints(eventRange: any): EventFootprint[];
-           eventFootprintsToSegs(eventFootprints: any): any[];
-           eventFootprintToSegs(eventFootprint: any): any;
-           componentFootprintToSegs(componentFootprint: any): any[];
-           callChildren(methodName: any, args: any): void;
-           iterChildren(func: any): void;
-           _getCalendar(): any;
-           _getView(): any;
-           _getDateProfile(): any;
-           buildGotoAnchorHtml(gotoOptions: any, attrs: any, innerHtml: any): string;
-           getAllDayHtml(): any;
-           getDayClasses(date: any, noThemeHighlight?: any): any[];
-           formatRange(range: any, isAllDay: any, formatStr: any, separator: any): any;
-           currentRangeAs(unit: any): any;
-           computeDayRange(unzonedRange: any): {
-               start: any;
-               end: any;
-           };
-           isMultiDayRange(unzonedRange: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/InteractiveDateComponent' {
-       import * as moment from 'moment';
-       import DateComponent from 'fullcalendar/DateComponent';
-       export abstract class Default extends DateComponent {
-           dateClickingClass: any;
-           dateSelectingClass: any;
-           eventPointingClass: any;
-           eventDraggingClass: any;
-           eventResizingClass: any;
-           externalDroppingClass: any;
-           dateClicking: any;
-           dateSelecting: any;
-           eventPointing: any;
-           eventDragging: any;
-           eventResizing: any;
-           externalDropping: any;
-           segSelector: string;
-           largeUnit: any;
-           constructor(_view?: any, _options?: any);
-           setElement(el: any): void;
-           removeElement(): void;
-           executeEventUnrender(): void;
-           bindGlobalHandlers(): void;
-           unbindGlobalHandlers(): void;
-           bindDateHandlerToEl(el: any, name: any, handler: any): void;
-           bindAllSegHandlersToEl(el: any): void;
-           bindSegHandlerToEl(el: any, name: any, handler: any): void;
-           shouldIgnoreMouse(): any;
-           shouldIgnoreTouch(): any;
-           shouldIgnoreEventPointing(): any;
-           canStartSelection(seg: any, ev: any): any;
-           canStartDrag(seg: any, ev: any): any;
-           canStartResize(seg: any, ev: any): boolean;
-           endInteractions(): void;
-           isEventDefDraggable(eventDef: any): any;
-           isEventDefStartEditable(eventDef: any): any;
-           isEventDefGenerallyEditable(eventDef: any): any;
-           isEventDefResizableFromStart(eventDef: any): any;
-           isEventDefResizableFromEnd(eventDef: any): any;
-           isEventDefResizable(eventDef: any): any;
-           diffDates(a: any, b: any): moment.Duration;
-           isEventInstanceGroupAllowed(eventInstanceGroup: any): any;
-           isExternalInstanceGroupAllowed(eventInstanceGroup: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/View' {
-       import * as moment from 'moment';
-       import RenderQueue from 'fullcalendar/RenderQueue';
-       import Calendar from 'fullcalendar/Calendar';
-       import InteractiveDateComponent from 'fullcalendar/InteractiveDateComponent';
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       import EventInstance from 'fullcalendar/EventInstance';
-       export abstract class Default extends InteractiveDateComponent {
-           type: string;
-           name: string;
-           title: string;
-           calendar: Calendar;
-           viewSpec: any;
-           options: any;
-           renderQueue: RenderQueue;
-           batchRenderDepth: number;
-           queuedScroll: object;
-           isSelected: boolean;
-           selectedEventInstance: EventInstance;
-           eventOrderSpecs: any;
-           isHiddenDayHash: boolean[];
-           isNowIndicatorRendered: boolean;
-           initialNowDate: moment.Moment;
-           initialNowQueriedMs: number;
-           nowIndicatorTimeoutID: any;
-           nowIndicatorIntervalID: any;
-           dateProfileGeneratorClass: any;
-           dateProfileGenerator: any;
-           usesMinMaxTime: boolean;
-           start: moment.Moment;
-           end: moment.Moment;
-           intervalStart: moment.Moment;
-           intervalEnd: moment.Moment;
-           constructor(calendar: any, viewSpec: any);
-           _getView(): this;
-           opt(name: any): any;
-           initRenderQueue(): void;
-           onRenderQueueStart(): void;
-           onRenderQueueStop(): void;
-           startBatchRender(): void;
-           stopBatchRender(): void;
-           requestRender(func: any, namespace: any, actionType: any): void;
-           whenSizeUpdated(func: any): void;
-           computeTitle(dateProfile: any): any;
-           computeTitleFormat(dateProfile: any): any;
-           setDate(date: any): void;
-           unsetDate(): void;
-           fetchInitialEvents(dateProfile: any): any;
-           bindEventChanges(): void;
-           unbindEventChanges(): void;
-           setEvents(eventsPayload: any): void;
-           unsetEvents(): void;
-           resetEvents(eventsPayload: any): void;
-           requestDateRender(dateProfile: any): void;
-           requestDateUnrender(): void;
-           executeDateRender(dateProfile: any): void;
-           executeDateUnrender(): void;
-           bindBaseRenderHandlers(): void;
-           triggerViewRender(): void;
-           triggerViewDestroy(): void;
-           requestEventsRender(eventsPayload: any): void;
-           requestEventsUnrender(): void;
-           requestBusinessHoursRender(businessHourGenerator: any): void;
-           requestBusinessHoursUnrender(): void;
-           bindGlobalHandlers(): void;
-           unbindGlobalHandlers(): void;
-           startNowIndicator(): void;
-           updateNowIndicator(): void;
-           stopNowIndicator(): void;
-           updateSize(totalHeight: any, isAuto: any, isResize: any): void;
-           addScroll(scroll: any): void;
-           popScroll(): void;
-           applyQueuedScroll(): void;
-           queryScroll(): {};
-           applyScroll(scroll: any): void;
-           computeInitialDateScroll(): {};
-           queryDateScroll(): {};
-           applyDateScroll(scroll: any): void;
-           reportEventDrop(eventInstance: any, eventMutation: any, el: any, ev: any): void;
-           triggerEventDrop(eventInstance: any, dateDelta: any, undoFunc: any, el: any, ev: any): void;
-           reportExternalDrop(singleEventDef: any, isEvent: any, isSticky: any, el: any, ev: any, ui: any): void;
-           triggerExternalDrop(singleEventDef: any, isEvent: any, el: any, ev: any, ui: any): void;
-           reportEventResize(eventInstance: any, eventMutation: any, el: any, ev: any): void;
-           triggerEventResize(eventInstance: any, durationDelta: any, undoFunc: any, el: any, ev: any): void;
-           select(footprint: any, ev?: any): void;
-           renderSelectionFootprint(footprint: any): void;
-           reportSelection(footprint: any, ev?: any): void;
-           triggerSelect(footprint: any, ev?: any): void;
-           unselect(ev?: any): void;
-           selectEventInstance(eventInstance: any): void;
-           unselectEventInstance(): void;
-           isEventDefSelected(eventDef: any): boolean;
-           handleDocumentMousedown(ev: any): void;
-           processUnselect(ev: any): void;
-           processRangeUnselect(ev: any): void;
-           processEventUnselect(ev: any): void;
-           triggerBaseRendered(): void;
-           triggerBaseUnrendered(): void;
-           triggerDayClick(footprint: any, dayEl: any, ev: any): void;
-           isDateInOtherMonth(date: any, dateProfile: any): boolean;
-           getUnzonedRangeOption(name: any): UnzonedRange;
-           initHiddenDays(): void;
-           trimHiddenDays(inputUnzonedRange: any): UnzonedRange;
-           isHiddenDay(day: any): boolean;
-           skipHiddenDays(date: any, inc?: number, isExclusive?: boolean): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/types/input-types' {
-       /// <reference types="jquery" />
-       import * as moment from 'moment';
-       import View from 'fullcalendar/View';
-       import EventSource from 'fullcalendar/EventSource';
-       export type MomentInput = moment.Moment | Date | object | string | number;
-       export type DurationInput = moment.Duration | object | string | number;
-       export interface RangeInput {
-           start?: MomentInput;
-           end?: MomentInput;
-       }
-       export type ConstraintInput = RangeInput | BusinessHoursInput | 'businessHours';
-       export interface EventOptionsBase {
-           className?: string | string[];
-           editable?: boolean;
-           startEditable?: boolean;
-           durationEditable?: boolean;
-           rendering?: string;
-           overlap?: boolean;
-           constraint?: ConstraintInput;
-           color?: string;
-           backgroundColor?: string;
-           borderColor?: string;
-           textColor?: string;
-       }
-       export interface EventObjectInput extends EventOptionsBase, RangeInput {
-           _id?: string;
-           id?: string | number;
-           title: string;
-           allDay?: boolean;
-           url?: string;
-           source?: EventSource;
-           [customField: string]: any;
-       }
-       export type EventSourceFunction = (start: moment.Moment, end: moment.Moment, timezone: string, callback: ((events: EventObjectInput[]) => void)) => void;
-       export type EventSourceSimpleInput = EventObjectInput[] | EventSourceFunction | string;
-       export interface EventSourceExtendedInput extends EventOptionsBase, JQueryAjaxSettings {
-           url?: string;
-           events?: EventSourceSimpleInput;
-           allDayDefault?: boolean;
-           startParam?: string;
-           endParam?: string;
-           eventDataTransform?(eventData: any): EventObjectInput;
-       }
-       export type EventSourceInput = EventSourceSimpleInput | EventSourceExtendedInput;
-       export interface ToolbarInput {
-           left?: string;
-           center?: string;
-           right?: string;
-       }
-       export interface CustomButtonInput {
-           text: string;
-           icon?: string;
-           themeIcon?: string;
-           bootstrapGlyphicon?: string;
-           bootstrapFontAwesome?: string;
-           click(element: JQuery): void;
-       }
-       export interface ButtonIconsInput {
-           prev?: string;
-           next?: string;
-           prevYear?: string;
-           nextYear?: string;
-       }
-       export interface ButtonTextCompoundInput {
-           prev?: string;
-           next?: string;
-           prevYear?: string;
-           nextYear?: string;
-           today?: string;
-           month?: string;
-           week?: string;
-           day?: string;
-           [viewId: string]: string | undefined;
-       }
-       export interface BusinessHoursInput {
-           start?: MomentInput;
-           end?: MomentInput;
-           dow?: number[];
-       }
-       export interface EventSegment {
-           event: EventObjectInput;
-           start: moment.Moment;
-           end: moment.Moment;
-           isStart: boolean;
-           isEnd: boolean;
-       }
-       export interface CellInfo {
-           date: moment.Moment;
-           dayEl: JQuery;
-           moreEl: JQuery;
-           segs: EventSegment[];
-           hiddenSegs: EventSegment[];
-       }
-       export interface DropInfo {
-           start: moment.Moment;
-           end: moment.Moment;
-       }
-       export interface OptionsInputBase {
-           header?: boolean | ToolbarInput;
-           footer?: boolean | ToolbarInput;
-           customButtons?: {
-               [name: string]: CustomButtonInput;
-           };
-           buttonIcons?: boolean | ButtonIconsInput;
-           themeSystem?: 'standard' | 'bootstrap3' | 'bootstrap4' | 'jquery-ui';
-           themeButtonIcons?: boolean | ButtonIconsInput;
-           bootstrapGlyphicons?: boolean | ButtonIconsInput;
-           bootstrapFontAwesome?: boolean | ButtonIconsInput;
-           firstDay?: number;
-           isRTL?: boolean;
-           weekends?: boolean;
-           hiddenDays?: number[];
-           fixedWeekCount?: boolean;
-           weekNumbers?: boolean;
-           weekNumbersWithinDays?: boolean;
-           weekNumberCalculation?: 'local' | 'ISO' | ((m: moment.Moment) => number);
-           businessHours?: boolean | BusinessHoursInput | BusinessHoursInput[];
-           showNonCurrentDates?: boolean;
-           height?: number | 'auto' | 'parent' | (() => number);
-           contentHeight?: number | 'auto' | (() => number);
-           aspectRatio?: number;
-           handleWindowResize?: boolean;
-           windowResizeDelay?: number;
-           eventLimit?: boolean | number;
-           eventLimitClick?: 'popover' | 'week' | 'day' | string | ((cellinfo: CellInfo, jsevent: Event) => void);
-           timezone?: string | boolean;
-           now?: MomentInput | (() => MomentInput);
-           defaultView?: string;
-           allDaySlot?: boolean;
-           allDayText?: string;
-           slotDuration?: DurationInput;
-           slotLabelFormat?: string;
-           slotLabelInterval?: DurationInput;
-           snapDuration?: DurationInput;
-           scrollTime?: DurationInput;
-           minTime?: DurationInput;
-           maxTime?: DurationInput;
-           slotEventOverlap?: boolean;
-           listDayFormat?: string | boolean;
-           listDayAltFormat?: string | boolean;
-           noEventsMessage?: string;
-           defaultDate?: MomentInput;
-           nowIndicator?: boolean;
-           visibleRange?: ((currentDate: moment.Moment) => RangeInput) | RangeInput;
-           validRange?: RangeInput;
-           dateIncrement?: DurationInput;
-           dateAlignment?: string;
-           duration?: DurationInput;
-           dayCount?: number;
-           locale?: string;
-           timeFormat?: string;
-           columnHeader?: boolean;
-           columnHeaderFormat?: string;
-           columnHeaderText?: string | ((date: MomentInput) => string);
-           columnHeaderHtml?: string | ((date: MomentInput) => string);
-           titleFormat?: string;
-           monthNames?: string[];
-           monthNamesShort?: string[];
-           dayNames?: string[];
-           dayNamesShort?: string[];
-           weekNumberTitle?: string;
-           displayEventTime?: boolean;
-           displayEventEnd?: boolean;
-           eventLimitText?: string | ((eventCnt: number) => string);
-           dayPopoverFormat?: string;
-           navLinks?: boolean;
-           navLinkDayClick?: string | ((date: moment.Moment, jsEvent: Event) => void);
-           navLinkWeekClick?: string | ((weekStart: any, jsEvent: Event) => void);
-           selectable?: boolean;
-           selectHelper?: boolean;
-           unselectAuto?: boolean;
-           unselectCancel?: string;
-           selectOverlap?: boolean | ((event: EventObjectInput) => boolean);
-           selectConstraint?: ConstraintInput;
-           events?: EventSourceInput;
-           eventSources?: EventSourceInput[];
-           allDayDefault?: boolean;
-           startParam?: string;
-           endParam?: string;
-           lazyFetching?: boolean;
-           eventColor?: string;
-           eventBackgroundColor?: string;
-           eventBorderColor?: string;
-           eventTextColor?: string;
-           nextDayThreshold?: DurationInput;
-           eventOrder?: string | Array<((a: EventObjectInput, b: EventObjectInput) => number) | (string | ((a: EventObjectInput, b: EventObjectInput) => number))>;
-           eventRenderWait?: number | null;
-           editable?: boolean;
-           eventStartEditable?: boolean;
-           eventDurationEditable?: boolean;
-           dragRevertDuration?: number;
-           dragOpacity?: number;
-           dragScroll?: boolean;
-           eventOverlap?: boolean | ((stillEvent: EventObjectInput, movingEvent: EventObjectInput) => boolean);
-           eventConstraint?: ConstraintInput;
-           eventAllow?: ((dropInfo: DropInfo, draggedEvent: Event) => boolean);
-           longPressDelay?: number;
-           eventLongPressDelay?: number;
-           droppable?: boolean;
-           dropAccept?: string | ((draggable: any) => boolean);
-           viewRender?(view: View, element: JQuery): void;
-           viewDestroy?(view: View, element: JQuery): void;
-           dayRender?(date: moment.Moment, cell: JQuery): void;
-           windowResize?(view: View): void;
-           dayClick?(date: moment.Moment, jsEvent: MouseEvent, view: View, resourceObj?: any): void;
-           eventClick?(event: EventObjectInput, jsEvent: MouseEvent, view: View): boolean | void;
-           eventMouseover?(event: EventObjectInput, jsEvent: MouseEvent, view: View): void;
-           eventMouseout?(event: EventObjectInput, jsEvent: MouseEvent, view: View): void;
-           select?(start: moment.Moment, end: moment.Moment, jsEvent: MouseEvent, view: View, resource?: any): void;
-           unselect?(view: View, jsEvent: Event): void;
-           eventDataTransform?(eventData: any): EventObjectInput;
-           loading?(isLoading: boolean, view: View): void;
-           eventRender?(event: EventObjectInput, element: JQuery, view: View): void;
-           eventAfterRender?(event: EventObjectInput, element: JQuery, view: View): void;
-           eventAfterAllRender?(view: View): void;
-           eventDestroy?(event: EventObjectInput, element: JQuery, view: View): void;
-           eventDragStart?(event: EventObjectInput, jsEvent: MouseEvent, ui: any, view: View): void;
-           eventDragStop?(event: EventObjectInput, jsEvent: MouseEvent, ui: any, view: View): void;
-           eventDrop?(event: EventObjectInput, delta: moment.Duration, revertFunc: Function, jsEvent: Event, ui: any, view: View): void;
-           eventResizeStart?(event: EventObjectInput, jsEvent: MouseEvent, ui: any, view: View): void;
-           eventResizeStop?(event: EventObjectInput, jsEvent: MouseEvent, ui: any, view: View): void;
-           eventResize?(event: EventObjectInput, delta: moment.Duration, revertFunc: Function, jsEvent: Event, ui: any, view: View): void;
-           drop?(date: moment.Moment, jsEvent: MouseEvent, ui: any): void;
-           eventReceive?(event: EventObjectInput): void;
-       }
-       export interface ViewOptionsInput extends OptionsInputBase {
-           type?: string;
-           buttonText?: string;
-       }
-       export interface OptionsInput extends OptionsInputBase {
-           buttonText?: ButtonTextCompoundInput;
-           views?: {
-               [viewId: string]: ViewOptionsInput;
-           };
-       }
-}
-declare module 'fullcalendar/FuncEventSource' {
-       /// <reference types="jquery" />
-       import EventSource from 'fullcalendar/EventSource';
-       export class Default extends EventSource {
-           func: any;
-           static parse(rawInput: any, calendar: any): any;
-           fetch(start: any, end: any, timezone: any): JQueryPromise<{}>;
-           getPrimitive(): any;
-           applyManualStandardProps(rawProps: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/JsonFeedEventSource' {
-       /// <reference types="jquery" />
-       import EventSource from 'fullcalendar/EventSource';
-       export class Default extends EventSource {
-           static AJAX_DEFAULTS: {
-               dataType: string;
-               cache: boolean;
-           };
-           url: any;
-           startParam: any;
-           endParam: any;
-           timezoneParam: any;
-           ajaxSettings: any;
-           static parse(rawInput: any, calendar: any): any;
-           fetch(start: any, end: any, timezone: any): JQueryPromise<{}>;
-           buildRequestParams(start: any, end: any, timezone: any): {};
-           getPrimitive(): any;
-           applyMiscProps(rawProps: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/CoordCache' {
-       export class Default {
-           els: any;
-           forcedOffsetParentEl: any;
-           origin: any;
-           boundingRect: any;
-           isHorizontal: boolean;
-           isVertical: boolean;
-           lefts: any;
-           rights: any;
-           tops: any;
-           bottoms: any;
-           constructor(options: any);
-           build(): void;
-           clear(): void;
-           ensureBuilt(): void;
-           buildElHorizontals(): void;
-           buildElVerticals(): void;
-           getHorizontalIndex(leftOffset: any): any;
-           getVerticalIndex(topOffset: any): any;
-           getLeftOffset(leftIndex: any): any;
-           getLeftPosition(leftIndex: any): number;
-           getRightOffset(leftIndex: any): any;
-           getRightPosition(leftIndex: any): number;
-           getWidth(leftIndex: any): number;
-           getTopOffset(topIndex: any): any;
-           getTopPosition(topIndex: any): number;
-           getBottomOffset(topIndex: any): any;
-           getBottomPosition(topIndex: any): number;
-           getHeight(topIndex: any): number;
-           queryBoundingRect(): {
-               left: number;
-               right: any;
-               top: number;
-               bottom: any;
-           };
-           isPointInBounds(leftOffset: any, topOffset: any): boolean;
-           isLeftInBounds(leftOffset: any): boolean;
-           isTopInBounds(topOffset: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DragListener' {
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export class Default {
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           options: any;
-           subjectEl: any;
-           originX: any;
-           originY: any;
-           scrollEl: any;
-           isInteracting: boolean;
-           isDistanceSurpassed: boolean;
-           isDelayEnded: boolean;
-           isDragging: boolean;
-           isTouch: boolean;
-           isGeneric: boolean;
-           delay: any;
-           delayTimeoutId: any;
-           minDistance: any;
-           shouldCancelTouchScroll: boolean;
-           scrollAlwaysKills: boolean;
-           isAutoScroll: boolean;
-           scrollBounds: any;
-           scrollTopVel: any;
-           scrollLeftVel: any;
-           scrollIntervalId: any;
-           scrollSensitivity: number;
-           scrollSpeed: number;
-           scrollIntervalMs: number;
-           constructor(options: any);
-           startInteraction(ev: any, extraOptions?: any): void;
-           handleInteractionStart(ev: any): void;
-           endInteraction(ev: any, isCancelled: any): void;
-           handleInteractionEnd(ev: any, isCancelled: any): void;
-           bindHandlers(): void;
-           unbindHandlers(): void;
-           startDrag(ev: any, extraOptions?: any): void;
-           handleDragStart(ev: any): void;
-           handleMove(ev: any): void;
-           handleDrag(dx: any, dy: any, ev: any): void;
-           endDrag(ev: any): void;
-           handleDragEnd(ev: any): void;
-           startDelay(initialEv: any): void;
-           handleDelayEnd(initialEv: any): void;
-           handleDistanceSurpassed(ev: any): void;
-           handleTouchMove(ev: any): void;
-           handleMouseMove(ev: any): void;
-           handleTouchScroll(ev: any): void;
-           trigger(name: any, ...args: any[]): void;
-           initAutoScroll(): void;
-           destroyAutoScroll(): void;
-           computeScrollBounds(): void;
-           updateAutoScroll(ev: any): void;
-           setScrollVel(topVel: any, leftVel: any): void;
-           constrainScrollVel(): void;
-           scrollIntervalFunc(): void;
-           endAutoScroll(): void;
-           handleDebouncedScroll(): void;
-           handleScrollEnd(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Scroller' {
-       import Class from 'fullcalendar/Class';
-       export class Default extends Class {
-           el: any;
-           scrollEl: any;
-           overflowX: any;
-           overflowY: any;
-           constructor(options?: any);
-           render(): void;
-           renderEl(): JQuery;
-           clear(): void;
-           destroy(): void;
-           applyOverflow(): void;
-           lockOverflow(scrollbarWidths: any): void;
-           setHeight(height: any): void;
-           getScrollTop(): any;
-           setScrollTop(top: any): void;
-           getClientWidth(): any;
-           getClientHeight(): any;
-           getScrollbarWidths(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DayTableMixin' {
-       import Mixin from 'fullcalendar/Mixin';
-       export interface DayTableInterface {
-           dayDates: any;
-           daysPerRow: any;
-           rowCnt: any;
-           colCnt: any;
-           updateDayTable(): any;
-           renderHeadHtml(): any;
-           renderBgTrHtml(row: any): any;
-           bookendCells(trEl: any): any;
-           getCellDate(row: any, col: any): any;
-           getCellRange(row: any, col: any): any;
-           sliceRangeByDay(unzonedRange: any): any;
-           sliceRangeByRow(unzonedRange: any): any;
-           renderIntroHtml(): any;
-       }
-       export class Default extends Mixin implements DayTableInterface {
-           breakOnWeeks: boolean;
-           dayDates: any;
-           dayIndices: any;
-           daysPerRow: any;
-           rowCnt: any;
-           colCnt: any;
-           colHeadFormat: any;
-           updateDayTable(): void;
-           updateDayTableCols(): void;
-           computeColCnt(): any;
-           getCellDate(row: any, col: any): any;
-           getCellRange(row: any, col: any): {
-               start: any;
-               end: any;
-           };
-           getCellDayIndex(row: any, col: any): any;
-           getColDayIndex(col: any): any;
-           getDateDayIndex(date: any): any;
-           computeColHeadFormat(): any;
-           sliceRangeByRow(unzonedRange: any): any[];
-           sliceRangeByDay(unzonedRange: any): any[];
-           renderHeadHtml(): string;
-           renderHeadIntroHtml(): void;
-           renderHeadTrHtml(): string;
-           renderHeadDateCellsHtml(): string;
-           renderHeadDateCellHtml(date: any, colspan: any, otherAttrs: any): string;
-           renderBgTrHtml(row: any): string;
-           renderBgIntroHtml(row: any): void;
-           renderBgCellsHtml(row: any): string;
-           renderBgCellHtml(date: any, otherAttrs: any): string;
-           renderIntroHtml(): void;
-           bookendCells(trEl: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/BusinessHourRenderer' {
-       export class Default {
-           component: any;
-           fillRenderer: any;
-           segs: any;
-           constructor(component: any, fillRenderer: any);
-           render(businessHourGenerator: any): void;
-           renderEventFootprints(eventFootprints: any): void;
-           renderSegs(segs: any): void;
-           unrender(): void;
-           getSegs(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventRenderer' {
-       export class Default {
-           view: any;
-           component: any;
-           fillRenderer: any;
-           fgSegs: any;
-           bgSegs: any;
-           eventTimeFormat: any;
-           displayEventTime: any;
-           displayEventEnd: any;
-           constructor(component: any, fillRenderer: any);
-           opt(name: any): any;
-           rangeUpdated(): void;
-           render(eventsPayload: any): void;
-           unrender(): void;
-           renderFgRanges(eventRanges: any): void;
-           unrenderFgRanges(): void;
-           renderBgRanges(eventRanges: any): void;
-           unrenderBgRanges(): void;
-           getSegs(): any;
-           renderFgSegs(segs: any): (boolean | void);
-           unrenderFgSegs(segs: any): void;
-           renderBgSegs(segs: any): boolean;
-           unrenderBgSegs(): void;
-           renderFgSegEls(segs: any, disableResizing?: boolean): any[];
-           beforeFgSegHtml(seg: any): void;
-           fgSegHtml(seg: any, disableResizing: any): void;
-           getSegClasses(seg: any, isDraggable: any, isResizable: any): string[];
-           filterEventRenderEl(eventFootprint: any, el: any): any;
-           getTimeText(eventFootprint: any, formatStr?: any, displayEnd?: any): any;
-           _getTimeText(start: any, end: any, isAllDay: any, formatStr?: any, displayEnd?: any): any;
-           computeEventTimeFormat(): any;
-           computeDisplayEventTime(): boolean;
-           computeDisplayEventEnd(): boolean;
-           getBgClasses(eventDef: any): any[];
-           getClasses(eventDef: any): any[];
-           getSkinCss(eventDef: any): {
-               'background-color': any;
-               'border-color': any;
-               color: any;
-           };
-           getBgColor(eventDef: any): any;
-           getBorderColor(eventDef: any): any;
-           getTextColor(eventDef: any): any;
-           getStylingObjs(eventDef: any): any[];
-           getFallbackStylingObjs(eventDef: any): any[];
-           sortEventSegs(segs: any): void;
-           compareEventSegs(seg1: any, seg2: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/FillRenderer' {
-       export class Default {
-           fillSegTag: string;
-           component: any;
-           elsByFill: any;
-           constructor(component: any);
-           renderFootprint(type: any, componentFootprint: any, props: any): void;
-           renderSegs(type: any, segs: any, props: any): any;
-           unrender(type: any): void;
-           buildSegEls(type: any, segs: any, props: any): any[];
-           buildSegHtml(type: any, seg: any, props: any): string;
-           attachSegEls(type: any, segs: any): void;
-           reportEls(type: any, nodes: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/HelperRenderer' {
-       import EventFootprint from 'fullcalendar/EventFootprint';
-       export class Default {
-           view: any;
-           component: any;
-           eventRenderer: any;
-           helperEls: any;
-           constructor(component: any, eventRenderer: any);
-           renderComponentFootprint(componentFootprint: any): void;
-           renderEventDraggingFootprints(eventFootprints: any, sourceSeg: any, isTouch: any): void;
-           renderEventResizingFootprints(eventFootprints: any, sourceSeg: any, isTouch: any): void;
-           renderEventFootprints(eventFootprints: any, sourceSeg?: any, extraClassNames?: any, opacity?: any): void;
-           renderSegs(segs: any, sourceSeg?: any): void;
-           unrender(): void;
-           fabricateEventFootprint(componentFootprint: any): EventFootprint;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/HitDragListener' {
-       import DragListener from 'fullcalendar/DragListener';
-       export class Default extends DragListener {
-           component: any;
-           origHit: any;
-           hit: any;
-           coordAdjust: any;
-           constructor(component: any, options: any);
-           handleInteractionStart(ev: any): void;
-           handleDragStart(ev: any): void;
-           handleDrag(dx: any, dy: any, ev: any): void;
-           handleDragEnd(ev: any): void;
-           handleHitOver(hit: any): void;
-           handleHitOut(): void;
-           handleHitDone(): void;
-           handleInteractionEnd(ev: any, isCancelled: any): void;
-           handleScrollEnd(): void;
-           queryHit(left: any, top: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Interaction' {
-       export class Default {
-           view: any;
-           component: any;
-           constructor(component: any);
-           opt(name: any): any;
-           end(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ExternalDropping' {
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       import Interaction from 'fullcalendar/Interaction';
-       export class Default extends Interaction {
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           dragListener: any;
-           isDragging: boolean;
-           end(): void;
-           bindToDocument(): void;
-           unbindFromDocument(): void;
-           handleDragStart(ev: any, ui: any): void;
-           listenToExternalDrag(el: any, ev: any, ui: any): void;
-           computeExternalDrop(componentFootprint: any, meta: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventResizing' {
-       import HitDragListener from 'fullcalendar/HitDragListener';
-       import Interaction from 'fullcalendar/Interaction';
-       export class Default extends Interaction {
-           eventPointing: any;
-           dragListener: any;
-           isResizing: boolean;
-           constructor(component: any, eventPointing: any);
-           end(): void;
-           bindToEl(el: any): void;
-           handleMouseDown(seg: any, ev: any): void;
-           handleTouchStart(seg: any, ev: any): void;
-           buildDragListener(seg: any, isStart: any): HitDragListener;
-           segResizeStart(seg: any, ev: any): void;
-           segResizeStop(seg: any, ev: any): void;
-           computeEventStartResizeMutation(startFootprint: any, endFootprint: any, origEventFootprint: any): any;
-           computeEventEndResizeMutation(startFootprint: any, endFootprint: any, origEventFootprint: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventPointing' {
-       import Interaction from 'fullcalendar/Interaction';
-       export class Default extends Interaction {
-           mousedOverSeg: any;
-           bindToEl(el: any): void;
-           handleClick(seg: any, ev: any): void;
-           handleMouseover(seg: any, ev: any): void;
-           handleMouseout(seg: any, ev?: any): void;
-           end(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/MouseFollower' {
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export class Default {
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           options: any;
-           sourceEl: any;
-           el: any;
-           parentEl: any;
-           top0: any;
-           left0: any;
-           y0: any;
-           x0: any;
-           topDelta: any;
-           leftDelta: any;
-           isFollowing: boolean;
-           isHidden: boolean;
-           isAnimating: boolean;
-           constructor(sourceEl: any, options: any);
-           start(ev: any): void;
-           stop(shouldRevert: any, callback: any): void;
-           getEl(): any;
-           removeElement(): void;
-           updatePosition(): void;
-           handleMove(ev: any): void;
-           hide(): void;
-           show(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/EventDragging' {
-       import EventDefMutation from 'fullcalendar/EventDefMutation';
-       import Interaction from 'fullcalendar/Interaction';
-       export class Default extends Interaction {
-           eventPointing: any;
-           dragListener: any;
-           isDragging: boolean;
-           constructor(component: any, eventPointing: any);
-           end(): void;
-           getSelectionDelay(): any;
-           bindToEl(el: any): void;
-           handleMousedown(seg: any, ev: any): void;
-           handleTouchStart(seg: any, ev: any): void;
-           buildSelectListener(seg: any): any;
-           buildDragListener(seg: any): any;
-           segDragStart(seg: any, ev: any): void;
-           segDragStop(seg: any, ev: any): void;
-           computeEventDropMutation(startFootprint: any, endFootprint: any, eventDef: any): EventDefMutation;
-           computeEventDateMutation(startFootprint: any, endFootprint: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DateSelecting' {
-       import HitDragListener from 'fullcalendar/HitDragListener';
-       import ComponentFootprint from 'fullcalendar/ComponentFootprint';
-       import Interaction from 'fullcalendar/Interaction';
-       export class Default extends Interaction {
-           dragListener: any;
-           constructor(component: any);
-           end(): void;
-           getDelay(): any;
-           bindToEl(el: any): void;
-           buildDragListener(): HitDragListener;
-           computeSelection(footprint0: any, footprint1: any): false | ComponentFootprint;
-           computeSelectionFootprint(footprint0: any, footprint1: any): ComponentFootprint;
-           isSelectionFootprintAllowed(componentFootprint: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DateClicking' {
-       import HitDragListener from 'fullcalendar/HitDragListener';
-       import Interaction from 'fullcalendar/Interaction';
-       export class Default extends Interaction {
-           dragListener: any;
-           constructor(component: any);
-           end(): void;
-           bindToEl(el: any): void;
-           buildDragListener(): HitDragListener;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/StandardInteractionsMixin' {
-       import Mixin from 'fullcalendar/Mixin';
-       export class Default extends Mixin {
-       }
-       export default Default;
-}
-declare module 'fullcalendar/TimeGridEventRenderer' {
-       import EventRenderer from 'fullcalendar/EventRenderer';
-       export class Default extends EventRenderer {
-           timeGrid: any;
-           constructor(timeGrid: any, fillRenderer: any);
-           renderFgSegs(segs: any): void;
-           renderFgSegsIntoContainers(segs: any, containerEls: any): void;
-           unrenderFgSegs(): void;
-           computeEventTimeFormat(): any;
-           computeDisplayEventEnd(): boolean;
-           fgSegHtml(seg: any, disableResizing: any): string;
-           updateFgSegCoords(segs: any): void;
-           computeFgSegHorizontals(segs: any): void;
-           computeFgSegForwardBack(seg: any, seriesBackwardPressure: any, seriesBackwardCoord: any): void;
-           sortForwardSegs(forwardSegs: any): void;
-           compareForwardSegs(seg1: any, seg2: any): any;
-           assignFgSegHorizontals(segs: any): void;
-           generateFgSegHorizontalCss(seg: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/TimeGridHelperRenderer' {
-       import HelperRenderer from 'fullcalendar/HelperRenderer';
-       export class Default extends HelperRenderer {
-           renderSegs(segs: any, sourceSeg: any): JQuery;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/TimeGridFillRenderer' {
-       import FillRenderer from 'fullcalendar/FillRenderer';
-       export class Default extends FillRenderer {
-           attachSegEls(type: any, segs: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/TimeGrid' {
-       import * as moment from 'moment';
-       import InteractiveDateComponent from 'fullcalendar/InteractiveDateComponent';
-       import { DayTableInterface } from 'fullcalendar/DayTableMixin';
-       import ComponentFootprint from 'fullcalendar/ComponentFootprint';
-       export class Default extends InteractiveDateComponent {
-           dayDates: DayTableInterface['dayDates'];
-           daysPerRow: DayTableInterface['daysPerRow'];
-           colCnt: DayTableInterface['colCnt'];
-           updateDayTable: DayTableInterface['updateDayTable'];
-           renderHeadHtml: DayTableInterface['renderHeadHtml'];
-           renderBgTrHtml: DayTableInterface['renderBgTrHtml'];
-           bookendCells: DayTableInterface['bookendCells'];
-           getCellDate: DayTableInterface['getCellDate'];
-           view: any;
-           helperRenderer: any;
-           dayRanges: any;
-           slotDuration: any;
-           snapDuration: any;
-           snapsPerSlot: any;
-           labelFormat: any;
-           labelInterval: any;
-           headContainerEl: any;
-           colEls: any;
-           slatContainerEl: any;
-           slatEls: any;
-           nowIndicatorEls: any;
-           colCoordCache: any;
-           slatCoordCache: any;
-           bottomRuleEl: any;
-           contentSkeletonEl: any;
-           colContainerEls: any;
-           fgContainerEls: any;
-           bgContainerEls: any;
-           helperContainerEls: any;
-           highlightContainerEls: any;
-           businessContainerEls: any;
-           helperSegs: any;
-           highlightSegs: any;
-           businessSegs: any;
-           constructor(view: any);
-           componentFootprintToSegs(componentFootprint: any): any[];
-           sliceRangeByTimes(unzonedRange: any): any[];
-           processOptions(): void;
-           computeLabelInterval(slotDuration: any): any;
-           renderDates(dateProfile: any): void;
-           unrenderDates(): void;
-           renderSkeleton(): void;
-           renderSlats(): void;
-           renderSlatRowHtml(): string;
-           renderColumns(): void;
-           unrenderColumns(): void;
-           renderContentSkeleton(): void;
-           unrenderContentSkeleton(): void;
-           groupSegsByCol(segs: any): any[];
-           attachSegsByCol(segsByCol: any, containerEls: any): void;
-           getNowIndicatorUnit(): string;
-           renderNowIndicator(date: any): void;
-           unrenderNowIndicator(): void;
-           updateSize(totalHeight: any, isAuto: any, isResize: any): void;
-           getTotalSlatHeight(): any;
-           computeDateTop(ms: any, startOfDayDate: any): any;
-           computeTimeTop(time: any): any;
-           updateSegVerticals(segs: any): void;
-           computeSegVerticals(segs: any): void;
-           assignSegVerticals(segs: any): void;
-           generateSegVerticalCss(seg: any): {
-               top: any;
-               bottom: number;
-           };
-           prepareHits(): void;
-           releaseHits(): void;
-           queryHit(leftOffset: any, topOffset: any): any;
-           getHitFootprint(hit: any): ComponentFootprint;
-           computeSnapTime(snapIndex: any): moment.Duration;
-           getHitEl(hit: any): any;
-           renderDrag(eventFootprints: any, seg: any, isTouch: any): boolean;
-           unrenderDrag(): void;
-           renderEventResize(eventFootprints: any, seg: any, isTouch: any): void;
-           unrenderEventResize(): void;
-           renderSelectionFootprint(componentFootprint: any): void;
-           unrenderSelection(): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Popover' {
-       import { ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export class Default {
-           listenTo: ListenerInterface['listenTo'];
-           stopListeningTo: ListenerInterface['stopListeningTo'];
-           isHidden: boolean;
-           options: any;
-           el: any;
-           margin: number;
-           constructor(options: any);
-           show(): void;
-           hide(): void;
-           render(): void;
-           documentMousedown(ev: any): void;
-           removeElement(): void;
-           position(): void;
-           trigger(name: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DayGridEventRenderer' {
-       import EventRenderer from 'fullcalendar/EventRenderer';
-       export class Default extends EventRenderer {
-           dayGrid: any;
-           rowStructs: any;
-           constructor(dayGrid: any, fillRenderer: any);
-           renderBgRanges(eventRanges: any): void;
-           renderFgSegs(segs: any): void;
-           unrenderFgSegs(): void;
-           renderSegRows(segs: any): any[];
-           renderSegRow(row: any, rowSegs: any): {
-               row: any;
-               tbodyEl: JQuery;
-               cellMatrix: any[];
-               segMatrix: any[];
-               segLevels: any[];
-               segs: any;
-           };
-           buildSegLevels(segs: any): any[];
-           groupSegRows(segs: any): any[];
-           computeEventTimeFormat(): any;
-           computeDisplayEventEnd(): boolean;
-           fgSegHtml(seg: any, disableResizing: any): string;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DayGridHelperRenderer' {
-       import HelperRenderer from 'fullcalendar/HelperRenderer';
-       export class Default extends HelperRenderer {
-           renderSegs(segs: any, sourceSeg: any): JQuery;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DayGridFillRenderer' {
-       import FillRenderer from 'fullcalendar/FillRenderer';
-       export class Default extends FillRenderer {
-           fillSegTag: string;
-           attachSegEls(type: any, segs: any): any[];
-           renderFillRow(type: any, seg: any): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/DayGrid' {
-       import ComponentFootprint from 'fullcalendar/ComponentFootprint';
-       import InteractiveDateComponent from 'fullcalendar/InteractiveDateComponent';
-       import { DayTableInterface } from 'fullcalendar/DayTableMixin';
-       export class Default extends InteractiveDateComponent {
-           rowCnt: DayTableInterface['rowCnt'];
-           colCnt: DayTableInterface['colCnt'];
-           daysPerRow: DayTableInterface['daysPerRow'];
-           sliceRangeByRow: DayTableInterface['sliceRangeByRow'];
-           updateDayTable: DayTableInterface['updateDayTable'];
-           renderHeadHtml: DayTableInterface['renderHeadHtml'];
-           getCellDate: DayTableInterface['getCellDate'];
-           renderBgTrHtml: DayTableInterface['renderBgTrHtml'];
-           renderIntroHtml: DayTableInterface['renderIntroHtml'];
-           getCellRange: DayTableInterface['getCellRange'];
-           sliceRangeByDay: DayTableInterface['sliceRangeByDay'];
-           view: any;
-           helperRenderer: any;
-           cellWeekNumbersVisible: boolean;
-           bottomCoordPadding: number;
-           headContainerEl: any;
-           rowEls: any;
-           cellEls: any;
-           rowCoordCache: any;
-           colCoordCache: any;
-           isRigid: boolean;
-           hasAllDayBusinessHours: boolean;
-           segPopover: any;
-           popoverSegs: any;
-           constructor(view: any);
-           componentFootprintToSegs(componentFootprint: any): any;
-           renderDates(dateProfile: any): void;
-           unrenderDates(): void;
-           renderGrid(): void;
-           renderDayRowHtml(row: any, isRigid: any): string;
-           getIsNumbersVisible(): boolean;
-           getIsDayNumbersVisible(): boolean;
-           renderNumberTrHtml(row: any): string;
-           renderNumberIntroHtml(row: any): any;
-           renderNumberCellsHtml(row: any): string;
-           renderNumberCellHtml(date: any): string;
-           prepareHits(): void;
-           releaseHits(): void;
-           queryHit(leftOffset: any, topOffset: any): any;
-           getHitFootprint(hit: any): ComponentFootprint;
-           getHitEl(hit: any): any;
-           getCellHit(row: any, col: any): any;
-           getCellEl(row: any, col: any): any;
-           executeEventUnrender(): void;
-           getOwnEventSegs(): any;
-           renderDrag(eventFootprints: any, seg: any, isTouch: any): boolean;
-           unrenderDrag(): void;
-           renderEventResize(eventFootprints: any, seg: any, isTouch: any): void;
-           unrenderEventResize(): void;
-           removeSegPopover(): void;
-           limitRows(levelLimit: any): void;
-           computeRowLevelLimit(row: any): (number | false);
-           limitRow(row: any, levelLimit: any): void;
-           unlimitRow(row: any): void;
-           renderMoreLink(row: any, col: any, hiddenSegs: any): JQuery;
-           showSegPopover(row: any, col: any, moreLink: any, segs: any): void;
-           renderSegPopoverContent(row: any, col: any, segs: any): JQuery;
-           resliceDaySegs(segs: any, dayDate: any): any[];
-           getMoreLinkText(num: any): any;
-           getCellSegs(row: any, col: any, startLevel?: any): any[];
-       }
-       export default Default;
-}
-declare module 'fullcalendar/AgendaView' {
-       import View from 'fullcalendar/View';
-       export class Default extends View {
-           timeGridClass: any;
-           dayGridClass: any;
-           timeGrid: any;
-           dayGrid: any;
-           scroller: any;
-           axisWidth: any;
-           usesMinMaxTime: boolean;
-           constructor(calendar: any, viewSpec: any);
-           instantiateTimeGrid(): any;
-           instantiateDayGrid(): any;
-           renderSkeleton(): void;
-           unrenderSkeleton(): void;
-           renderSkeletonHtml(): string;
-           axisStyleAttr(): string;
-           getNowIndicatorUnit(): any;
-           updateSize(totalHeight: any, isAuto: any, isResize: any): void;
-           computeScrollerHeight(totalHeight: any): number;
-           computeInitialDateScroll(): {
-               top: any;
-           };
-           queryDateScroll(): {
-               top: any;
-           };
-           applyDateScroll(scroll: any): void;
-           getHitFootprint(hit: any): any;
-           getHitEl(hit: any): any;
-           executeEventRender(eventsPayload: any): void;
-           renderDrag(eventFootprints: any, seg: any, isTouch: any): boolean;
-           renderEventResize(eventFootprints: any, seg: any, isTouch: any): void;
-           renderSelectionFootprint(componentFootprint: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/BasicViewDateProfileGenerator' {
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       import DateProfileGenerator from 'fullcalendar/DateProfileGenerator';
-       export class Default extends DateProfileGenerator {
-           buildRenderRange(currentUnzonedRange: any, currentRangeUnit: any, isRangeAllDay: any): UnzonedRange;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/BasicView' {
-       import View from 'fullcalendar/View';
-       export class Default extends View {
-           dateProfileGeneratorClass: any;
-           dayGridClass: any;
-           scroller: any;
-           dayGrid: any;
-           weekNumberWidth: any;
-           constructor(calendar: any, viewSpec: any);
-           instantiateDayGrid(): any;
-           executeDateRender(dateProfile: any): void;
-           renderSkeleton(): void;
-           unrenderSkeleton(): void;
-           renderSkeletonHtml(): string;
-           weekNumberStyleAttr(): string;
-           hasRigidRows(): boolean;
-           updateSize(totalHeight: any, isAuto: any, isResize: any): void;
-           computeScrollerHeight(totalHeight: any): number;
-           setGridHeight(height: any, isAuto: any): void;
-           computeInitialDateScroll(): {
-               top: number;
-           };
-           queryDateScroll(): {
-               top: any;
-           };
-           applyDateScroll(scroll: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/MonthViewDateProfileGenerator' {
-       import BasicViewDateProfileGenerator from 'fullcalendar/BasicViewDateProfileGenerator';
-       import UnzonedRange from 'fullcalendar/UnzonedRange';
-       export class Default extends BasicViewDateProfileGenerator {
-           buildRenderRange(currentUnzonedRange: any, currentRangeUnit: any, isRangeAllDay: any): UnzonedRange;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/MonthView' {
-       import BasicView from 'fullcalendar/BasicView';
-       export class Default extends BasicView {
-           setGridHeight(height: any, isAuto: any): void;
-           isDateInOtherMonth(date: any, dateProfile: any): boolean;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ListEventRenderer' {
-       import EventRenderer from 'fullcalendar/EventRenderer';
-       export class Default extends EventRenderer {
-           renderFgSegs(segs: any): void;
-           fgSegHtml(seg: any): string;
-           computeEventTimeFormat(): any;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ListEventPointing' {
-       import EventPointing from 'fullcalendar/EventPointing';
-       export class Default extends EventPointing {
-           handleClick(seg: any, ev: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/ListView' {
-       import View from 'fullcalendar/View';
-       export class Default extends View {
-           eventRendererClass: any;
-           eventPointingClass: any;
-           segSelector: any;
-           scroller: any;
-           contentEl: any;
-           dayDates: any;
-           dayRanges: any;
-           constructor(calendar: any, viewSpec: any);
-           renderSkeleton(): void;
-           unrenderSkeleton(): void;
-           updateSize(totalHeight: any, isAuto: any, isResize: any): void;
-           computeScrollerHeight(totalHeight: any): number;
-           renderDates(dateProfile: any): void;
-           componentFootprintToSegs(footprint: any): any[];
-           renderEmptyMessage(): void;
-           renderSegList(allSegs: any): void;
-           groupSegsByDay(segs: any): any[];
-           dayHeaderHtml(dayDate: any): string;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/exports' {
-       export const version = "<%= version %>";
-       export const internalApiVersion = 12;
-       export { BusinessHoursInput, EventObjectInput, EventOptionsBase, OptionsInput } from 'fullcalendar/src/types/input-types';
-       export { applyAll, debounce, isInt, htmlEscape, cssToStr, proxy, capitaliseFirstLetter, getOuterRect, getClientRect, getContentRect, getScrollbarWidths, preventDefault, parseFieldSpecs, compareByFieldSpecs, compareByFieldSpec, flexibleCompare, computeGreatestUnit, divideRangeByDuration, divideDurationByDuration, multiplyDuration, durationHasTime, log, warn, removeExact, intersectRects } from 'fullcalendar/src/util';
-       export { formatDate, formatRange, queryMostGranularFormatUnit } from 'fullcalendar/src/date-formatting';
-       export { datepickerLocale, locale } from 'fullcalendar/src/locale';
-       export { default as moment } from 'fullcalendar/src/moment-ext';
-       export { default as EmitterMixin, EmitterInterface } from 'fullcalendar/EmitterMixin';
-       export { default as ListenerMixin, ListenerInterface } from 'fullcalendar/ListenerMixin';
-       export { default as Model } from 'fullcalendar/Model';
-       export { default as Constraints } from 'fullcalendar/Constraints';
-       export { default as UnzonedRange } from 'fullcalendar/UnzonedRange';
-       export { default as ComponentFootprint } from 'fullcalendar/ComponentFootprint';
-       export { default as BusinessHourGenerator } from 'fullcalendar/BusinessHourGenerator';
-       export { default as EventDef } from 'fullcalendar/EventDef';
-       export { default as EventDefMutation } from 'fullcalendar/EventDefMutation';
-       export { default as EventSourceParser } from 'fullcalendar/EventSourceParser';
-       export { default as EventSource } from 'fullcalendar/EventSource';
-       export { defineThemeSystem } from 'fullcalendar/ThemeRegistry';
-       export { default as EventInstanceGroup } from 'fullcalendar/EventInstanceGroup';
-       export { default as ArrayEventSource } from 'fullcalendar/ArrayEventSource';
-       export { default as FuncEventSource } from 'fullcalendar/FuncEventSource';
-       export { default as JsonFeedEventSource } from 'fullcalendar/JsonFeedEventSource';
-       export { default as EventFootprint } from 'fullcalendar/EventFootprint';
-       export { default as Class } from 'fullcalendar/Class';
-       export { default as Mixin } from 'fullcalendar/Mixin';
-       export { default as CoordCache } from 'fullcalendar/CoordCache';
-       export { default as DragListener } from 'fullcalendar/DragListener';
-       export { default as Promise } from 'fullcalendar/Promise';
-       export { default as TaskQueue } from 'fullcalendar/TaskQueue';
-       export { default as RenderQueue } from 'fullcalendar/RenderQueue';
-       export { default as Scroller } from 'fullcalendar/Scroller';
-       export { default as Theme } from 'fullcalendar/Theme';
-       export { default as DateComponent } from 'fullcalendar/DateComponent';
-       export { default as InteractiveDateComponent } from 'fullcalendar/InteractiveDateComponent';
-       export { default as Calendar } from 'fullcalendar/Calendar';
-       export { default as View } from 'fullcalendar/View';
-       export { defineView, getViewConfig } from 'fullcalendar/ViewRegistry';
-       export { default as DayTableMixin } from 'fullcalendar/DayTableMixin';
-       export { default as BusinessHourRenderer } from 'fullcalendar/BusinessHourRenderer';
-       export { default as EventRenderer } from 'fullcalendar/EventRenderer';
-       export { default as FillRenderer } from 'fullcalendar/FillRenderer';
-       export { default as HelperRenderer } from 'fullcalendar/HelperRenderer';
-       export { default as ExternalDropping } from 'fullcalendar/ExternalDropping';
-       export { default as EventResizing } from 'fullcalendar/EventResizing';
-       export { default as EventPointing } from 'fullcalendar/EventPointing';
-       export { default as EventDragging } from 'fullcalendar/EventDragging';
-       export { default as DateSelecting } from 'fullcalendar/DateSelecting';
-       export { default as StandardInteractionsMixin } from 'fullcalendar/StandardInteractionsMixin';
-       export { default as AgendaView } from 'fullcalendar/AgendaView';
-       export { default as TimeGrid } from 'fullcalendar/TimeGrid';
-       export { default as DayGrid } from 'fullcalendar/DayGrid';
-       export { default as BasicView } from 'fullcalendar/BasicView';
-       export { default as MonthView } from 'fullcalendar/MonthView';
-       export { default as ListView } from 'fullcalendar/ListView';
-}
-declare module 'fullcalendar/src/models/event-source/config' {
-       export {};
-}
-declare module 'fullcalendar/Bootstrap3Theme' {
-       import Theme from 'fullcalendar/Theme';
-       export class Default extends Theme {
-       }
-       export default Default;
-}
-declare module 'fullcalendar/Bootstrap4Theme' {
-       import Theme from 'fullcalendar/Theme';
-       export class Default extends Theme {
-       }
-       export default Default;
-}
-declare module 'fullcalendar/src/theme/config' {
-       export {};
-}
-declare module 'fullcalendar/src/basic/config' {
-       export {};
-}
-declare module 'fullcalendar/src/agenda/config' {
-       export {};
-}
-declare module 'fullcalendar/src/list/config' {
-       export {};
-}
-declare module 'fullcalendar/src/types/jquery-hooks' {
-       import * as moment from 'moment';
-       import Calendar from 'fullcalendar/Calendar';
-       import View from 'fullcalendar/View';
-       import EventSource from 'fullcalendar/EventSource';
-       import { RangeInput, MomentInput, OptionsInput, EventObjectInput, EventSourceInput } from 'fullcalendar/src/types/input-types'; global  {
-           interface JQueryStatic {
-               fullCalendar: object;
-           }
-           interface JQuery {
-               fullCalendar(options?: OptionsInput): JQuery;
-               fullCalendar(method: 'getCalendar'): Calendar;
-               fullCalendar(method: 'getView'): View;
-               fullCalendar(method: 'destroy'): JQuery;
-               fullCalendar(method: 'option', name: string | object, value?: any): any;
-               fullCalendar(method: 'isValidViewType', viewType: string): boolean;
-               fullCalendar(method: 'changeView', viewName: string, dateOrRange?: RangeInput | MomentInput): JQuery;
-               fullCalendar(method: 'zoomTo', newDate: moment.Moment, viewType?: string): JQuery;
-               fullCalendar(method: 'prev'): JQuery;
-               fullCalendar(method: 'next'): JQuery;
-               fullCalendar(method: 'prevYear'): JQuery;
-               fullCalendar(method: 'nextYear'): JQuery;
-               fullCalendar(method: 'today'): JQuery;
-               fullCalendar(method: 'gotoDate', zonedDateInput: any): JQuery;
-               fullCalendar(method: 'incrementDate', delta: any): JQuery;
-               fullCalendar(method: 'getDate'): moment.Moment;
-               fullCalendar(method: 'render'): JQuery;
-               fullCalendar(method: 'select', zonedStartInput: MomentInput, zonedEndInput?: MomentInput, resourceId?: string): JQuery;
-               fullCalendar(method: 'unselect'): JQuery;
-               fullCalendar(method: 'moment', ...args: any[]): moment.Moment;
-               fullCalendar(method: 'getNow'): moment.Moment;
-               fullCalendar(method: 'rerenderEvents'): JQuery;
-               fullCalendar(method: 'refetchEvents'): JQuery;
-               fullCalendar(method: 'renderEvents', eventInputs: EventObjectInput[], isSticky?: boolean): JQuery;
-               fullCalendar(method: 'renderEvent', eventInput: EventObjectInput, isSticky?: boolean): JQuery;
-               fullCalendar(method: 'removeEvents', legacyQuery?: any): JQuery;
-               fullCalendar(method: 'clientEvents', legacyQuery: any): any;
-               fullCalendar(method: 'updateEvents', eventPropsArray: EventObjectInput[]): JQuery;
-               fullCalendar(method: 'updateEvent', eventProps: EventObjectInput): JQuery;
-               fullCalendar(method: 'getEventSources'): EventSource;
-               fullCalendar(method: 'getEventSourceById', id: any): EventSource;
-               fullCalendar(method: 'addEventSource', sourceInput: EventSourceInput): JQuery;
-               fullCalendar(method: 'removeEventSources', sourceMultiQuery: any): JQuery;
-               fullCalendar(method: 'removeEventSource', sourceQuery: any): JQuery;
-               fullCalendar(method: 'refetchEventSources', sourceMultiQuery: any): JQuery;
-           }
-       }
-}
-declare module 'fullcalendar/src/main' {
-       import * as exportHooks from 'fullcalendar/src/exports';
-       import 'fullcalendar/src/moment-ext';
-       import 'fullcalendar/src/date-formatting';
-       import 'fullcalendar/src/models/event-source/config';
-       import 'fullcalendar/src/theme/config';
-       import 'fullcalendar/src/basic/config';
-       import 'fullcalendar/src/agenda/config';
-       import 'fullcalendar/src/list/config';
-       import 'fullcalendar/src/types/jquery-hooks';
-       export = exportHooks;
-}
-declare module 'fullcalendar/plugins/gcal/GcalEventSource' {
-       /// <reference types="jquery" />
-       import { EventSource } from 'fullcalendar';
-       export class Default extends EventSource {
-           static API_BASE: string;
-           googleCalendarApiKey: any;
-           googleCalendarId: any;
-           googleCalendarError: any;
-           ajaxSettings: any;
-           static parse(rawInput: any, calendar: any): any;
-           fetch(start: any, end: any, timezone: any): JQueryPromise<{}>;
-           gcalItemsToRawEventDefs(items: any, gcalTimezone: any): any;
-           gcalItemToRawEventDef(item: any, gcalTimezone: any): {
-               id: any;
-               title: any;
-               start: any;
-               end: any;
-               url: any;
-               location: any;
-               description: any;
-           };
-           buildUrl(): string;
-           buildRequestParams(start: any, end: any, timezone: any): any;
-           reportError(message: any, apiErrorObjs?: any): void;
-           getPrimitive(): any;
-           applyManualStandardProps(rawProps: any): any;
-           applyMiscProps(rawProps: any): void;
-       }
-       export default Default;
-}
-declare module 'fullcalendar/plugins/gcal/main' {
-       export {};
-}
-declare module 'fullcalendar' {
-       import main = require('fullcalendar/src/main');
-       export = main;
-}
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.js b/backoffice/vendors/fullcalendar/fullcalendar.js
deleted file mode 100644 (file)
index f40962b..0000000
+++ /dev/null
@@ -1,15010 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-(function webpackUniversalModuleDefinition(root, factory) {
-       if(typeof exports === 'object' && typeof module === 'object')
-               module.exports = factory(require("moment"), require("jquery"));
-       else if(typeof define === 'function' && define.amd)
-               define(["moment", "jquery"], factory);
-       else if(typeof exports === 'object')
-               exports["FullCalendar"] = factory(require("moment"), require("jquery"));
-       else
-               root["FullCalendar"] = factory(root["moment"], root["jQuery"]);
-})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3__) {
-return /******/ (function(modules) { // webpackBootstrap
-/******/       // The module cache
-/******/       var installedModules = {};
-/******/
-/******/       // The require function
-/******/       function __webpack_require__(moduleId) {
-/******/
-/******/               // Check if module is in cache
-/******/               if(installedModules[moduleId]) {
-/******/                       return installedModules[moduleId].exports;
-/******/               }
-/******/               // Create a new module (and put it into the cache)
-/******/               var module = installedModules[moduleId] = {
-/******/                       i: moduleId,
-/******/                       l: false,
-/******/                       exports: {}
-/******/               };
-/******/
-/******/               // Execute the module function
-/******/               modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/               // Flag the module as loaded
-/******/               module.l = true;
-/******/
-/******/               // Return the exports of the module
-/******/               return module.exports;
-/******/       }
-/******/
-/******/
-/******/       // expose the modules object (__webpack_modules__)
-/******/       __webpack_require__.m = modules;
-/******/
-/******/       // expose the module cache
-/******/       __webpack_require__.c = installedModules;
-/******/
-/******/       // define getter function for harmony exports
-/******/       __webpack_require__.d = function(exports, name, getter) {
-/******/               if(!__webpack_require__.o(exports, name)) {
-/******/                       Object.defineProperty(exports, name, {
-/******/                               configurable: false,
-/******/                               enumerable: true,
-/******/                               get: getter
-/******/                       });
-/******/               }
-/******/       };
-/******/
-/******/       // getDefaultExport function for compatibility with non-harmony modules
-/******/       __webpack_require__.n = function(module) {
-/******/               var getter = module && module.__esModule ?
-/******/                       function getDefault() { return module['default']; } :
-/******/                       function getModuleExports() { return module; };
-/******/               __webpack_require__.d(getter, 'a', getter);
-/******/               return getter;
-/******/       };
-/******/
-/******/       // Object.prototype.hasOwnProperty.call
-/******/       __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/       // __webpack_public_path__
-/******/       __webpack_require__.p = "";
-/******/
-/******/       // Load entry module and return exports
-/******/       return __webpack_require__(__webpack_require__.s = 236);
-/******/ })
-/************************************************************************/
-/******/ ([
-/* 0 */
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE_0__;
-
-/***/ }),
-/* 1 */,
-/* 2 */
-/***/ (function(module, exports) {
-
-/*
-derived from:
-https://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js
-
-only include the helpers we need, to keep down filesize
-*/
-var extendStatics = Object.setPrototypeOf ||
-    ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-    function (d, b) { for (var p in b)
-        if (b.hasOwnProperty(p))
-            d[p] = b[p]; };
-exports.__extends = function (d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-
-
-/***/ }),
-/* 3 */
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
-
-/***/ }),
-/* 4 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment = __webpack_require__(0);
-var $ = __webpack_require__(3);
-/* FullCalendar-specific DOM Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
-// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
-function compensateScroll(rowEls, scrollbarWidths) {
-    if (scrollbarWidths.left) {
-        rowEls.css({
-            'border-left-width': 1,
-            'margin-left': scrollbarWidths.left - 1
-        });
-    }
-    if (scrollbarWidths.right) {
-        rowEls.css({
-            'border-right-width': 1,
-            'margin-right': scrollbarWidths.right - 1
-        });
-    }
-}
-exports.compensateScroll = compensateScroll;
-// Undoes compensateScroll and restores all borders/margins
-function uncompensateScroll(rowEls) {
-    rowEls.css({
-        'margin-left': '',
-        'margin-right': '',
-        'border-left-width': '',
-        'border-right-width': ''
-    });
-}
-exports.uncompensateScroll = uncompensateScroll;
-// Make the mouse cursor express that an event is not allowed in the current area
-function disableCursor() {
-    $('body').addClass('fc-not-allowed');
-}
-exports.disableCursor = disableCursor;
-// Returns the mouse cursor to its original look
-function enableCursor() {
-    $('body').removeClass('fc-not-allowed');
-}
-exports.enableCursor = enableCursor;
-// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
-// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
-// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
-// reduces the available height.
-function distributeHeight(els, availableHeight, shouldRedistribute) {
-    // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
-    // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
-    var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
-    var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
-    var flexEls = []; // elements that are allowed to expand. array of DOM nodes
-    var flexOffsets = []; // amount of vertical space it takes up
-    var flexHeights = []; // actual css height
-    var usedHeight = 0;
-    undistributeHeight(els); // give all elements their natural height
-    // find elements that are below the recommended height (expandable).
-    // important to query for heights in a single first pass (to avoid reflow oscillation).
-    els.each(function (i, el) {
-        var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
-        var naturalOffset = $(el).outerHeight(true);
-        if (naturalOffset < minOffset) {
-            flexEls.push(el);
-            flexOffsets.push(naturalOffset);
-            flexHeights.push($(el).height());
-        }
-        else {
-            // this element stretches past recommended height (non-expandable). mark the space as occupied.
-            usedHeight += naturalOffset;
-        }
-    });
-    // readjust the recommended height to only consider the height available to non-maxed-out rows.
-    if (shouldRedistribute) {
-        availableHeight -= usedHeight;
-        minOffset1 = Math.floor(availableHeight / flexEls.length);
-        minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
-    }
-    // assign heights to all expandable elements
-    $(flexEls).each(function (i, el) {
-        var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
-        var naturalOffset = flexOffsets[i];
-        var naturalHeight = flexHeights[i];
-        var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
-        if (naturalOffset < minOffset) {
-            $(el).height(newHeight);
-        }
-    });
-}
-exports.distributeHeight = distributeHeight;
-// Undoes distrubuteHeight, restoring all els to their natural height
-function undistributeHeight(els) {
-    els.height('');
-}
-exports.undistributeHeight = undistributeHeight;
-// Given `els`, a jQuery set of <td> cells, find the cell with the largest natural width and set the widths of all the
-// cells to be that width.
-// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
-function matchCellWidths(els) {
-    var maxInnerWidth = 0;
-    els.find('> *').each(function (i, innerEl) {
-        var innerWidth = $(innerEl).outerWidth();
-        if (innerWidth > maxInnerWidth) {
-            maxInnerWidth = innerWidth;
-        }
-    });
-    maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
-    els.width(maxInnerWidth);
-    return maxInnerWidth;
-}
-exports.matchCellWidths = matchCellWidths;
-// Given one element that resides inside another,
-// Subtracts the height of the inner element from the outer element.
-function subtractInnerElHeight(outerEl, innerEl) {
-    var both = outerEl.add(innerEl);
-    var diff;
-    // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
-    both.css({
-        position: 'relative',
-        left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
-    });
-    diff = outerEl.outerHeight() - innerEl.outerHeight(); // grab the dimensions
-    both.css({ position: '', left: '' }); // undo hack
-    return diff;
-}
-exports.subtractInnerElHeight = subtractInnerElHeight;
-/* Element Geom Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-// borrowed from https://github.com/jquery/jquery-ui/blob/1.11.0/ui/core.js#L51
-function getScrollParent(el) {
-    var position = el.css('position');
-    var scrollParent = el.parents().filter(function () {
-        var parent = $(this);
-        return (/(auto|scroll)/).test(parent.css('overflow') + parent.css('overflow-y') + parent.css('overflow-x'));
-    }).eq(0);
-    return position === 'fixed' || !scrollParent.length ? $(el[0].ownerDocument || document) : scrollParent;
-}
-exports.getScrollParent = getScrollParent;
-// Queries the outer bounding area of a jQuery element.
-// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).
-// Origin is optional.
-function getOuterRect(el, origin) {
-    var offset = el.offset();
-    var left = offset.left - (origin ? origin.left : 0);
-    var top = offset.top - (origin ? origin.top : 0);
-    return {
-        left: left,
-        right: left + el.outerWidth(),
-        top: top,
-        bottom: top + el.outerHeight()
-    };
-}
-exports.getOuterRect = getOuterRect;
-// Queries the area within the margin/border/scrollbars of a jQuery element. Does not go within the padding.
-// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).
-// Origin is optional.
-// WARNING: given element can't have borders
-// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.
-function getClientRect(el, origin) {
-    var offset = el.offset();
-    var scrollbarWidths = getScrollbarWidths(el);
-    var left = offset.left + getCssFloat(el, 'border-left-width') + scrollbarWidths.left - (origin ? origin.left : 0);
-    var top = offset.top + getCssFloat(el, 'border-top-width') + scrollbarWidths.top - (origin ? origin.top : 0);
-    return {
-        left: left,
-        right: left + el[0].clientWidth,
-        top: top,
-        bottom: top + el[0].clientHeight // clientHeight includes padding but NOT scrollbars
-    };
-}
-exports.getClientRect = getClientRect;
-// Queries the area within the margin/border/padding of a jQuery element. Assumed not to have scrollbars.
-// Returns a rectangle with absolute coordinates: left, right (exclusive), top, bottom (exclusive).
-// Origin is optional.
-function getContentRect(el, origin) {
-    var offset = el.offset(); // just outside of border, margin not included
-    var left = offset.left + getCssFloat(el, 'border-left-width') + getCssFloat(el, 'padding-left') -
-        (origin ? origin.left : 0);
-    var top = offset.top + getCssFloat(el, 'border-top-width') + getCssFloat(el, 'padding-top') -
-        (origin ? origin.top : 0);
-    return {
-        left: left,
-        right: left + el.width(),
-        top: top,
-        bottom: top + el.height()
-    };
-}
-exports.getContentRect = getContentRect;
-// Returns the computed left/right/top/bottom scrollbar widths for the given jQuery element.
-// WARNING: given element can't have borders (which will cause offsetWidth/offsetHeight to be larger).
-// NOTE: should use clientLeft/clientTop, but very unreliable cross-browser.
-function getScrollbarWidths(el) {
-    var leftRightWidth = el[0].offsetWidth - el[0].clientWidth;
-    var bottomWidth = el[0].offsetHeight - el[0].clientHeight;
-    var widths;
-    leftRightWidth = sanitizeScrollbarWidth(leftRightWidth);
-    bottomWidth = sanitizeScrollbarWidth(bottomWidth);
-    widths = { left: 0, right: 0, top: 0, bottom: bottomWidth };
-    if (getIsLeftRtlScrollbars() && el.css('direction') === 'rtl') {
-        widths.left = leftRightWidth;
-    }
-    else {
-        widths.right = leftRightWidth;
-    }
-    return widths;
-}
-exports.getScrollbarWidths = getScrollbarWidths;
-// The scrollbar width computations in getScrollbarWidths are sometimes flawed when it comes to
-// retina displays, rounding, and IE11. Massage them into a usable value.
-function sanitizeScrollbarWidth(width) {
-    width = Math.max(0, width); // no negatives
-    width = Math.round(width);
-    return width;
-}
-// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
-var _isLeftRtlScrollbars = null;
-function getIsLeftRtlScrollbars() {
-    if (_isLeftRtlScrollbars === null) {
-        _isLeftRtlScrollbars = computeIsLeftRtlScrollbars();
-    }
-    return _isLeftRtlScrollbars;
-}
-function computeIsLeftRtlScrollbars() {
-    var el = $('<div><div/></div>')
-        .css({
-        position: 'absolute',
-        top: -1000,
-        left: 0,
-        border: 0,
-        padding: 0,
-        overflow: 'scroll',
-        direction: 'rtl'
-    })
-        .appendTo('body');
-    var innerEl = el.children();
-    var res = innerEl.offset().left > el.offset().left; // is the inner div shifted to accommodate a left scrollbar?
-    el.remove();
-    return res;
-}
-// Retrieves a jQuery element's computed CSS value as a floating-point number.
-// If the queried value is non-numeric (ex: IE can return "medium" for border width), will just return zero.
-function getCssFloat(el, prop) {
-    return parseFloat(el.css(prop)) || 0;
-}
-/* Mouse / Touch Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
-function isPrimaryMouseButton(ev) {
-    return ev.which === 1 && !ev.ctrlKey;
-}
-exports.isPrimaryMouseButton = isPrimaryMouseButton;
-function getEvX(ev) {
-    var touches = ev.originalEvent.touches;
-    // on mobile FF, pageX for touch events is present, but incorrect,
-    // so, look at touch coordinates first.
-    if (touches && touches.length) {
-        return touches[0].pageX;
-    }
-    return ev.pageX;
-}
-exports.getEvX = getEvX;
-function getEvY(ev) {
-    var touches = ev.originalEvent.touches;
-    // on mobile FF, pageX for touch events is present, but incorrect,
-    // so, look at touch coordinates first.
-    if (touches && touches.length) {
-        return touches[0].pageY;
-    }
-    return ev.pageY;
-}
-exports.getEvY = getEvY;
-function getEvIsTouch(ev) {
-    return /^touch/.test(ev.type);
-}
-exports.getEvIsTouch = getEvIsTouch;
-function preventSelection(el) {
-    el.addClass('fc-unselectable')
-        .on('selectstart', preventDefault);
-}
-exports.preventSelection = preventSelection;
-function allowSelection(el) {
-    el.removeClass('fc-unselectable')
-        .off('selectstart', preventDefault);
-}
-exports.allowSelection = allowSelection;
-// Stops a mouse/touch event from doing it's native browser action
-function preventDefault(ev) {
-    ev.preventDefault();
-}
-exports.preventDefault = preventDefault;
-/* General Geometry Utils
-----------------------------------------------------------------------------------------------------------------------*/
-// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
-function intersectRects(rect1, rect2) {
-    var res = {
-        left: Math.max(rect1.left, rect2.left),
-        right: Math.min(rect1.right, rect2.right),
-        top: Math.max(rect1.top, rect2.top),
-        bottom: Math.min(rect1.bottom, rect2.bottom)
-    };
-    if (res.left < res.right && res.top < res.bottom) {
-        return res;
-    }
-    return false;
-}
-exports.intersectRects = intersectRects;
-// Returns a new point that will have been moved to reside within the given rectangle
-function constrainPoint(point, rect) {
-    return {
-        left: Math.min(Math.max(point.left, rect.left), rect.right),
-        top: Math.min(Math.max(point.top, rect.top), rect.bottom)
-    };
-}
-exports.constrainPoint = constrainPoint;
-// Returns a point that is the center of the given rectangle
-function getRectCenter(rect) {
-    return {
-        left: (rect.left + rect.right) / 2,
-        top: (rect.top + rect.bottom) / 2
-    };
-}
-exports.getRectCenter = getRectCenter;
-// Subtracts point2's coordinates from point1's coordinates, returning a delta
-function diffPoints(point1, point2) {
-    return {
-        left: point1.left - point2.left,
-        top: point1.top - point2.top
-    };
-}
-exports.diffPoints = diffPoints;
-/* Object Ordering by Field
-----------------------------------------------------------------------------------------------------------------------*/
-function parseFieldSpecs(input) {
-    var specs = [];
-    var tokens = [];
-    var i;
-    var token;
-    if (typeof input === 'string') {
-        tokens = input.split(/\s*,\s*/);
-    }
-    else if (typeof input === 'function') {
-        tokens = [input];
-    }
-    else if ($.isArray(input)) {
-        tokens = input;
-    }
-    for (i = 0; i < tokens.length; i++) {
-        token = tokens[i];
-        if (typeof token === 'string') {
-            specs.push(token.charAt(0) === '-' ?
-                { field: token.substring(1), order: -1 } :
-                { field: token, order: 1 });
-        }
-        else if (typeof token === 'function') {
-            specs.push({ func: token });
-        }
-    }
-    return specs;
-}
-exports.parseFieldSpecs = parseFieldSpecs;
-function compareByFieldSpecs(obj1, obj2, fieldSpecs, obj1fallback, obj2fallback) {
-    var i;
-    var cmp;
-    for (i = 0; i < fieldSpecs.length; i++) {
-        cmp = compareByFieldSpec(obj1, obj2, fieldSpecs[i], obj1fallback, obj2fallback);
-        if (cmp) {
-            return cmp;
-        }
-    }
-    return 0;
-}
-exports.compareByFieldSpecs = compareByFieldSpecs;
-function compareByFieldSpec(obj1, obj2, fieldSpec, obj1fallback, obj2fallback) {
-    if (fieldSpec.func) {
-        return fieldSpec.func(obj1, obj2);
-    }
-    var val1 = obj1[fieldSpec.field];
-    var val2 = obj2[fieldSpec.field];
-    if (val1 == null && obj1fallback) {
-        val1 = obj1fallback[fieldSpec.field];
-    }
-    if (val2 == null && obj2fallback) {
-        val2 = obj2fallback[fieldSpec.field];
-    }
-    return flexibleCompare(val1, val2) * (fieldSpec.order || 1);
-}
-exports.compareByFieldSpec = compareByFieldSpec;
-function flexibleCompare(a, b) {
-    if (!a && !b) {
-        return 0;
-    }
-    if (b == null) {
-        return -1;
-    }
-    if (a == null) {
-        return 1;
-    }
-    if ($.type(a) === 'string' || $.type(b) === 'string') {
-        return String(a).localeCompare(String(b));
-    }
-    return a - b;
-}
-exports.flexibleCompare = flexibleCompare;
-/* Date Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-exports.dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-exports.unitsDesc = ['year', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; // descending
-// Diffs the two moments into a Duration where full-days are recorded first, then the remaining time.
-// Moments will have their timezones normalized.
-function diffDayTime(a, b) {
-    return moment.duration({
-        days: a.clone().stripTime().diff(b.clone().stripTime(), 'days'),
-        ms: a.time() - b.time() // time-of-day from day start. disregards timezone
-    });
-}
-exports.diffDayTime = diffDayTime;
-// Diffs the two moments via their start-of-day (regardless of timezone). Produces whole-day durations.
-function diffDay(a, b) {
-    return moment.duration({
-        days: a.clone().stripTime().diff(b.clone().stripTime(), 'days')
-    });
-}
-exports.diffDay = diffDay;
-// Diffs two moments, producing a duration, made of a whole-unit-increment of the given unit. Uses rounding.
-function diffByUnit(a, b, unit) {
-    return moment.duration(Math.round(a.diff(b, unit, true)), // returnFloat=true
-    unit);
-}
-exports.diffByUnit = diffByUnit;
-// Computes the unit name of the largest whole-unit period of time.
-// For example, 48 hours will be "days" whereas 49 hours will be "hours".
-// Accepts start/end, a range object, or an original duration object.
-function computeGreatestUnit(start, end) {
-    var i;
-    var unit;
-    var val;
-    for (i = 0; i < exports.unitsDesc.length; i++) {
-        unit = exports.unitsDesc[i];
-        val = computeRangeAs(unit, start, end);
-        if (val >= 1 && isInt(val)) {
-            break;
-        }
-    }
-    return unit; // will be "milliseconds" if nothing else matches
-}
-exports.computeGreatestUnit = computeGreatestUnit;
-// like computeGreatestUnit, but has special abilities to interpret the source input for clues
-function computeDurationGreatestUnit(duration, durationInput) {
-    var unit = computeGreatestUnit(duration);
-    // prevent days:7 from being interpreted as a week
-    if (unit === 'week' && typeof durationInput === 'object' && durationInput.days) {
-        unit = 'day';
-    }
-    return unit;
-}
-exports.computeDurationGreatestUnit = computeDurationGreatestUnit;
-// Computes the number of units (like "hours") in the given range.
-// Range can be a {start,end} object, separate start/end args, or a Duration.
-// Results are based on Moment's .as() and .diff() methods, so results can depend on internal handling
-// of month-diffing logic (which tends to vary from version to version).
-function computeRangeAs(unit, start, end) {
-    if (end != null) {
-        return end.diff(start, unit, true);
-    }
-    else if (moment.isDuration(start)) {
-        return start.as(unit);
-    }
-    else {
-        return start.end.diff(start.start, unit, true);
-    }
-}
-// Intelligently divides a range (specified by a start/end params) by a duration
-function divideRangeByDuration(start, end, dur) {
-    var months;
-    if (durationHasTime(dur)) {
-        return (end - start) / dur;
-    }
-    months = dur.asMonths();
-    if (Math.abs(months) >= 1 && isInt(months)) {
-        return end.diff(start, 'months', true) / months;
-    }
-    return end.diff(start, 'days', true) / dur.asDays();
-}
-exports.divideRangeByDuration = divideRangeByDuration;
-// Intelligently divides one duration by another
-function divideDurationByDuration(dur1, dur2) {
-    var months1;
-    var months2;
-    if (durationHasTime(dur1) || durationHasTime(dur2)) {
-        return dur1 / dur2;
-    }
-    months1 = dur1.asMonths();
-    months2 = dur2.asMonths();
-    if (Math.abs(months1) >= 1 && isInt(months1) &&
-        Math.abs(months2) >= 1 && isInt(months2)) {
-        return months1 / months2;
-    }
-    return dur1.asDays() / dur2.asDays();
-}
-exports.divideDurationByDuration = divideDurationByDuration;
-// Intelligently multiplies a duration by a number
-function multiplyDuration(dur, n) {
-    var months;
-    if (durationHasTime(dur)) {
-        return moment.duration(dur * n);
-    }
-    months = dur.asMonths();
-    if (Math.abs(months) >= 1 && isInt(months)) {
-        return moment.duration({ months: months * n });
-    }
-    return moment.duration({ days: dur.asDays() * n });
-}
-exports.multiplyDuration = multiplyDuration;
-// Returns a boolean about whether the given duration has any time parts (hours/minutes/seconds/ms)
-function durationHasTime(dur) {
-    return Boolean(dur.hours() || dur.minutes() || dur.seconds() || dur.milliseconds());
-}
-exports.durationHasTime = durationHasTime;
-function isNativeDate(input) {
-    return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date;
-}
-exports.isNativeDate = isNativeDate;
-// Returns a boolean about whether the given input is a time string, like "06:40:00" or "06:00"
-function isTimeString(str) {
-    return typeof str === 'string' &&
-        /^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(str);
-}
-exports.isTimeString = isTimeString;
-/* Logging and Debug
-----------------------------------------------------------------------------------------------------------------------*/
-function log() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    var console = window.console;
-    if (console && console.log) {
-        return console.log.apply(console, args);
-    }
-}
-exports.log = log;
-function warn() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    var console = window.console;
-    if (console && console.warn) {
-        return console.warn.apply(console, args);
-    }
-    else {
-        return log.apply(null, args);
-    }
-}
-exports.warn = warn;
-/* General Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-var hasOwnPropMethod = {}.hasOwnProperty;
-// Merges an array of objects into a single object.
-// The second argument allows for an array of property names who's object values will be merged together.
-function mergeProps(propObjs, complexProps) {
-    var dest = {};
-    var i;
-    var name;
-    var complexObjs;
-    var j;
-    var val;
-    var props;
-    if (complexProps) {
-        for (i = 0; i < complexProps.length; i++) {
-            name = complexProps[i];
-            complexObjs = [];
-            // collect the trailing object values, stopping when a non-object is discovered
-            for (j = propObjs.length - 1; j >= 0; j--) {
-                val = propObjs[j][name];
-                if (typeof val === 'object') {
-                    complexObjs.unshift(val);
-                }
-                else if (val !== undefined) {
-                    dest[name] = val; // if there were no objects, this value will be used
-                    break;
-                }
-            }
-            // if the trailing values were objects, use the merged value
-            if (complexObjs.length) {
-                dest[name] = mergeProps(complexObjs);
-            }
-        }
-    }
-    // copy values into the destination, going from last to first
-    for (i = propObjs.length - 1; i >= 0; i--) {
-        props = propObjs[i];
-        for (name in props) {
-            if (!(name in dest)) {
-                dest[name] = props[name];
-            }
-        }
-    }
-    return dest;
-}
-exports.mergeProps = mergeProps;
-function copyOwnProps(src, dest) {
-    for (var name_1 in src) {
-        if (hasOwnProp(src, name_1)) {
-            dest[name_1] = src[name_1];
-        }
-    }
-}
-exports.copyOwnProps = copyOwnProps;
-function hasOwnProp(obj, name) {
-    return hasOwnPropMethod.call(obj, name);
-}
-exports.hasOwnProp = hasOwnProp;
-function applyAll(functions, thisObj, args) {
-    if ($.isFunction(functions)) {
-        functions = [functions];
-    }
-    if (functions) {
-        var i = void 0;
-        var ret = void 0;
-        for (i = 0; i < functions.length; i++) {
-            ret = functions[i].apply(thisObj, args) || ret;
-        }
-        return ret;
-    }
-}
-exports.applyAll = applyAll;
-function removeMatching(array, testFunc) {
-    var removeCnt = 0;
-    var i = 0;
-    while (i < array.length) {
-        if (testFunc(array[i])) {
-            array.splice(i, 1);
-            removeCnt++;
-        }
-        else {
-            i++;
-        }
-    }
-    return removeCnt;
-}
-exports.removeMatching = removeMatching;
-function removeExact(array, exactVal) {
-    var removeCnt = 0;
-    var i = 0;
-    while (i < array.length) {
-        if (array[i] === exactVal) {
-            array.splice(i, 1);
-            removeCnt++;
-        }
-        else {
-            i++;
-        }
-    }
-    return removeCnt;
-}
-exports.removeExact = removeExact;
-function isArraysEqual(a0, a1) {
-    var len = a0.length;
-    var i;
-    if (len == null || len !== a1.length) {
-        return false;
-    }
-    for (i = 0; i < len; i++) {
-        if (a0[i] !== a1[i]) {
-            return false;
-        }
-    }
-    return true;
-}
-exports.isArraysEqual = isArraysEqual;
-function firstDefined() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    for (var i = 0; i < args.length; i++) {
-        if (args[i] !== undefined) {
-            return args[i];
-        }
-    }
-}
-exports.firstDefined = firstDefined;
-function htmlEscape(s) {
-    return (s + '').replace(/&/g, '&amp;')
-        .replace(/</g, '&lt;')
-        .replace(/>/g, '&gt;')
-        .replace(/'/g, '&#039;')
-        .replace(/"/g, '&quot;')
-        .replace(/\n/g, '<br />');
-}
-exports.htmlEscape = htmlEscape;
-function stripHtmlEntities(text) {
-    return text.replace(/&.*?;/g, '');
-}
-exports.stripHtmlEntities = stripHtmlEntities;
-// Given a hash of CSS properties, returns a string of CSS.
-// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
-function cssToStr(cssProps) {
-    var statements = [];
-    $.each(cssProps, function (name, val) {
-        if (val != null) {
-            statements.push(name + ':' + val);
-        }
-    });
-    return statements.join(';');
-}
-exports.cssToStr = cssToStr;
-// Given an object hash of HTML attribute names to values,
-// generates a string that can be injected between < > in HTML
-function attrsToStr(attrs) {
-    var parts = [];
-    $.each(attrs, function (name, val) {
-        if (val != null) {
-            parts.push(name + '="' + htmlEscape(val) + '"');
-        }
-    });
-    return parts.join(' ');
-}
-exports.attrsToStr = attrsToStr;
-function capitaliseFirstLetter(str) {
-    return str.charAt(0).toUpperCase() + str.slice(1);
-}
-exports.capitaliseFirstLetter = capitaliseFirstLetter;
-function compareNumbers(a, b) {
-    return a - b;
-}
-exports.compareNumbers = compareNumbers;
-function isInt(n) {
-    return n % 1 === 0;
-}
-exports.isInt = isInt;
-// Returns a method bound to the given object context.
-// Just like one of the jQuery.proxy signatures, but without the undesired behavior of treating the same method with
-// different contexts as identical when binding/unbinding events.
-function proxy(obj, methodName) {
-    var method = obj[methodName];
-    return function () {
-        return method.apply(obj, arguments);
-    };
-}
-exports.proxy = proxy;
-// Returns a function, that, as long as it continues to be invoked, will not
-// be triggered. The function will be called after it stops being called for
-// N milliseconds. If `immediate` is passed, trigger the function on the
-// leading edge, instead of the trailing.
-// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
-function debounce(func, wait, immediate) {
-    if (immediate === void 0) { immediate = false; }
-    var timeout;
-    var args;
-    var context;
-    var timestamp;
-    var result;
-    var later = function () {
-        var last = +new Date() - timestamp;
-        if (last < wait) {
-            timeout = setTimeout(later, wait - last);
-        }
-        else {
-            timeout = null;
-            if (!immediate) {
-                result = func.apply(context, args);
-                context = args = null;
-            }
-        }
-    };
-    return function () {
-        context = this;
-        args = arguments;
-        timestamp = +new Date();
-        var callNow = immediate && !timeout;
-        if (!timeout) {
-            timeout = setTimeout(later, wait);
-        }
-        if (callNow) {
-            result = func.apply(context, args);
-            context = args = null;
-        }
-        return result;
-    };
-}
-exports.debounce = debounce;
-
-
-/***/ }),
-/* 5 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment = __webpack_require__(0);
-var moment_ext_1 = __webpack_require__(10);
-var UnzonedRange = /** @class */ (function () {
-    function UnzonedRange(startInput, endInput) {
-        // TODO: move these into footprint.
-        // Especially, doesn't make sense for null startMs/endMs.
-        this.isStart = true;
-        this.isEnd = true;
-        if (moment.isMoment(startInput)) {
-            startInput = startInput.clone().stripZone();
-        }
-        if (moment.isMoment(endInput)) {
-            endInput = endInput.clone().stripZone();
-        }
-        if (startInput) {
-            this.startMs = startInput.valueOf();
-        }
-        if (endInput) {
-            this.endMs = endInput.valueOf();
-        }
-    }
-    /*
-    SIDEEFFECT: will mutate eventRanges.
-    Will return a new array result.
-    Only works for non-open-ended ranges.
-    */
-    UnzonedRange.invertRanges = function (ranges, constraintRange) {
-        var invertedRanges = [];
-        var startMs = constraintRange.startMs; // the end of the previous range. the start of the new range
-        var i;
-        var dateRange;
-        // ranges need to be in order. required for our date-walking algorithm
-        ranges.sort(compareUnzonedRanges);
-        for (i = 0; i < ranges.length; i++) {
-            dateRange = ranges[i];
-            // add the span of time before the event (if there is any)
-            if (dateRange.startMs > startMs) {
-                invertedRanges.push(new UnzonedRange(startMs, dateRange.startMs));
-            }
-            if (dateRange.endMs > startMs) {
-                startMs = dateRange.endMs;
-            }
-        }
-        // add the span of time after the last event (if there is any)
-        if (startMs < constraintRange.endMs) {
-            invertedRanges.push(new UnzonedRange(startMs, constraintRange.endMs));
-        }
-        return invertedRanges;
-    };
-    UnzonedRange.prototype.intersect = function (otherRange) {
-        var startMs = this.startMs;
-        var endMs = this.endMs;
-        var newRange = null;
-        if (otherRange.startMs != null) {
-            if (startMs == null) {
-                startMs = otherRange.startMs;
-            }
-            else {
-                startMs = Math.max(startMs, otherRange.startMs);
-            }
-        }
-        if (otherRange.endMs != null) {
-            if (endMs == null) {
-                endMs = otherRange.endMs;
-            }
-            else {
-                endMs = Math.min(endMs, otherRange.endMs);
-            }
-        }
-        if (startMs == null || endMs == null || startMs < endMs) {
-            newRange = new UnzonedRange(startMs, endMs);
-            newRange.isStart = this.isStart && startMs === this.startMs;
-            newRange.isEnd = this.isEnd && endMs === this.endMs;
-        }
-        return newRange;
-    };
-    UnzonedRange.prototype.intersectsWith = function (otherRange) {
-        return (this.endMs == null || otherRange.startMs == null || this.endMs > otherRange.startMs) &&
-            (this.startMs == null || otherRange.endMs == null || this.startMs < otherRange.endMs);
-    };
-    UnzonedRange.prototype.containsRange = function (innerRange) {
-        return (this.startMs == null || (innerRange.startMs != null && innerRange.startMs >= this.startMs)) &&
-            (this.endMs == null || (innerRange.endMs != null && innerRange.endMs <= this.endMs));
-    };
-    // `date` can be a moment, a Date, or a millisecond time.
-    UnzonedRange.prototype.containsDate = function (date) {
-        var ms = date.valueOf();
-        return (this.startMs == null || ms >= this.startMs) &&
-            (this.endMs == null || ms < this.endMs);
-    };
-    // If the given date is not within the given range, move it inside.
-    // (If it's past the end, make it one millisecond before the end).
-    // `date` can be a moment, a Date, or a millisecond time.
-    // Returns a MS-time.
-    UnzonedRange.prototype.constrainDate = function (date) {
-        var ms = date.valueOf();
-        if (this.startMs != null && ms < this.startMs) {
-            ms = this.startMs;
-        }
-        if (this.endMs != null && ms >= this.endMs) {
-            ms = this.endMs - 1;
-        }
-        return ms;
-    };
-    UnzonedRange.prototype.equals = function (otherRange) {
-        return this.startMs === otherRange.startMs && this.endMs === otherRange.endMs;
-    };
-    UnzonedRange.prototype.clone = function () {
-        var range = new UnzonedRange(this.startMs, this.endMs);
-        range.isStart = this.isStart;
-        range.isEnd = this.isEnd;
-        return range;
-    };
-    // Returns an ambig-zoned moment from startMs.
-    // BEWARE: returned moment is not localized.
-    // Formatting and start-of-week will be default.
-    UnzonedRange.prototype.getStart = function () {
-        if (this.startMs != null) {
-            return moment_ext_1.default.utc(this.startMs).stripZone();
-        }
-        return null;
-    };
-    // Returns an ambig-zoned moment from startMs.
-    // BEWARE: returned moment is not localized.
-    // Formatting and start-of-week will be default.
-    UnzonedRange.prototype.getEnd = function () {
-        if (this.endMs != null) {
-            return moment_ext_1.default.utc(this.endMs).stripZone();
-        }
-        return null;
-    };
-    UnzonedRange.prototype.as = function (unit) {
-        return moment.utc(this.endMs).diff(moment.utc(this.startMs), unit, true);
-    };
-    return UnzonedRange;
-}());
-exports.default = UnzonedRange;
-/*
-Only works for non-open-ended ranges.
-*/
-function compareUnzonedRanges(range1, range2) {
-    return range1.startMs - range2.startMs; // earlier ranges go first
-}
-
-
-/***/ }),
-/* 6 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var ParsableModelMixin_1 = __webpack_require__(208);
-var Class_1 = __webpack_require__(33);
-var EventDefParser_1 = __webpack_require__(49);
-var EventSource = /** @class */ (function (_super) {
-    tslib_1.__extends(EventSource, _super);
-    // can we do away with calendar? at least for the abstract?
-    // useful for buildEventDef
-    function EventSource(calendar) {
-        var _this = _super.call(this) || this;
-        _this.calendar = calendar;
-        _this.className = [];
-        _this.uid = String(EventSource.uuid++);
-        return _this;
-    }
-    /*
-    rawInput can be any data type!
-    */
-    EventSource.parse = function (rawInput, calendar) {
-        var source = new this(calendar);
-        if (typeof rawInput === 'object') {
-            if (source.applyProps(rawInput)) {
-                return source;
-            }
-        }
-        return false;
-    };
-    EventSource.normalizeId = function (id) {
-        if (id) {
-            return String(id);
-        }
-        return null;
-    };
-    EventSource.prototype.fetch = function (start, end, timezone) {
-        // subclasses must implement. must return a promise.
-    };
-    EventSource.prototype.removeEventDefsById = function (eventDefId) {
-        // optional for subclasses to implement
-    };
-    EventSource.prototype.removeAllEventDefs = function () {
-        // optional for subclasses to implement
-    };
-    /*
-    For compairing/matching
-    */
-    EventSource.prototype.getPrimitive = function (otherSource) {
-        // subclasses must implement
-    };
-    EventSource.prototype.parseEventDefs = function (rawEventDefs) {
-        var i;
-        var eventDef;
-        var eventDefs = [];
-        for (i = 0; i < rawEventDefs.length; i++) {
-            eventDef = this.parseEventDef(rawEventDefs[i]);
-            if (eventDef) {
-                eventDefs.push(eventDef);
-            }
-        }
-        return eventDefs;
-    };
-    EventSource.prototype.parseEventDef = function (rawInput) {
-        var calendarTransform = this.calendar.opt('eventDataTransform');
-        var sourceTransform = this.eventDataTransform;
-        if (calendarTransform) {
-            rawInput = calendarTransform(rawInput, this.calendar);
-        }
-        if (sourceTransform) {
-            rawInput = sourceTransform(rawInput, this.calendar);
-        }
-        return EventDefParser_1.default.parse(rawInput, this);
-    };
-    EventSource.prototype.applyManualStandardProps = function (rawProps) {
-        if (rawProps.id != null) {
-            this.id = EventSource.normalizeId(rawProps.id);
-        }
-        // TODO: converge with EventDef
-        if ($.isArray(rawProps.className)) {
-            this.className = rawProps.className;
-        }
-        else if (typeof rawProps.className === 'string') {
-            this.className = rawProps.className.split(/\s+/);
-        }
-        return true;
-    };
-    EventSource.uuid = 0;
-    EventSource.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;
-    EventSource.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;
-    return EventSource;
-}(Class_1.default));
-exports.default = EventSource;
-ParsableModelMixin_1.default.mixInto(EventSource);
-// Parsing
-// ---------------------------------------------------------------------------------------------------------------------
-EventSource.defineStandardProps({
-    // manually process...
-    id: false,
-    className: false,
-    // automatically transfer...
-    color: true,
-    backgroundColor: true,
-    borderColor: true,
-    textColor: true,
-    editable: true,
-    startEditable: true,
-    durationEditable: true,
-    rendering: true,
-    overlap: true,
-    constraint: true,
-    allDayDefault: true,
-    eventDataTransform: true
-});
-
-
-/***/ }),
-/* 7 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/*
-Utility methods for easily listening to events on another object,
-and more importantly, easily unlistening from them.
-
-USAGE:
-  import { default as ListenerMixin, ListenerInterface } from './ListenerMixin'
-in class:
-  listenTo: ListenerInterface['listenTo']
-  stopListeningTo: ListenerInterface['stopListeningTo']
-after class:
-  ListenerMixin.mixInto(TheClass)
-*/
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var Mixin_1 = __webpack_require__(14);
-var guid = 0;
-var ListenerMixin = /** @class */ (function (_super) {
-    tslib_1.__extends(ListenerMixin, _super);
-    function ListenerMixin() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    /*
-    Given an `other` object that has on/off methods, bind the given `callback` to an event by the given name.
-    The `callback` will be called with the `this` context of the object that .listenTo is being called on.
-    Can be called:
-      .listenTo(other, eventName, callback)
-    OR
-      .listenTo(other, {
-        eventName1: callback1,
-        eventName2: callback2
-      })
-    */
-    ListenerMixin.prototype.listenTo = function (other, arg, callback) {
-        if (typeof arg === 'object') {
-            for (var eventName in arg) {
-                if (arg.hasOwnProperty(eventName)) {
-                    this.listenTo(other, eventName, arg[eventName]);
-                }
-            }
-        }
-        else if (typeof arg === 'string') {
-            other.on(arg + '.' + this.getListenerNamespace(), // use event namespacing to identify this object
-            $.proxy(callback, this) // always use `this` context
-            // the usually-undesired jQuery guid behavior doesn't matter,
-            // because we always unbind via namespace
-            );
-        }
-    };
-    /*
-    Causes the current object to stop listening to events on the `other` object.
-    `eventName` is optional. If omitted, will stop listening to ALL events on `other`.
-    */
-    ListenerMixin.prototype.stopListeningTo = function (other, eventName) {
-        other.off((eventName || '') + '.' + this.getListenerNamespace());
-    };
-    /*
-    Returns a string, unique to this object, to be used for event namespacing
-    */
-    ListenerMixin.prototype.getListenerNamespace = function () {
-        if (this.listenerId == null) {
-            this.listenerId = guid++;
-        }
-        return '_listener' + this.listenerId;
-    };
-    return ListenerMixin;
-}(Mixin_1.default));
-exports.default = ListenerMixin;
-
-
-/***/ }),
-/* 8 */,
-/* 9 */,
-/* 10 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment = __webpack_require__(0);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var ambigDateOfMonthRegex = /^\s*\d{4}-\d\d$/;
-var ambigTimeOrZoneRegex = /^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/;
-var newMomentProto = moment.fn; // where we will attach our new methods
-exports.newMomentProto = newMomentProto;
-var oldMomentProto = $.extend({}, newMomentProto); // copy of original moment methods
-exports.oldMomentProto = oldMomentProto;
-// tell momentjs to transfer these properties upon clone
-var momentProperties = moment.momentProperties;
-momentProperties.push('_fullCalendar');
-momentProperties.push('_ambigTime');
-momentProperties.push('_ambigZone');
-/*
-Call this if you want Moment's original format method to be used
-*/
-function oldMomentFormat(mom, formatStr) {
-    return oldMomentProto.format.call(mom, formatStr); // oldMomentProto defined in moment-ext.js
-}
-exports.oldMomentFormat = oldMomentFormat;
-// Creating
-// -------------------------------------------------------------------------------------------------
-// Creates a new moment, similar to the vanilla moment(...) constructor, but with
-// extra features (ambiguous time, enhanced formatting). When given an existing moment,
-// it will function as a clone (and retain the zone of the moment). Anything else will
-// result in a moment in the local zone.
-var momentExt = function () {
-    return makeMoment(arguments);
-};
-exports.default = momentExt;
-// Sames as momentExt, but forces the resulting moment to be in the UTC timezone.
-momentExt.utc = function () {
-    var mom = makeMoment(arguments, true);
-    // Force it into UTC because makeMoment doesn't guarantee it
-    // (if given a pre-existing moment for example)
-    if (mom.hasTime()) {
-        mom.utc();
-    }
-    return mom;
-};
-// Same as momentExt, but when given an ISO8601 string, the timezone offset is preserved.
-// ISO8601 strings with no timezone offset will become ambiguously zoned.
-momentExt.parseZone = function () {
-    return makeMoment(arguments, true, true);
-};
-// Builds an enhanced moment from args. When given an existing moment, it clones. When given a
-// native Date, or called with no arguments (the current time), the resulting moment will be local.
-// Anything else needs to be "parsed" (a string or an array), and will be affected by:
-//    parseAsUTC - if there is no zone information, should we parse the input in UTC?
-//    parseZone - if there is zone information, should we force the zone of the moment?
-function makeMoment(args, parseAsUTC, parseZone) {
-    if (parseAsUTC === void 0) { parseAsUTC = false; }
-    if (parseZone === void 0) { parseZone = false; }
-    var input = args[0];
-    var isSingleString = args.length === 1 && typeof input === 'string';
-    var isAmbigTime;
-    var isAmbigZone;
-    var ambigMatch;
-    var mom;
-    if (moment.isMoment(input) || util_1.isNativeDate(input) || input === undefined) {
-        mom = moment.apply(null, args);
-    }
-    else {
-        isAmbigTime = false;
-        isAmbigZone = false;
-        if (isSingleString) {
-            if (ambigDateOfMonthRegex.test(input)) {
-                // accept strings like '2014-05', but convert to the first of the month
-                input += '-01';
-                args = [input]; // for when we pass it on to moment's constructor
-                isAmbigTime = true;
-                isAmbigZone = true;
-            }
-            else if ((ambigMatch = ambigTimeOrZoneRegex.exec(input))) {
-                isAmbigTime = !ambigMatch[5]; // no time part?
-                isAmbigZone = true;
-            }
-        }
-        else if ($.isArray(input)) {
-            // arrays have no timezone information, so assume ambiguous zone
-            isAmbigZone = true;
-        }
-        // otherwise, probably a string with a format
-        if (parseAsUTC || isAmbigTime) {
-            mom = moment.utc.apply(moment, args);
-        }
-        else {
-            mom = moment.apply(null, args);
-        }
-        if (isAmbigTime) {
-            mom._ambigTime = true;
-            mom._ambigZone = true; // ambiguous time always means ambiguous zone
-        }
-        else if (parseZone) {
-            if (isAmbigZone) {
-                mom._ambigZone = true;
-            }
-            else if (isSingleString) {
-                mom.utcOffset(input); // if not a valid zone, will assign UTC
-            }
-        }
-    }
-    mom._fullCalendar = true; // flag for extended functionality
-    return mom;
-}
-// Week Number
-// -------------------------------------------------------------------------------------------------
-// Returns the week number, considering the locale's custom week number calcuation
-// `weeks` is an alias for `week`
-newMomentProto.week = newMomentProto.weeks = function (input) {
-    var weekCalc = this._locale._fullCalendar_weekCalc;
-    if (input == null && typeof weekCalc === 'function') {
-        return weekCalc(this);
-    }
-    else if (weekCalc === 'ISO') {
-        return oldMomentProto.isoWeek.apply(this, arguments); // ISO getter/setter
-    }
-    return oldMomentProto.week.apply(this, arguments); // local getter/setter
-};
-// Time-of-day
-// -------------------------------------------------------------------------------------------------
-// GETTER
-// Returns a Duration with the hours/minutes/seconds/ms values of the moment.
-// If the moment has an ambiguous time, a duration of 00:00 will be returned.
-//
-// SETTER
-// You can supply a Duration, a Moment, or a Duration-like argument.
-// When setting the time, and the moment has an ambiguous time, it then becomes unambiguous.
-newMomentProto.time = function (time) {
-    // Fallback to the original method (if there is one) if this moment wasn't created via FullCalendar.
-    // `time` is a generic enough method name where this precaution is necessary to avoid collisions w/ other plugins.
-    if (!this._fullCalendar) {
-        return oldMomentProto.time.apply(this, arguments);
-    }
-    if (time == null) {
-        return moment.duration({
-            hours: this.hours(),
-            minutes: this.minutes(),
-            seconds: this.seconds(),
-            milliseconds: this.milliseconds()
-        });
-    }
-    else {
-        this._ambigTime = false; // mark that the moment now has a time
-        if (!moment.isDuration(time) && !moment.isMoment(time)) {
-            time = moment.duration(time);
-        }
-        // The day value should cause overflow (so 24 hours becomes 00:00:00 of next day).
-        // Only for Duration times, not Moment times.
-        var dayHours = 0;
-        if (moment.isDuration(time)) {
-            dayHours = Math.floor(time.asDays()) * 24;
-        }
-        // We need to set the individual fields.
-        // Can't use startOf('day') then add duration. In case of DST at start of day.
-        return this.hours(dayHours + time.hours())
-            .minutes(time.minutes())
-            .seconds(time.seconds())
-            .milliseconds(time.milliseconds());
-    }
-};
-// Converts the moment to UTC, stripping out its time-of-day and timezone offset,
-// but preserving its YMD. A moment with a stripped time will display no time
-// nor timezone offset when .format() is called.
-newMomentProto.stripTime = function () {
-    if (!this._ambigTime) {
-        this.utc(true); // keepLocalTime=true (for keeping *date* value)
-        // set time to zero
-        this.set({
-            hours: 0,
-            minutes: 0,
-            seconds: 0,
-            ms: 0
-        });
-        // Mark the time as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),
-        // which clears all ambig flags.
-        this._ambigTime = true;
-        this._ambigZone = true; // if ambiguous time, also ambiguous timezone offset
-    }
-    return this; // for chaining
-};
-// Returns if the moment has a non-ambiguous time (boolean)
-newMomentProto.hasTime = function () {
-    return !this._ambigTime;
-};
-// Timezone
-// -------------------------------------------------------------------------------------------------
-// Converts the moment to UTC, stripping out its timezone offset, but preserving its
-// YMD and time-of-day. A moment with a stripped timezone offset will display no
-// timezone offset when .format() is called.
-newMomentProto.stripZone = function () {
-    var wasAmbigTime;
-    if (!this._ambigZone) {
-        wasAmbigTime = this._ambigTime;
-        this.utc(true); // keepLocalTime=true (for keeping date and time values)
-        // the above call to .utc()/.utcOffset() unfortunately might clear the ambig flags, so restore
-        this._ambigTime = wasAmbigTime || false;
-        // Mark the zone as ambiguous. This needs to happen after the .utc() call, which might call .utcOffset(),
-        // which clears the ambig flags.
-        this._ambigZone = true;
-    }
-    return this; // for chaining
-};
-// Returns of the moment has a non-ambiguous timezone offset (boolean)
-newMomentProto.hasZone = function () {
-    return !this._ambigZone;
-};
-// implicitly marks a zone
-newMomentProto.local = function (keepLocalTime) {
-    // for when converting from ambiguously-zoned to local,
-    // keep the time values when converting from UTC -> local
-    oldMomentProto.local.call(this, this._ambigZone || keepLocalTime);
-    // ensure non-ambiguous
-    // this probably already happened via local() -> utcOffset(), but don't rely on Moment's internals
-    this._ambigTime = false;
-    this._ambigZone = false;
-    return this; // for chaining
-};
-// implicitly marks a zone
-newMomentProto.utc = function (keepLocalTime) {
-    oldMomentProto.utc.call(this, keepLocalTime);
-    // ensure non-ambiguous
-    // this probably already happened via utc() -> utcOffset(), but don't rely on Moment's internals
-    this._ambigTime = false;
-    this._ambigZone = false;
-    return this;
-};
-// implicitly marks a zone (will probably get called upon .utc() and .local())
-newMomentProto.utcOffset = function (tzo) {
-    if (tzo != null) {
-        // these assignments needs to happen before the original zone method is called.
-        // I forget why, something to do with a browser crash.
-        this._ambigTime = false;
-        this._ambigZone = false;
-    }
-    return oldMomentProto.utcOffset.apply(this, arguments);
-};
-
-
-/***/ }),
-/* 11 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/*
-USAGE:
-  import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
-in class:
-  on: EmitterInterface['on']
-  one: EmitterInterface['one']
-  off: EmitterInterface['off']
-  trigger: EmitterInterface['trigger']
-  triggerWith: EmitterInterface['triggerWith']
-  hasHandlers: EmitterInterface['hasHandlers']
-after class:
-  EmitterMixin.mixInto(TheClass)
-*/
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var Mixin_1 = __webpack_require__(14);
-var EmitterMixin = /** @class */ (function (_super) {
-    tslib_1.__extends(EmitterMixin, _super);
-    function EmitterMixin() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // jQuery-ification via $(this) allows a non-DOM object to have
-    // the same event handling capabilities (including namespaces).
-    EmitterMixin.prototype.on = function (types, handler) {
-        $(this).on(types, this._prepareIntercept(handler));
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.one = function (types, handler) {
-        $(this).one(types, this._prepareIntercept(handler));
-        return this; // for chaining
-    };
-    EmitterMixin.prototype._prepareIntercept = function (handler) {
-        // handlers are always called with an "event" object as their first param.
-        // sneak the `this` context and arguments into the extra parameter object
-        // and forward them on to the original handler.
-        var intercept = function (ev, extra) {
-            return handler.apply(extra.context || this, extra.args || []);
-        };
-        // mimick jQuery's internal "proxy" system (risky, I know)
-        // causing all functions with the same .guid to appear to be the same.
-        // https://github.com/jquery/jquery/blob/2.2.4/src/core.js#L448
-        // this is needed for calling .off with the original non-intercept handler.
-        if (!handler.guid) {
-            handler.guid = $.guid++;
-        }
-        intercept.guid = handler.guid;
-        return intercept;
-    };
-    EmitterMixin.prototype.off = function (types, handler) {
-        $(this).off(types, handler);
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.trigger = function (types) {
-        var args = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            args[_i - 1] = arguments[_i];
-        }
-        // pass in "extra" info to the intercept
-        $(this).triggerHandler(types, { args: args });
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.triggerWith = function (types, context, args) {
-        // `triggerHandler` is less reliant on the DOM compared to `trigger`.
-        // pass in "extra" info to the intercept.
-        $(this).triggerHandler(types, { context: context, args: args });
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.hasHandlers = function (type) {
-        var hash = $._data(this, 'events'); // http://blog.jquery.com/2012/08/09/jquery-1-8-released/
-        return hash && hash[type] && hash[type].length > 0;
-    };
-    return EmitterMixin;
-}(Mixin_1.default));
-exports.default = EmitterMixin;
-
-
-/***/ }),
-/* 12 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-/*
-Meant to be immutable
-*/
-var ComponentFootprint = /** @class */ (function () {
-    function ComponentFootprint(unzonedRange, isAllDay) {
-        this.isAllDay = false; // component can choose to ignore this
-        this.unzonedRange = unzonedRange;
-        this.isAllDay = isAllDay;
-    }
-    /*
-    Only works for non-open-ended ranges.
-    */
-    ComponentFootprint.prototype.toLegacy = function (calendar) {
-        return {
-            start: calendar.msToMoment(this.unzonedRange.startMs, this.isAllDay),
-            end: calendar.msToMoment(this.unzonedRange.endMs, this.isAllDay)
-        };
-    };
-    return ComponentFootprint;
-}());
-exports.default = ComponentFootprint;
-
-
-/***/ }),
-/* 13 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var EventDef_1 = __webpack_require__(34);
-var EventInstance_1 = __webpack_require__(209);
-var EventDateProfile_1 = __webpack_require__(17);
-var SingleEventDef = /** @class */ (function (_super) {
-    tslib_1.__extends(SingleEventDef, _super);
-    function SingleEventDef() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    /*
-    Will receive start/end params, but will be ignored.
-    */
-    SingleEventDef.prototype.buildInstances = function () {
-        return [this.buildInstance()];
-    };
-    SingleEventDef.prototype.buildInstance = function () {
-        return new EventInstance_1.default(this, // definition
-        this.dateProfile);
-    };
-    SingleEventDef.prototype.isAllDay = function () {
-        return this.dateProfile.isAllDay();
-    };
-    SingleEventDef.prototype.clone = function () {
-        var def = _super.prototype.clone.call(this);
-        def.dateProfile = this.dateProfile;
-        return def;
-    };
-    SingleEventDef.prototype.rezone = function () {
-        var calendar = this.source.calendar;
-        var dateProfile = this.dateProfile;
-        this.dateProfile = new EventDateProfile_1.default(calendar.moment(dateProfile.start), dateProfile.end ? calendar.moment(dateProfile.end) : null, calendar);
-    };
-    /*
-    NOTE: if super-method fails, should still attempt to apply
-    */
-    SingleEventDef.prototype.applyManualStandardProps = function (rawProps) {
-        var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);
-        var dateProfile = EventDateProfile_1.default.parse(rawProps, this.source); // returns null on failure
-        if (dateProfile) {
-            this.dateProfile = dateProfile;
-            // make sure `date` shows up in the legacy event objects as-is
-            if (rawProps.date != null) {
-                this.miscProps.date = rawProps.date;
-            }
-            return superSuccess;
-        }
-        else {
-            return false;
-        }
-    };
-    return SingleEventDef;
-}(EventDef_1.default));
-exports.default = SingleEventDef;
-// Parsing
-// ---------------------------------------------------------------------------------------------------------------------
-SingleEventDef.defineStandardProps({
-    start: false,
-    date: false,
-    end: false,
-    allDay: false
-});
-
-
-/***/ }),
-/* 14 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var Mixin = /** @class */ (function () {
-    function Mixin() {
-    }
-    Mixin.mixInto = function (destClass) {
-        var _this = this;
-        Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
-            if (!destClass.prototype[name]) {
-                destClass.prototype[name] = _this.prototype[name];
-            }
-        });
-    };
-    /*
-    will override existing methods
-    TODO: remove! not used anymore
-    */
-    Mixin.mixOver = function (destClass) {
-        var _this = this;
-        Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
-            destClass.prototype[name] = _this.prototype[name];
-        });
-    };
-    return Mixin;
-}());
-exports.default = Mixin;
-
-
-/***/ }),
-/* 15 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var Interaction = /** @class */ (function () {
-    function Interaction(component) {
-        this.view = component._getView();
-        this.component = component;
-    }
-    Interaction.prototype.opt = function (name) {
-        return this.view.opt(name);
-    };
-    Interaction.prototype.end = function () {
-        // subclasses can implement
-    };
-    return Interaction;
-}());
-exports.default = Interaction;
-
-
-/***/ }),
-/* 16 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.version = '3.9.0';
-// When introducing internal API incompatibilities (where fullcalendar plugins would break),
-// the minor version of the calendar should be upped (ex: 2.7.2 -> 2.8.0)
-// and the below integer should be incremented.
-exports.internalApiVersion = 12;
-var util_1 = __webpack_require__(4);
-exports.applyAll = util_1.applyAll;
-exports.debounce = util_1.debounce;
-exports.isInt = util_1.isInt;
-exports.htmlEscape = util_1.htmlEscape;
-exports.cssToStr = util_1.cssToStr;
-exports.proxy = util_1.proxy;
-exports.capitaliseFirstLetter = util_1.capitaliseFirstLetter;
-exports.getOuterRect = util_1.getOuterRect;
-exports.getClientRect = util_1.getClientRect;
-exports.getContentRect = util_1.getContentRect;
-exports.getScrollbarWidths = util_1.getScrollbarWidths;
-exports.preventDefault = util_1.preventDefault;
-exports.parseFieldSpecs = util_1.parseFieldSpecs;
-exports.compareByFieldSpecs = util_1.compareByFieldSpecs;
-exports.compareByFieldSpec = util_1.compareByFieldSpec;
-exports.flexibleCompare = util_1.flexibleCompare;
-exports.computeGreatestUnit = util_1.computeGreatestUnit;
-exports.divideRangeByDuration = util_1.divideRangeByDuration;
-exports.divideDurationByDuration = util_1.divideDurationByDuration;
-exports.multiplyDuration = util_1.multiplyDuration;
-exports.durationHasTime = util_1.durationHasTime;
-exports.log = util_1.log;
-exports.warn = util_1.warn;
-exports.removeExact = util_1.removeExact;
-exports.intersectRects = util_1.intersectRects;
-var date_formatting_1 = __webpack_require__(47);
-exports.formatDate = date_formatting_1.formatDate;
-exports.formatRange = date_formatting_1.formatRange;
-exports.queryMostGranularFormatUnit = date_formatting_1.queryMostGranularFormatUnit;
-var locale_1 = __webpack_require__(31);
-exports.datepickerLocale = locale_1.datepickerLocale;
-exports.locale = locale_1.locale;
-var moment_ext_1 = __webpack_require__(10);
-exports.moment = moment_ext_1.default;
-var EmitterMixin_1 = __webpack_require__(11);
-exports.EmitterMixin = EmitterMixin_1.default;
-var ListenerMixin_1 = __webpack_require__(7);
-exports.ListenerMixin = ListenerMixin_1.default;
-var Model_1 = __webpack_require__(48);
-exports.Model = Model_1.default;
-var Constraints_1 = __webpack_require__(207);
-exports.Constraints = Constraints_1.default;
-var UnzonedRange_1 = __webpack_require__(5);
-exports.UnzonedRange = UnzonedRange_1.default;
-var ComponentFootprint_1 = __webpack_require__(12);
-exports.ComponentFootprint = ComponentFootprint_1.default;
-var BusinessHourGenerator_1 = __webpack_require__(212);
-exports.BusinessHourGenerator = BusinessHourGenerator_1.default;
-var EventDef_1 = __webpack_require__(34);
-exports.EventDef = EventDef_1.default;
-var EventDefMutation_1 = __webpack_require__(37);
-exports.EventDefMutation = EventDefMutation_1.default;
-var EventSourceParser_1 = __webpack_require__(38);
-exports.EventSourceParser = EventSourceParser_1.default;
-var EventSource_1 = __webpack_require__(6);
-exports.EventSource = EventSource_1.default;
-var ThemeRegistry_1 = __webpack_require__(51);
-exports.defineThemeSystem = ThemeRegistry_1.defineThemeSystem;
-var EventInstanceGroup_1 = __webpack_require__(18);
-exports.EventInstanceGroup = EventInstanceGroup_1.default;
-var ArrayEventSource_1 = __webpack_require__(52);
-exports.ArrayEventSource = ArrayEventSource_1.default;
-var FuncEventSource_1 = __webpack_require__(215);
-exports.FuncEventSource = FuncEventSource_1.default;
-var JsonFeedEventSource_1 = __webpack_require__(216);
-exports.JsonFeedEventSource = JsonFeedEventSource_1.default;
-var EventFootprint_1 = __webpack_require__(36);
-exports.EventFootprint = EventFootprint_1.default;
-var Class_1 = __webpack_require__(33);
-exports.Class = Class_1.default;
-var Mixin_1 = __webpack_require__(14);
-exports.Mixin = Mixin_1.default;
-var CoordCache_1 = __webpack_require__(53);
-exports.CoordCache = CoordCache_1.default;
-var DragListener_1 = __webpack_require__(54);
-exports.DragListener = DragListener_1.default;
-var Promise_1 = __webpack_require__(20);
-exports.Promise = Promise_1.default;
-var TaskQueue_1 = __webpack_require__(217);
-exports.TaskQueue = TaskQueue_1.default;
-var RenderQueue_1 = __webpack_require__(218);
-exports.RenderQueue = RenderQueue_1.default;
-var Scroller_1 = __webpack_require__(39);
-exports.Scroller = Scroller_1.default;
-var Theme_1 = __webpack_require__(19);
-exports.Theme = Theme_1.default;
-var DateComponent_1 = __webpack_require__(219);
-exports.DateComponent = DateComponent_1.default;
-var InteractiveDateComponent_1 = __webpack_require__(40);
-exports.InteractiveDateComponent = InteractiveDateComponent_1.default;
-var Calendar_1 = __webpack_require__(220);
-exports.Calendar = Calendar_1.default;
-var View_1 = __webpack_require__(41);
-exports.View = View_1.default;
-var ViewRegistry_1 = __webpack_require__(22);
-exports.defineView = ViewRegistry_1.defineView;
-exports.getViewConfig = ViewRegistry_1.getViewConfig;
-var DayTableMixin_1 = __webpack_require__(55);
-exports.DayTableMixin = DayTableMixin_1.default;
-var BusinessHourRenderer_1 = __webpack_require__(56);
-exports.BusinessHourRenderer = BusinessHourRenderer_1.default;
-var EventRenderer_1 = __webpack_require__(42);
-exports.EventRenderer = EventRenderer_1.default;
-var FillRenderer_1 = __webpack_require__(57);
-exports.FillRenderer = FillRenderer_1.default;
-var HelperRenderer_1 = __webpack_require__(58);
-exports.HelperRenderer = HelperRenderer_1.default;
-var ExternalDropping_1 = __webpack_require__(222);
-exports.ExternalDropping = ExternalDropping_1.default;
-var EventResizing_1 = __webpack_require__(223);
-exports.EventResizing = EventResizing_1.default;
-var EventPointing_1 = __webpack_require__(59);
-exports.EventPointing = EventPointing_1.default;
-var EventDragging_1 = __webpack_require__(224);
-exports.EventDragging = EventDragging_1.default;
-var DateSelecting_1 = __webpack_require__(225);
-exports.DateSelecting = DateSelecting_1.default;
-var StandardInteractionsMixin_1 = __webpack_require__(60);
-exports.StandardInteractionsMixin = StandardInteractionsMixin_1.default;
-var AgendaView_1 = __webpack_require__(226);
-exports.AgendaView = AgendaView_1.default;
-var TimeGrid_1 = __webpack_require__(227);
-exports.TimeGrid = TimeGrid_1.default;
-var DayGrid_1 = __webpack_require__(61);
-exports.DayGrid = DayGrid_1.default;
-var BasicView_1 = __webpack_require__(62);
-exports.BasicView = BasicView_1.default;
-var MonthView_1 = __webpack_require__(229);
-exports.MonthView = MonthView_1.default;
-var ListView_1 = __webpack_require__(230);
-exports.ListView = ListView_1.default;
-
-
-/***/ }),
-/* 17 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var UnzonedRange_1 = __webpack_require__(5);
-/*
-Meant to be immutable
-*/
-var EventDateProfile = /** @class */ (function () {
-    function EventDateProfile(start, end, calendar) {
-        this.start = start;
-        this.end = end || null;
-        this.unzonedRange = this.buildUnzonedRange(calendar);
-    }
-    /*
-    Needs an EventSource object
-    */
-    EventDateProfile.parse = function (rawProps, source) {
-        var startInput = rawProps.start || rawProps.date;
-        var endInput = rawProps.end;
-        if (!startInput) {
-            return false;
-        }
-        var calendar = source.calendar;
-        var start = calendar.moment(startInput);
-        var end = endInput ? calendar.moment(endInput) : null;
-        var forcedAllDay = rawProps.allDay;
-        var forceEventDuration = calendar.opt('forceEventDuration');
-        if (!start.isValid()) {
-            return false;
-        }
-        if (end && (!end.isValid() || !end.isAfter(start))) {
-            end = null;
-        }
-        if (forcedAllDay == null) {
-            forcedAllDay = source.allDayDefault;
-            if (forcedAllDay == null) {
-                forcedAllDay = calendar.opt('allDayDefault');
-            }
-        }
-        if (forcedAllDay === true) {
-            start.stripTime();
-            if (end) {
-                end.stripTime();
-            }
-        }
-        else if (forcedAllDay === false) {
-            if (!start.hasTime()) {
-                start.time(0);
-            }
-            if (end && !end.hasTime()) {
-                end.time(0);
-            }
-        }
-        if (!end && forceEventDuration) {
-            end = calendar.getDefaultEventEnd(!start.hasTime(), start);
-        }
-        return new EventDateProfile(start, end, calendar);
-    };
-    EventDateProfile.isStandardProp = function (propName) {
-        return propName === 'start' || propName === 'date' || propName === 'end' || propName === 'allDay';
-    };
-    EventDateProfile.prototype.isAllDay = function () {
-        return !(this.start.hasTime() || (this.end && this.end.hasTime()));
-    };
-    /*
-    Needs a Calendar object
-    */
-    EventDateProfile.prototype.buildUnzonedRange = function (calendar) {
-        var startMs = this.start.clone().stripZone().valueOf();
-        var endMs = this.getEnd(calendar).stripZone().valueOf();
-        return new UnzonedRange_1.default(startMs, endMs);
-    };
-    /*
-    Needs a Calendar object
-    */
-    EventDateProfile.prototype.getEnd = function (calendar) {
-        return this.end ?
-            this.end.clone() :
-            // derive the end from the start and allDay. compute allDay if necessary
-            calendar.getDefaultEventEnd(this.isAllDay(), this.start);
-    };
-    return EventDateProfile;
-}());
-exports.default = EventDateProfile;
-
-
-/***/ }),
-/* 18 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var UnzonedRange_1 = __webpack_require__(5);
-var util_1 = __webpack_require__(35);
-var EventRange_1 = __webpack_require__(211);
-/*
-It's expected that there will be at least one EventInstance,
-OR that an explicitEventDef is assigned.
-*/
-var EventInstanceGroup = /** @class */ (function () {
-    function EventInstanceGroup(eventInstances) {
-        this.eventInstances = eventInstances || [];
-    }
-    EventInstanceGroup.prototype.getAllEventRanges = function (constraintRange) {
-        if (constraintRange) {
-            return this.sliceNormalRenderRanges(constraintRange);
-        }
-        else {
-            return this.eventInstances.map(util_1.eventInstanceToEventRange);
-        }
-    };
-    EventInstanceGroup.prototype.sliceRenderRanges = function (constraintRange) {
-        if (this.isInverse()) {
-            return this.sliceInverseRenderRanges(constraintRange);
-        }
-        else {
-            return this.sliceNormalRenderRanges(constraintRange);
-        }
-    };
-    EventInstanceGroup.prototype.sliceNormalRenderRanges = function (constraintRange) {
-        var eventInstances = this.eventInstances;
-        var i;
-        var eventInstance;
-        var slicedRange;
-        var slicedEventRanges = [];
-        for (i = 0; i < eventInstances.length; i++) {
-            eventInstance = eventInstances[i];
-            slicedRange = eventInstance.dateProfile.unzonedRange.intersect(constraintRange);
-            if (slicedRange) {
-                slicedEventRanges.push(new EventRange_1.default(slicedRange, eventInstance.def, eventInstance));
-            }
-        }
-        return slicedEventRanges;
-    };
-    EventInstanceGroup.prototype.sliceInverseRenderRanges = function (constraintRange) {
-        var unzonedRanges = this.eventInstances.map(util_1.eventInstanceToUnzonedRange);
-        var ownerDef = this.getEventDef();
-        unzonedRanges = UnzonedRange_1.default.invertRanges(unzonedRanges, constraintRange);
-        return unzonedRanges.map(function (unzonedRange) {
-            return new EventRange_1.default(unzonedRange, ownerDef); // don't give an EventInstance
-        });
-    };
-    EventInstanceGroup.prototype.isInverse = function () {
-        return this.getEventDef().hasInverseRendering();
-    };
-    EventInstanceGroup.prototype.getEventDef = function () {
-        return this.explicitEventDef || this.eventInstances[0].def;
-    };
-    return EventInstanceGroup;
-}());
-exports.default = EventInstanceGroup;
-
-
-/***/ }),
-/* 19 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var Theme = /** @class */ (function () {
-    function Theme(optionsManager) {
-        this.optionsManager = optionsManager;
-        this.processIconOverride();
-    }
-    Theme.prototype.processIconOverride = function () {
-        if (this.iconOverrideOption) {
-            this.setIconOverride(this.optionsManager.get(this.iconOverrideOption));
-        }
-    };
-    Theme.prototype.setIconOverride = function (iconOverrideHash) {
-        var iconClassesCopy;
-        var buttonName;
-        if ($.isPlainObject(iconOverrideHash)) {
-            iconClassesCopy = $.extend({}, this.iconClasses);
-            for (buttonName in iconOverrideHash) {
-                iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
-            }
-            this.iconClasses = iconClassesCopy;
-        }
-        else if (iconOverrideHash === false) {
-            this.iconClasses = {};
-        }
-    };
-    Theme.prototype.applyIconOverridePrefix = function (className) {
-        var prefix = this.iconOverridePrefix;
-        if (prefix && className.indexOf(prefix) !== 0) {
-            className = prefix + className;
-        }
-        return className;
-    };
-    Theme.prototype.getClass = function (key) {
-        return this.classes[key] || '';
-    };
-    Theme.prototype.getIconClass = function (buttonName) {
-        var className = this.iconClasses[buttonName];
-        if (className) {
-            return this.baseIconClass + ' ' + className;
-        }
-        return '';
-    };
-    Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
-        var className;
-        if (this.iconOverrideCustomButtonOption) {
-            className = customButtonProps[this.iconOverrideCustomButtonOption];
-            if (className) {
-                return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
-            }
-        }
-        return '';
-    };
-    return Theme;
-}());
-exports.default = Theme;
-Theme.prototype.classes = {};
-Theme.prototype.iconClasses = {};
-Theme.prototype.baseIconClass = '';
-Theme.prototype.iconOverridePrefix = '';
-
-
-/***/ }),
-/* 20 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var PromiseStub = {
-    construct: function (executor) {
-        var deferred = $.Deferred();
-        var promise = deferred.promise();
-        if (typeof executor === 'function') {
-            executor(function (val) {
-                deferred.resolve(val);
-                attachImmediatelyResolvingThen(promise, val);
-            }, function () {
-                deferred.reject();
-                attachImmediatelyRejectingThen(promise);
-            });
-        }
-        return promise;
-    },
-    resolve: function (val) {
-        var deferred = $.Deferred().resolve(val);
-        var promise = deferred.promise();
-        attachImmediatelyResolvingThen(promise, val);
-        return promise;
-    },
-    reject: function () {
-        var deferred = $.Deferred().reject();
-        var promise = deferred.promise();
-        attachImmediatelyRejectingThen(promise);
-        return promise;
-    }
-};
-exports.default = PromiseStub;
-function attachImmediatelyResolvingThen(promise, val) {
-    promise.then = function (onResolve) {
-        if (typeof onResolve === 'function') {
-            return PromiseStub.resolve(onResolve(val));
-        }
-        return promise;
-    };
-}
-function attachImmediatelyRejectingThen(promise) {
-    promise.then = function (onResolve, onReject) {
-        if (typeof onReject === 'function') {
-            onReject();
-        }
-        return promise;
-    };
-}
-
-
-/***/ }),
-/* 21 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var exportHooks = __webpack_require__(16);
-var EmitterMixin_1 = __webpack_require__(11);
-var ListenerMixin_1 = __webpack_require__(7);
-exportHooks.touchMouseIgnoreWait = 500;
-var globalEmitter = null;
-var neededCount = 0;
-/*
-Listens to document and window-level user-interaction events, like touch events and mouse events,
-and fires these events as-is to whoever is observing a GlobalEmitter.
-Best when used as a singleton via GlobalEmitter.get()
-
-Normalizes mouse/touch events. For examples:
-- ignores the the simulated mouse events that happen after a quick tap: mousemove+mousedown+mouseup+click
-- compensates for various buggy scenarios where a touchend does not fire
-*/
-var GlobalEmitter = /** @class */ (function () {
-    function GlobalEmitter() {
-        this.isTouching = false;
-        this.mouseIgnoreDepth = 0;
-    }
-    // gets the singleton
-    GlobalEmitter.get = function () {
-        if (!globalEmitter) {
-            globalEmitter = new GlobalEmitter();
-            globalEmitter.bind();
-        }
-        return globalEmitter;
-    };
-    // called when an object knows it will need a GlobalEmitter in the near future.
-    GlobalEmitter.needed = function () {
-        GlobalEmitter.get(); // ensures globalEmitter
-        neededCount++;
-    };
-    // called when the object that originally called needed() doesn't need a GlobalEmitter anymore.
-    GlobalEmitter.unneeded = function () {
-        neededCount--;
-        if (!neededCount) {
-            globalEmitter.unbind();
-            globalEmitter = null;
-        }
-    };
-    GlobalEmitter.prototype.bind = function () {
-        var _this = this;
-        this.listenTo($(document), {
-            touchstart: this.handleTouchStart,
-            touchcancel: this.handleTouchCancel,
-            touchend: this.handleTouchEnd,
-            mousedown: this.handleMouseDown,
-            mousemove: this.handleMouseMove,
-            mouseup: this.handleMouseUp,
-            click: this.handleClick,
-            selectstart: this.handleSelectStart,
-            contextmenu: this.handleContextMenu
-        });
-        // because we need to call preventDefault
-        // because https://www.chromestatus.com/features/5093566007214080
-        // TODO: investigate performance because this is a global handler
-        window.addEventListener('touchmove', this.handleTouchMoveProxy = function (ev) {
-            _this.handleTouchMove($.Event(ev));
-        }, { passive: false } // allows preventDefault()
-        );
-        // attach a handler to get called when ANY scroll action happens on the page.
-        // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
-        // http://stackoverflow.com/a/32954565/96342
-        window.addEventListener('scroll', this.handleScrollProxy = function (ev) {
-            _this.handleScroll($.Event(ev));
-        }, true // useCapture
-        );
-    };
-    GlobalEmitter.prototype.unbind = function () {
-        this.stopListeningTo($(document));
-        window.removeEventListener('touchmove', this.handleTouchMoveProxy);
-        window.removeEventListener('scroll', this.handleScrollProxy, true // useCapture
-        );
-    };
-    // Touch Handlers
-    // -----------------------------------------------------------------------------------------------------------------
-    GlobalEmitter.prototype.handleTouchStart = function (ev) {
-        // if a previous touch interaction never ended with a touchend, then implicitly end it,
-        // but since a new touch interaction is about to begin, don't start the mouse ignore period.
-        this.stopTouch(ev, true); // skipMouseIgnore=true
-        this.isTouching = true;
-        this.trigger('touchstart', ev);
-    };
-    GlobalEmitter.prototype.handleTouchMove = function (ev) {
-        if (this.isTouching) {
-            this.trigger('touchmove', ev);
-        }
-    };
-    GlobalEmitter.prototype.handleTouchCancel = function (ev) {
-        if (this.isTouching) {
-            this.trigger('touchcancel', ev);
-            // Have touchcancel fire an artificial touchend. That way, handlers won't need to listen to both.
-            // If touchend fires later, it won't have any effect b/c isTouching will be false.
-            this.stopTouch(ev);
-        }
-    };
-    GlobalEmitter.prototype.handleTouchEnd = function (ev) {
-        this.stopTouch(ev);
-    };
-    // Mouse Handlers
-    // -----------------------------------------------------------------------------------------------------------------
-    GlobalEmitter.prototype.handleMouseDown = function (ev) {
-        if (!this.shouldIgnoreMouse()) {
-            this.trigger('mousedown', ev);
-        }
-    };
-    GlobalEmitter.prototype.handleMouseMove = function (ev) {
-        if (!this.shouldIgnoreMouse()) {
-            this.trigger('mousemove', ev);
-        }
-    };
-    GlobalEmitter.prototype.handleMouseUp = function (ev) {
-        if (!this.shouldIgnoreMouse()) {
-            this.trigger('mouseup', ev);
-        }
-    };
-    GlobalEmitter.prototype.handleClick = function (ev) {
-        if (!this.shouldIgnoreMouse()) {
-            this.trigger('click', ev);
-        }
-    };
-    // Misc Handlers
-    // -----------------------------------------------------------------------------------------------------------------
-    GlobalEmitter.prototype.handleSelectStart = function (ev) {
-        this.trigger('selectstart', ev);
-    };
-    GlobalEmitter.prototype.handleContextMenu = function (ev) {
-        this.trigger('contextmenu', ev);
-    };
-    GlobalEmitter.prototype.handleScroll = function (ev) {
-        this.trigger('scroll', ev);
-    };
-    // Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    GlobalEmitter.prototype.stopTouch = function (ev, skipMouseIgnore) {
-        if (skipMouseIgnore === void 0) { skipMouseIgnore = false; }
-        if (this.isTouching) {
-            this.isTouching = false;
-            this.trigger('touchend', ev);
-            if (!skipMouseIgnore) {
-                this.startTouchMouseIgnore();
-            }
-        }
-    };
-    GlobalEmitter.prototype.startTouchMouseIgnore = function () {
-        var _this = this;
-        var wait = exportHooks.touchMouseIgnoreWait;
-        if (wait) {
-            this.mouseIgnoreDepth++;
-            setTimeout(function () {
-                _this.mouseIgnoreDepth--;
-            }, wait);
-        }
-    };
-    GlobalEmitter.prototype.shouldIgnoreMouse = function () {
-        return this.isTouching || Boolean(this.mouseIgnoreDepth);
-    };
-    return GlobalEmitter;
-}());
-exports.default = GlobalEmitter;
-ListenerMixin_1.default.mixInto(GlobalEmitter);
-EmitterMixin_1.default.mixInto(GlobalEmitter);
-
-
-/***/ }),
-/* 22 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var exportHooks = __webpack_require__(16);
-exports.viewHash = {};
-exportHooks.views = exports.viewHash;
-function defineView(viewName, viewConfig) {
-    exports.viewHash[viewName] = viewConfig;
-}
-exports.defineView = defineView;
-function getViewConfig(viewName) {
-    return exports.viewHash[viewName];
-}
-exports.getViewConfig = getViewConfig;
-
-
-/***/ }),
-/* 23 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var DragListener_1 = __webpack_require__(54);
-/* Tracks mouse movements over a component and raises events about which hit the mouse is over.
-------------------------------------------------------------------------------------------------------------------------
-options:
-- subjectEl
-- subjectCenter
-*/
-var HitDragListener = /** @class */ (function (_super) {
-    tslib_1.__extends(HitDragListener, _super);
-    function HitDragListener(component, options) {
-        var _this = _super.call(this, options) || this;
-        _this.component = component;
-        return _this;
-    }
-    // Called when drag listening starts (but a real drag has not necessarily began).
-    // ev might be undefined if dragging was started manually.
-    HitDragListener.prototype.handleInteractionStart = function (ev) {
-        var subjectEl = this.subjectEl;
-        var subjectRect;
-        var origPoint;
-        var point;
-        this.component.hitsNeeded();
-        this.computeScrollBounds(); // for autoscroll
-        if (ev) {
-            origPoint = { left: util_1.getEvX(ev), top: util_1.getEvY(ev) };
-            point = origPoint;
-            // constrain the point to bounds of the element being dragged
-            if (subjectEl) {
-                subjectRect = util_1.getOuterRect(subjectEl); // used for centering as well
-                point = util_1.constrainPoint(point, subjectRect);
-            }
-            this.origHit = this.queryHit(point.left, point.top);
-            // treat the center of the subject as the collision point?
-            if (subjectEl && this.options.subjectCenter) {
-                // only consider the area the subject overlaps the hit. best for large subjects.
-                // TODO: skip this if hit didn't supply left/right/top/bottom
-                if (this.origHit) {
-                    subjectRect = util_1.intersectRects(this.origHit, subjectRect) ||
-                        subjectRect; // in case there is no intersection
-                }
-                point = util_1.getRectCenter(subjectRect);
-            }
-            this.coordAdjust = util_1.diffPoints(point, origPoint); // point - origPoint
-        }
-        else {
-            this.origHit = null;
-            this.coordAdjust = null;
-        }
-        // call the super-method. do it after origHit has been computed
-        _super.prototype.handleInteractionStart.call(this, ev);
-    };
-    // Called when the actual drag has started
-    HitDragListener.prototype.handleDragStart = function (ev) {
-        var hit;
-        _super.prototype.handleDragStart.call(this, ev);
-        // might be different from this.origHit if the min-distance is large
-        hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));
-        // report the initial hit the mouse is over
-        // especially important if no min-distance and drag starts immediately
-        if (hit) {
-            this.handleHitOver(hit);
-        }
-    };
-    // Called when the drag moves
-    HitDragListener.prototype.handleDrag = function (dx, dy, ev) {
-        var hit;
-        _super.prototype.handleDrag.call(this, dx, dy, ev);
-        hit = this.queryHit(util_1.getEvX(ev), util_1.getEvY(ev));
-        if (!isHitsEqual(hit, this.hit)) {
-            if (this.hit) {
-                this.handleHitOut();
-            }
-            if (hit) {
-                this.handleHitOver(hit);
-            }
-        }
-    };
-    // Called when dragging has been stopped
-    HitDragListener.prototype.handleDragEnd = function (ev) {
-        this.handleHitDone();
-        _super.prototype.handleDragEnd.call(this, ev);
-    };
-    // Called when a the mouse has just moved over a new hit
-    HitDragListener.prototype.handleHitOver = function (hit) {
-        var isOrig = isHitsEqual(hit, this.origHit);
-        this.hit = hit;
-        this.trigger('hitOver', this.hit, isOrig, this.origHit);
-    };
-    // Called when the mouse has just moved out of a hit
-    HitDragListener.prototype.handleHitOut = function () {
-        if (this.hit) {
-            this.trigger('hitOut', this.hit);
-            this.handleHitDone();
-            this.hit = null;
-        }
-    };
-    // Called after a hitOut. Also called before a dragStop
-    HitDragListener.prototype.handleHitDone = function () {
-        if (this.hit) {
-            this.trigger('hitDone', this.hit);
-        }
-    };
-    // Called when the interaction ends, whether there was a real drag or not
-    HitDragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {
-        _super.prototype.handleInteractionEnd.call(this, ev, isCancelled);
-        this.origHit = null;
-        this.hit = null;
-        this.component.hitsNotNeeded();
-    };
-    // Called when scrolling has stopped, whether through auto scroll, or the user scrolling
-    HitDragListener.prototype.handleScrollEnd = function () {
-        _super.prototype.handleScrollEnd.call(this);
-        // hits' absolute positions will be in new places after a user's scroll.
-        // HACK for recomputing.
-        if (this.isDragging) {
-            this.component.releaseHits();
-            this.component.prepareHits();
-        }
-    };
-    // Gets the hit underneath the coordinates for the given mouse event
-    HitDragListener.prototype.queryHit = function (left, top) {
-        if (this.coordAdjust) {
-            left += this.coordAdjust.left;
-            top += this.coordAdjust.top;
-        }
-        return this.component.queryHit(left, top);
-    };
-    return HitDragListener;
-}(DragListener_1.default));
-exports.default = HitDragListener;
-// Returns `true` if the hits are identically equal. `false` otherwise. Must be from the same component.
-// Two null values will be considered equal, as two "out of the component" states are the same.
-function isHitsEqual(hit0, hit1) {
-    if (!hit0 && !hit1) {
-        return true;
-    }
-    if (hit0 && hit1) {
-        return hit0.component === hit1.component &&
-            isHitPropsWithin(hit0, hit1) &&
-            isHitPropsWithin(hit1, hit0); // ensures all props are identical
-    }
-    return false;
-}
-// Returns true if all of subHit's non-standard properties are within superHit
-function isHitPropsWithin(subHit, superHit) {
-    for (var propName in subHit) {
-        if (!/^(component|left|right|top|bottom)$/.test(propName)) {
-            if (subHit[propName] !== superHit[propName]) {
-                return false;
-            }
-        }
-    }
-    return true;
-}
-
-
-/***/ }),
-/* 24 */,
-/* 25 */,
-/* 26 */,
-/* 27 */,
-/* 28 */,
-/* 29 */,
-/* 30 */,
-/* 31 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var exportHooks = __webpack_require__(16);
-var options_1 = __webpack_require__(32);
-var util_1 = __webpack_require__(4);
-exports.localeOptionHash = {};
-exportHooks.locales = exports.localeOptionHash;
-// NOTE: can't guarantee any of these computations will run because not every locale has datepicker
-// configs, so make sure there are English fallbacks for these in the defaults file.
-var dpComputableOptions = {
-    buttonText: function (dpOptions) {
-        return {
-            // the translations sometimes wrongly contain HTML entities
-            prev: util_1.stripHtmlEntities(dpOptions.prevText),
-            next: util_1.stripHtmlEntities(dpOptions.nextText),
-            today: util_1.stripHtmlEntities(dpOptions.currentText)
-        };
-    },
-    // Produces format strings like "MMMM YYYY" -> "September 2014"
-    monthYearFormat: function (dpOptions) {
-        return dpOptions.showMonthAfterYear ?
-            'YYYY[' + dpOptions.yearSuffix + '] MMMM' :
-            'MMMM YYYY[' + dpOptions.yearSuffix + ']';
-    }
-};
-var momComputableOptions = {
-    // Produces format strings like "ddd M/D" -> "Fri 9/15"
-    dayOfMonthFormat: function (momOptions, fcOptions) {
-        var format = momOptions.longDateFormat('l'); // for the format like "M/D/YYYY"
-        // strip the year off the edge, as well as other misc non-whitespace chars
-        format = format.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g, '');
-        if (fcOptions.isRTL) {
-            format += ' ddd'; // for RTL, add day-of-week to end
-        }
-        else {
-            format = 'ddd ' + format; // for LTR, add day-of-week to beginning
-        }
-        return format;
-    },
-    // Produces format strings like "h:mma" -> "6:00pm"
-    mediumTimeFormat: function (momOptions) {
-        return momOptions.longDateFormat('LT')
-            .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand
-    },
-    // Produces format strings like "h(:mm)a" -> "6pm" / "6:30pm"
-    smallTimeFormat: function (momOptions) {
-        return momOptions.longDateFormat('LT')
-            .replace(':mm', '(:mm)')
-            .replace(/(\Wmm)$/, '($1)') // like above, but for foreign locales
-            .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand
-    },
-    // Produces format strings like "h(:mm)t" -> "6p" / "6:30p"
-    extraSmallTimeFormat: function (momOptions) {
-        return momOptions.longDateFormat('LT')
-            .replace(':mm', '(:mm)')
-            .replace(/(\Wmm)$/, '($1)') // like above, but for foreign locales
-            .replace(/\s*a$/i, 't'); // convert to AM/PM/am/pm to lowercase one-letter. remove any spaces beforehand
-    },
-    // Produces format strings like "ha" / "H" -> "6pm" / "18"
-    hourFormat: function (momOptions) {
-        return momOptions.longDateFormat('LT')
-            .replace(':mm', '')
-            .replace(/(\Wmm)$/, '') // like above, but for foreign locales
-            .replace(/\s*a$/i, 'a'); // convert AM/PM/am/pm to lowercase. remove any spaces beforehand
-    },
-    // Produces format strings like "h:mm" -> "6:30" (with no AM/PM)
-    noMeridiemTimeFormat: function (momOptions) {
-        return momOptions.longDateFormat('LT')
-            .replace(/\s*a$/i, ''); // remove trailing AM/PM
-    }
-};
-// options that should be computed off live calendar options (considers override options)
-// TODO: best place for this? related to locale?
-// TODO: flipping text based on isRTL is a bad idea because the CSS `direction` might want to handle it
-var instanceComputableOptions = {
-    // Produces format strings for results like "Mo 16"
-    smallDayDateFormat: function (options) {
-        return options.isRTL ?
-            'D dd' :
-            'dd D';
-    },
-    // Produces format strings for results like "Wk 5"
-    weekFormat: function (options) {
-        return options.isRTL ?
-            'w[ ' + options.weekNumberTitle + ']' :
-            '[' + options.weekNumberTitle + ' ]w';
-    },
-    // Produces format strings for results like "Wk5"
-    smallWeekFormat: function (options) {
-        return options.isRTL ?
-            'w[' + options.weekNumberTitle + ']' :
-            '[' + options.weekNumberTitle + ']w';
-    }
-};
-// TODO: make these computable properties in optionsManager
-function populateInstanceComputableOptions(options) {
-    $.each(instanceComputableOptions, function (name, func) {
-        if (options[name] == null) {
-            options[name] = func(options);
-        }
-    });
-}
-exports.populateInstanceComputableOptions = populateInstanceComputableOptions;
-// Initialize jQuery UI datepicker translations while using some of the translations
-// Will set this as the default locales for datepicker.
-function datepickerLocale(localeCode, dpLocaleCode, dpOptions) {
-    // get the FullCalendar internal option hash for this locale. create if necessary
-    var fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});
-    // transfer some simple options from datepicker to fc
-    fcOptions.isRTL = dpOptions.isRTL;
-    fcOptions.weekNumberTitle = dpOptions.weekHeader;
-    // compute some more complex options from datepicker
-    $.each(dpComputableOptions, function (name, func) {
-        fcOptions[name] = func(dpOptions);
-    });
-    var jqDatePicker = $.datepicker;
-    // is jQuery UI Datepicker is on the page?
-    if (jqDatePicker) {
-        // Register the locale data.
-        // FullCalendar and MomentJS use locale codes like "pt-br" but Datepicker
-        // does it like "pt-BR" or if it doesn't have the locale, maybe just "pt".
-        // Make an alias so the locale can be referenced either way.
-        jqDatePicker.regional[dpLocaleCode] =
-            jqDatePicker.regional[localeCode] = // alias
-                dpOptions;
-        // Alias 'en' to the default locale data. Do this every time.
-        jqDatePicker.regional.en = jqDatePicker.regional[''];
-        // Set as Datepicker's global defaults.
-        jqDatePicker.setDefaults(dpOptions);
-    }
-}
-exports.datepickerLocale = datepickerLocale;
-// Sets FullCalendar-specific translations. Will set the locales as the global default.
-function locale(localeCode, newFcOptions) {
-    var fcOptions;
-    var momOptions;
-    // get the FullCalendar internal option hash for this locale. create if necessary
-    fcOptions = exports.localeOptionHash[localeCode] || (exports.localeOptionHash[localeCode] = {});
-    // provided new options for this locales? merge them in
-    if (newFcOptions) {
-        fcOptions = exports.localeOptionHash[localeCode] = options_1.mergeOptions([fcOptions, newFcOptions]);
-    }
-    // compute locale options that weren't defined.
-    // always do this. newFcOptions can be undefined when initializing from i18n file,
-    // so no way to tell if this is an initialization or a default-setting.
-    momOptions = getMomentLocaleData(localeCode); // will fall back to en
-    $.each(momComputableOptions, function (name, func) {
-        if (fcOptions[name] == null) {
-            fcOptions[name] = (func)(momOptions, fcOptions);
-        }
-    });
-    // set it as the default locale for FullCalendar
-    options_1.globalDefaults.locale = localeCode;
-}
-exports.locale = locale;
-// Returns moment's internal locale data. If doesn't exist, returns English.
-function getMomentLocaleData(localeCode) {
-    return moment.localeData(localeCode) || moment.localeData('en');
-}
-exports.getMomentLocaleData = getMomentLocaleData;
-// Initialize English by forcing computation of moment-derived options.
-// Also, sets it as the default.
-locale('en', options_1.englishDefaults);
-
-
-/***/ }),
-/* 32 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var util_1 = __webpack_require__(4);
-exports.globalDefaults = {
-    titleRangeSeparator: ' \u2013 ',
-    monthYearFormat: 'MMMM YYYY',
-    defaultTimedEventDuration: '02:00:00',
-    defaultAllDayEventDuration: { days: 1 },
-    forceEventDuration: false,
-    nextDayThreshold: '09:00:00',
-    // display
-    columnHeader: true,
-    defaultView: 'month',
-    aspectRatio: 1.35,
-    header: {
-        left: 'title',
-        center: '',
-        right: 'today prev,next'
-    },
-    weekends: true,
-    weekNumbers: false,
-    weekNumberTitle: 'W',
-    weekNumberCalculation: 'local',
-    // editable: false,
-    // nowIndicator: false,
-    scrollTime: '06:00:00',
-    minTime: '00:00:00',
-    maxTime: '24:00:00',
-    showNonCurrentDates: true,
-    // event ajax
-    lazyFetching: true,
-    startParam: 'start',
-    endParam: 'end',
-    timezoneParam: 'timezone',
-    timezone: false,
-    // allDayDefault: undefined,
-    // locale
-    locale: null,
-    isRTL: false,
-    buttonText: {
-        prev: 'prev',
-        next: 'next',
-        prevYear: 'prev year',
-        nextYear: 'next year',
-        year: 'year',
-        today: 'today',
-        month: 'month',
-        week: 'week',
-        day: 'day'
-    },
-    // buttonIcons: null,
-    allDayText: 'all-day',
-    // allows setting a min-height to the event segment to prevent short events overlapping each other
-    agendaEventMinHeight: 0,
-    // jquery-ui theming
-    theme: false,
-    // themeButtonIcons: null,
-    // eventResizableFromStart: false,
-    dragOpacity: .75,
-    dragRevertDuration: 500,
-    dragScroll: true,
-    // selectable: false,
-    unselectAuto: true,
-    // selectMinDistance: 0,
-    dropAccept: '*',
-    eventOrder: 'title',
-    // eventRenderWait: null,
-    eventLimit: false,
-    eventLimitText: 'more',
-    eventLimitClick: 'popover',
-    dayPopoverFormat: 'LL',
-    handleWindowResize: true,
-    windowResizeDelay: 100,
-    longPressDelay: 1000
-};
-exports.englishDefaults = {
-    dayPopoverFormat: 'dddd, MMMM D'
-};
-exports.rtlDefaults = {
-    header: {
-        left: 'next,prev today',
-        center: '',
-        right: 'title'
-    },
-    buttonIcons: {
-        prev: 'right-single-arrow',
-        next: 'left-single-arrow',
-        prevYear: 'right-double-arrow',
-        nextYear: 'left-double-arrow'
-    },
-    themeButtonIcons: {
-        prev: 'circle-triangle-e',
-        next: 'circle-triangle-w',
-        nextYear: 'seek-prev',
-        prevYear: 'seek-next'
-    }
-};
-var complexOptions = [
-    'header',
-    'footer',
-    'buttonText',
-    'buttonIcons',
-    'themeButtonIcons'
-];
-// Merges an array of option objects into a single object
-function mergeOptions(optionObjs) {
-    return util_1.mergeProps(optionObjs, complexOptions);
-}
-exports.mergeOptions = mergeOptions;
-
-
-/***/ }),
-/* 33 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-// Class that all other classes will inherit from
-var Class = /** @class */ (function () {
-    function Class() {
-    }
-    // Called on a class to create a subclass.
-    // LIMITATION: cannot provide a constructor!
-    Class.extend = function (members) {
-        var SubClass = /** @class */ (function (_super) {
-            tslib_1.__extends(SubClass, _super);
-            function SubClass() {
-                return _super !== null && _super.apply(this, arguments) || this;
-            }
-            return SubClass;
-        }(this));
-        util_1.copyOwnProps(members, SubClass.prototype);
-        return SubClass;
-    };
-    // Adds new member variables/methods to the class's prototype.
-    // Can be called with another class, or a plain object hash containing new members.
-    Class.mixin = function (members) {
-        util_1.copyOwnProps(members, this.prototype);
-    };
-    return Class;
-}());
-exports.default = Class;
-
-
-/***/ }),
-/* 34 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var ParsableModelMixin_1 = __webpack_require__(208);
-var EventDef = /** @class */ (function () {
-    function EventDef(source) {
-        this.source = source;
-        this.className = [];
-        this.miscProps = {};
-    }
-    EventDef.parse = function (rawInput, source) {
-        var def = new this(source);
-        if (def.applyProps(rawInput)) {
-            return def;
-        }
-        return false;
-    };
-    EventDef.normalizeId = function (id) {
-        return String(id);
-    };
-    EventDef.generateId = function () {
-        return '_fc' + (EventDef.uuid++);
-    };
-    EventDef.prototype.clone = function () {
-        var copy = new this.constructor(this.source);
-        copy.id = this.id;
-        copy.rawId = this.rawId;
-        copy.uid = this.uid; // not really unique anymore :(
-        EventDef.copyVerbatimStandardProps(this, copy);
-        copy.className = this.className.slice(); // copy
-        copy.miscProps = $.extend({}, this.miscProps);
-        return copy;
-    };
-    EventDef.prototype.hasInverseRendering = function () {
-        return this.getRendering() === 'inverse-background';
-    };
-    EventDef.prototype.hasBgRendering = function () {
-        var rendering = this.getRendering();
-        return rendering === 'inverse-background' || rendering === 'background';
-    };
-    EventDef.prototype.getRendering = function () {
-        if (this.rendering != null) {
-            return this.rendering;
-        }
-        return this.source.rendering;
-    };
-    EventDef.prototype.getConstraint = function () {
-        if (this.constraint != null) {
-            return this.constraint;
-        }
-        if (this.source.constraint != null) {
-            return this.source.constraint;
-        }
-        return this.source.calendar.opt('eventConstraint'); // what about View option?
-    };
-    EventDef.prototype.getOverlap = function () {
-        if (this.overlap != null) {
-            return this.overlap;
-        }
-        if (this.source.overlap != null) {
-            return this.source.overlap;
-        }
-        return this.source.calendar.opt('eventOverlap'); // what about View option?
-    };
-    EventDef.prototype.isStartExplicitlyEditable = function () {
-        if (this.startEditable != null) {
-            return this.startEditable;
-        }
-        return this.source.startEditable;
-    };
-    EventDef.prototype.isDurationExplicitlyEditable = function () {
-        if (this.durationEditable != null) {
-            return this.durationEditable;
-        }
-        return this.source.durationEditable;
-    };
-    EventDef.prototype.isExplicitlyEditable = function () {
-        if (this.editable != null) {
-            return this.editable;
-        }
-        return this.source.editable;
-    };
-    EventDef.prototype.toLegacy = function () {
-        var obj = $.extend({}, this.miscProps);
-        obj._id = this.uid;
-        obj.source = this.source;
-        obj.className = this.className.slice(); // copy
-        obj.allDay = this.isAllDay();
-        if (this.rawId != null) {
-            obj.id = this.rawId;
-        }
-        EventDef.copyVerbatimStandardProps(this, obj);
-        return obj;
-    };
-    EventDef.prototype.applyManualStandardProps = function (rawProps) {
-        if (rawProps.id != null) {
-            this.id = EventDef.normalizeId((this.rawId = rawProps.id));
-        }
-        else {
-            this.id = EventDef.generateId();
-        }
-        if (rawProps._id != null) {
-            this.uid = String(rawProps._id);
-        }
-        else {
-            this.uid = EventDef.generateId();
-        }
-        // TODO: converge with EventSource
-        if ($.isArray(rawProps.className)) {
-            this.className = rawProps.className;
-        }
-        if (typeof rawProps.className === 'string') {
-            this.className = rawProps.className.split(/\s+/);
-        }
-        return true;
-    };
-    EventDef.prototype.applyMiscProps = function (rawProps) {
-        $.extend(this.miscProps, rawProps);
-    };
-    EventDef.uuid = 0;
-    EventDef.defineStandardProps = ParsableModelMixin_1.default.defineStandardProps;
-    EventDef.copyVerbatimStandardProps = ParsableModelMixin_1.default.copyVerbatimStandardProps;
-    return EventDef;
-}());
-exports.default = EventDef;
-ParsableModelMixin_1.default.mixInto(EventDef);
-EventDef.defineStandardProps({
-    // not automatically assigned (`false`)
-    _id: false,
-    id: false,
-    className: false,
-    source: false,
-    // automatically assigned (`true`)
-    title: true,
-    url: true,
-    rendering: true,
-    constraint: true,
-    overlap: true,
-    editable: true,
-    startEditable: true,
-    durationEditable: true,
-    color: true,
-    backgroundColor: true,
-    borderColor: true,
-    textColor: true
-});
-
-
-/***/ }),
-/* 35 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var EventRange_1 = __webpack_require__(211);
-var EventFootprint_1 = __webpack_require__(36);
-var ComponentFootprint_1 = __webpack_require__(12);
-function eventDefsToEventInstances(eventDefs, unzonedRange) {
-    var eventInstances = [];
-    var i;
-    for (i = 0; i < eventDefs.length; i++) {
-        eventInstances.push.apply(eventInstances, // append
-        eventDefs[i].buildInstances(unzonedRange));
-    }
-    return eventInstances;
-}
-exports.eventDefsToEventInstances = eventDefsToEventInstances;
-function eventInstanceToEventRange(eventInstance) {
-    return new EventRange_1.default(eventInstance.dateProfile.unzonedRange, eventInstance.def, eventInstance);
-}
-exports.eventInstanceToEventRange = eventInstanceToEventRange;
-function eventRangeToEventFootprint(eventRange) {
-    return new EventFootprint_1.default(new ComponentFootprint_1.default(eventRange.unzonedRange, eventRange.eventDef.isAllDay()), eventRange.eventDef, eventRange.eventInstance // might not exist
-    );
-}
-exports.eventRangeToEventFootprint = eventRangeToEventFootprint;
-function eventInstanceToUnzonedRange(eventInstance) {
-    return eventInstance.dateProfile.unzonedRange;
-}
-exports.eventInstanceToUnzonedRange = eventInstanceToUnzonedRange;
-function eventFootprintToComponentFootprint(eventFootprint) {
-    return eventFootprint.componentFootprint;
-}
-exports.eventFootprintToComponentFootprint = eventFootprintToComponentFootprint;
-
-
-/***/ }),
-/* 36 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var EventFootprint = /** @class */ (function () {
-    function EventFootprint(componentFootprint, eventDef, eventInstance) {
-        this.componentFootprint = componentFootprint;
-        this.eventDef = eventDef;
-        if (eventInstance) {
-            this.eventInstance = eventInstance;
-        }
-    }
-    EventFootprint.prototype.getEventLegacy = function () {
-        return (this.eventInstance || this.eventDef).toLegacy();
-    };
-    return EventFootprint;
-}());
-exports.default = EventFootprint;
-
-
-/***/ }),
-/* 37 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var util_1 = __webpack_require__(4);
-var EventDateProfile_1 = __webpack_require__(17);
-var EventDef_1 = __webpack_require__(34);
-var EventDefDateMutation_1 = __webpack_require__(50);
-var SingleEventDef_1 = __webpack_require__(13);
-var EventDefMutation = /** @class */ (function () {
-    function EventDefMutation() {
-    }
-    EventDefMutation.createFromRawProps = function (eventInstance, rawProps, largeUnit) {
-        var eventDef = eventInstance.def;
-        var dateProps = {};
-        var standardProps = {};
-        var miscProps = {};
-        var verbatimStandardProps = {};
-        var eventDefId = null;
-        var className = null;
-        var propName;
-        var dateProfile;
-        var dateMutation;
-        var defMutation;
-        for (propName in rawProps) {
-            if (EventDateProfile_1.default.isStandardProp(propName)) {
-                dateProps[propName] = rawProps[propName];
-            }
-            else if (eventDef.isStandardProp(propName)) {
-                standardProps[propName] = rawProps[propName];
-            }
-            else if (eventDef.miscProps[propName] !== rawProps[propName]) {
-                miscProps[propName] = rawProps[propName];
-            }
-        }
-        dateProfile = EventDateProfile_1.default.parse(dateProps, eventDef.source);
-        if (dateProfile) {
-            dateMutation = EventDefDateMutation_1.default.createFromDiff(eventInstance.dateProfile, dateProfile, largeUnit);
-        }
-        if (standardProps.id !== eventDef.id) {
-            eventDefId = standardProps.id; // only apply if there's a change
-        }
-        if (!util_1.isArraysEqual(standardProps.className, eventDef.className)) {
-            className = standardProps.className; // only apply if there's a change
-        }
-        EventDef_1.default.copyVerbatimStandardProps(standardProps, // src
-        verbatimStandardProps // dest
-        );
-        defMutation = new EventDefMutation();
-        defMutation.eventDefId = eventDefId;
-        defMutation.className = className;
-        defMutation.verbatimStandardProps = verbatimStandardProps;
-        defMutation.miscProps = miscProps;
-        if (dateMutation) {
-            defMutation.dateMutation = dateMutation;
-        }
-        return defMutation;
-    };
-    /*
-    eventDef assumed to be a SingleEventDef.
-    returns an undo function.
-    */
-    EventDefMutation.prototype.mutateSingle = function (eventDef) {
-        var origDateProfile;
-        if (this.dateMutation) {
-            origDateProfile = eventDef.dateProfile;
-            eventDef.dateProfile = this.dateMutation.buildNewDateProfile(origDateProfile, eventDef.source.calendar);
-        }
-        // can't undo
-        // TODO: more DRY with EventDef::applyManualStandardProps
-        if (this.eventDefId != null) {
-            eventDef.id = EventDef_1.default.normalizeId((eventDef.rawId = this.eventDefId));
-        }
-        // can't undo
-        // TODO: more DRY with EventDef::applyManualStandardProps
-        if (this.className) {
-            eventDef.className = this.className;
-        }
-        // can't undo
-        if (this.verbatimStandardProps) {
-            SingleEventDef_1.default.copyVerbatimStandardProps(this.verbatimStandardProps, // src
-            eventDef // dest
-            );
-        }
-        // can't undo
-        if (this.miscProps) {
-            eventDef.applyMiscProps(this.miscProps);
-        }
-        if (origDateProfile) {
-            return function () {
-                eventDef.dateProfile = origDateProfile;
-            };
-        }
-        else {
-            return function () { };
-        }
-    };
-    EventDefMutation.prototype.setDateMutation = function (dateMutation) {
-        if (dateMutation && !dateMutation.isEmpty()) {
-            this.dateMutation = dateMutation;
-        }
-        else {
-            this.dateMutation = null;
-        }
-    };
-    EventDefMutation.prototype.isEmpty = function () {
-        return !this.dateMutation;
-    };
-    return EventDefMutation;
-}());
-exports.default = EventDefMutation;
-
-
-/***/ }),
-/* 38 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.default = {
-    sourceClasses: [],
-    registerClass: function (EventSourceClass) {
-        this.sourceClasses.unshift(EventSourceClass); // give highest priority
-    },
-    parse: function (rawInput, calendar) {
-        var sourceClasses = this.sourceClasses;
-        var i;
-        var eventSource;
-        for (i = 0; i < sourceClasses.length; i++) {
-            eventSource = sourceClasses[i].parse(rawInput, calendar);
-            if (eventSource) {
-                return eventSource;
-            }
-        }
-    }
-};
-
-
-/***/ }),
-/* 39 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var Class_1 = __webpack_require__(33);
-/*
-Embodies a div that has potential scrollbars
-*/
-var Scroller = /** @class */ (function (_super) {
-    tslib_1.__extends(Scroller, _super);
-    function Scroller(options) {
-        var _this = _super.call(this) || this;
-        options = options || {};
-        _this.overflowX = options.overflowX || options.overflow || 'auto';
-        _this.overflowY = options.overflowY || options.overflow || 'auto';
-        return _this;
-    }
-    Scroller.prototype.render = function () {
-        this.el = this.renderEl();
-        this.applyOverflow();
-    };
-    Scroller.prototype.renderEl = function () {
-        return (this.scrollEl = $('<div class="fc-scroller"></div>'));
-    };
-    // sets to natural height, unlocks overflow
-    Scroller.prototype.clear = function () {
-        this.setHeight('auto');
-        this.applyOverflow();
-    };
-    Scroller.prototype.destroy = function () {
-        this.el.remove();
-    };
-    // Overflow
-    // -----------------------------------------------------------------------------------------------------------------
-    Scroller.prototype.applyOverflow = function () {
-        this.scrollEl.css({
-            'overflow-x': this.overflowX,
-            'overflow-y': this.overflowY
-        });
-    };
-    // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
-    // Useful for preserving scrollbar widths regardless of future resizes.
-    // Can pass in scrollbarWidths for optimization.
-    Scroller.prototype.lockOverflow = function (scrollbarWidths) {
-        var overflowX = this.overflowX;
-        var overflowY = this.overflowY;
-        scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
-        if (overflowX === 'auto') {
-            overflowX = (scrollbarWidths.top || scrollbarWidths.bottom || // horizontal scrollbars?
-                // OR scrolling pane with massless scrollbars?
-                this.scrollEl[0].scrollWidth - 1 > this.scrollEl[0].clientWidth) ? 'scroll' : 'hidden';
-        }
-        if (overflowY === 'auto') {
-            overflowY = (scrollbarWidths.left || scrollbarWidths.right || // vertical scrollbars?
-                // OR scrolling pane with massless scrollbars?
-                this.scrollEl[0].scrollHeight - 1 > this.scrollEl[0].clientHeight) ? 'scroll' : 'hidden';
-        }
-        this.scrollEl.css({ 'overflow-x': overflowX, 'overflow-y': overflowY });
-    };
-    // Getters / Setters
-    // -----------------------------------------------------------------------------------------------------------------
-    Scroller.prototype.setHeight = function (height) {
-        this.scrollEl.height(height);
-    };
-    Scroller.prototype.getScrollTop = function () {
-        return this.scrollEl.scrollTop();
-    };
-    Scroller.prototype.setScrollTop = function (top) {
-        this.scrollEl.scrollTop(top);
-    };
-    Scroller.prototype.getClientWidth = function () {
-        return this.scrollEl[0].clientWidth;
-    };
-    Scroller.prototype.getClientHeight = function () {
-        return this.scrollEl[0].clientHeight;
-    };
-    Scroller.prototype.getScrollbarWidths = function () {
-        return util_1.getScrollbarWidths(this.scrollEl);
-    };
-    return Scroller;
-}(Class_1.default));
-exports.default = Scroller;
-
-
-/***/ }),
-/* 40 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var DateComponent_1 = __webpack_require__(219);
-var GlobalEmitter_1 = __webpack_require__(21);
-var InteractiveDateComponent = /** @class */ (function (_super) {
-    tslib_1.__extends(InteractiveDateComponent, _super);
-    function InteractiveDateComponent(_view, _options) {
-        var _this = _super.call(this, _view, _options) || this;
-        // self-config, overridable by subclasses
-        _this.segSelector = '.fc-event-container > *'; // what constitutes an event element?
-        if (_this.dateSelectingClass) {
-            _this.dateClicking = new _this.dateClickingClass(_this);
-        }
-        if (_this.dateSelectingClass) {
-            _this.dateSelecting = new _this.dateSelectingClass(_this);
-        }
-        if (_this.eventPointingClass) {
-            _this.eventPointing = new _this.eventPointingClass(_this);
-        }
-        if (_this.eventDraggingClass && _this.eventPointing) {
-            _this.eventDragging = new _this.eventDraggingClass(_this, _this.eventPointing);
-        }
-        if (_this.eventResizingClass && _this.eventPointing) {
-            _this.eventResizing = new _this.eventResizingClass(_this, _this.eventPointing);
-        }
-        if (_this.externalDroppingClass) {
-            _this.externalDropping = new _this.externalDroppingClass(_this);
-        }
-        return _this;
-    }
-    // Sets the container element that the view should render inside of, does global DOM-related initializations,
-    // and renders all the non-date-related content inside.
-    InteractiveDateComponent.prototype.setElement = function (el) {
-        _super.prototype.setElement.call(this, el);
-        if (this.dateClicking) {
-            this.dateClicking.bindToEl(el);
-        }
-        if (this.dateSelecting) {
-            this.dateSelecting.bindToEl(el);
-        }
-        this.bindAllSegHandlersToEl(el);
-    };
-    InteractiveDateComponent.prototype.removeElement = function () {
-        this.endInteractions();
-        _super.prototype.removeElement.call(this);
-    };
-    InteractiveDateComponent.prototype.executeEventUnrender = function () {
-        this.endInteractions();
-        _super.prototype.executeEventUnrender.call(this);
-    };
-    InteractiveDateComponent.prototype.bindGlobalHandlers = function () {
-        _super.prototype.bindGlobalHandlers.call(this);
-        if (this.externalDropping) {
-            this.externalDropping.bindToDocument();
-        }
-    };
-    InteractiveDateComponent.prototype.unbindGlobalHandlers = function () {
-        _super.prototype.unbindGlobalHandlers.call(this);
-        if (this.externalDropping) {
-            this.externalDropping.unbindFromDocument();
-        }
-    };
-    InteractiveDateComponent.prototype.bindDateHandlerToEl = function (el, name, handler) {
-        var _this = this;
-        // attach a handler to the grid's root element.
-        // jQuery will take care of unregistering them when removeElement gets called.
-        this.el.on(name, function (ev) {
-            if (!$(ev.target).is(_this.segSelector + ':not(.fc-helper),' + // directly on an event element
-                _this.segSelector + ':not(.fc-helper) *,' + // within an event element
-                '.fc-more,' + // a "more.." link
-                'a[data-goto]' // a clickable nav link
-            )) {
-                return handler.call(_this, ev);
-            }
-        });
-    };
-    InteractiveDateComponent.prototype.bindAllSegHandlersToEl = function (el) {
-        [
-            this.eventPointing,
-            this.eventDragging,
-            this.eventResizing
-        ].forEach(function (eventInteraction) {
-            if (eventInteraction) {
-                eventInteraction.bindToEl(el);
-            }
-        });
-    };
-    InteractiveDateComponent.prototype.bindSegHandlerToEl = function (el, name, handler) {
-        var _this = this;
-        el.on(name, this.segSelector, function (ev) {
-            var segEl = $(ev.currentTarget);
-            if (!segEl.is('.fc-helper')) {
-                var seg = segEl.data('fc-seg'); // grab segment data. put there by View::renderEventsPayload
-                if (seg && !_this.shouldIgnoreEventPointing()) {
-                    return handler.call(_this, seg, ev); // context will be the Grid
-                }
-            }
-        });
-    };
-    InteractiveDateComponent.prototype.shouldIgnoreMouse = function () {
-        // HACK
-        // This will still work even though bindDateHandlerToEl doesn't use GlobalEmitter.
-        return GlobalEmitter_1.default.get().shouldIgnoreMouse();
-    };
-    InteractiveDateComponent.prototype.shouldIgnoreTouch = function () {
-        var view = this._getView();
-        // On iOS (and Android?) when a new selection is initiated overtop another selection,
-        // the touchend never fires because the elements gets removed mid-touch-interaction (my theory).
-        // HACK: simply don't allow this to happen.
-        // ALSO: prevent selection when an *event* is already raised.
-        return view.isSelected || view.selectedEvent;
-    };
-    InteractiveDateComponent.prototype.shouldIgnoreEventPointing = function () {
-        // only call the handlers if there is not a drag/resize in progress
-        return (this.eventDragging && this.eventDragging.isDragging) ||
-            (this.eventResizing && this.eventResizing.isResizing);
-    };
-    InteractiveDateComponent.prototype.canStartSelection = function (seg, ev) {
-        return util_1.getEvIsTouch(ev) &&
-            !this.canStartResize(seg, ev) &&
-            (this.isEventDefDraggable(seg.footprint.eventDef) ||
-                this.isEventDefResizable(seg.footprint.eventDef));
-    };
-    InteractiveDateComponent.prototype.canStartDrag = function (seg, ev) {
-        return !this.canStartResize(seg, ev) &&
-            this.isEventDefDraggable(seg.footprint.eventDef);
-    };
-    InteractiveDateComponent.prototype.canStartResize = function (seg, ev) {
-        var view = this._getView();
-        var eventDef = seg.footprint.eventDef;
-        return (!util_1.getEvIsTouch(ev) || view.isEventDefSelected(eventDef)) &&
-            this.isEventDefResizable(eventDef) &&
-            $(ev.target).is('.fc-resizer');
-    };
-    // Kills all in-progress dragging.
-    // Useful for when public API methods that result in re-rendering are invoked during a drag.
-    // Also useful for when touch devices misbehave and don't fire their touchend.
-    InteractiveDateComponent.prototype.endInteractions = function () {
-        [
-            this.dateClicking,
-            this.dateSelecting,
-            this.eventPointing,
-            this.eventDragging,
-            this.eventResizing
-        ].forEach(function (interaction) {
-            if (interaction) {
-                interaction.end();
-            }
-        });
-    };
-    // Event Drag-n-Drop
-    // ---------------------------------------------------------------------------------------------------------------
-    // Computes if the given event is allowed to be dragged by the user
-    InteractiveDateComponent.prototype.isEventDefDraggable = function (eventDef) {
-        return this.isEventDefStartEditable(eventDef);
-    };
-    InteractiveDateComponent.prototype.isEventDefStartEditable = function (eventDef) {
-        var isEditable = eventDef.isStartExplicitlyEditable();
-        if (isEditable == null) {
-            isEditable = this.opt('eventStartEditable');
-            if (isEditable == null) {
-                isEditable = this.isEventDefGenerallyEditable(eventDef);
-            }
-        }
-        return isEditable;
-    };
-    InteractiveDateComponent.prototype.isEventDefGenerallyEditable = function (eventDef) {
-        var isEditable = eventDef.isExplicitlyEditable();
-        if (isEditable == null) {
-            isEditable = this.opt('editable');
-        }
-        return isEditable;
-    };
-    // Event Resizing
-    // ---------------------------------------------------------------------------------------------------------------
-    // Computes if the given event is allowed to be resized from its starting edge
-    InteractiveDateComponent.prototype.isEventDefResizableFromStart = function (eventDef) {
-        return this.opt('eventResizableFromStart') && this.isEventDefResizable(eventDef);
-    };
-    // Computes if the given event is allowed to be resized from its ending edge
-    InteractiveDateComponent.prototype.isEventDefResizableFromEnd = function (eventDef) {
-        return this.isEventDefResizable(eventDef);
-    };
-    // Computes if the given event is allowed to be resized by the user at all
-    InteractiveDateComponent.prototype.isEventDefResizable = function (eventDef) {
-        var isResizable = eventDef.isDurationExplicitlyEditable();
-        if (isResizable == null) {
-            isResizable = this.opt('eventDurationEditable');
-            if (isResizable == null) {
-                isResizable = this.isEventDefGenerallyEditable(eventDef);
-            }
-        }
-        return isResizable;
-    };
-    // Event Mutation / Constraints
-    // ---------------------------------------------------------------------------------------------------------------
-    // Diffs the two dates, returning a duration, based on granularity of the grid
-    // TODO: port isTimeScale into this system?
-    InteractiveDateComponent.prototype.diffDates = function (a, b) {
-        if (this.largeUnit) {
-            return util_1.diffByUnit(a, b, this.largeUnit);
-        }
-        else {
-            return util_1.diffDayTime(a, b);
-        }
-    };
-    // is it allowed, in relation to the view's validRange?
-    // NOTE: very similar to isExternalInstanceGroupAllowed
-    InteractiveDateComponent.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {
-        var view = this._getView();
-        var dateProfile = this.dateProfile;
-        var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());
-        var i;
-        for (i = 0; i < eventFootprints.length; i++) {
-            // TODO: just use getAllEventRanges directly
-            if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {
-                return false;
-            }
-        }
-        return view.calendar.constraints.isEventInstanceGroupAllowed(eventInstanceGroup);
-    };
-    // NOTE: very similar to isEventInstanceGroupAllowed
-    // when it's a completely anonymous external drag, no event.
-    InteractiveDateComponent.prototype.isExternalInstanceGroupAllowed = function (eventInstanceGroup) {
-        var view = this._getView();
-        var dateProfile = this.dateProfile;
-        var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());
-        var i;
-        for (i = 0; i < eventFootprints.length; i++) {
-            if (!dateProfile.validUnzonedRange.containsRange(eventFootprints[i].componentFootprint.unzonedRange)) {
-                return false;
-            }
-        }
-        for (i = 0; i < eventFootprints.length; i++) {
-            // treat it as a selection
-            // TODO: pass in eventInstanceGroup instead
-            //  because we don't want calendar's constraint system to depend on a component's
-            //  determination of footprints.
-            if (!view.calendar.constraints.isSelectionFootprintAllowed(eventFootprints[i].componentFootprint)) {
-                return false;
-            }
-        }
-        return true;
-    };
-    return InteractiveDateComponent;
-}(DateComponent_1.default));
-exports.default = InteractiveDateComponent;
-
-
-/***/ }),
-/* 41 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var RenderQueue_1 = __webpack_require__(218);
-var DateProfileGenerator_1 = __webpack_require__(221);
-var InteractiveDateComponent_1 = __webpack_require__(40);
-var GlobalEmitter_1 = __webpack_require__(21);
-var UnzonedRange_1 = __webpack_require__(5);
-/* An abstract class from which other views inherit from
-----------------------------------------------------------------------------------------------------------------------*/
-var View = /** @class */ (function (_super) {
-    tslib_1.__extends(View, _super);
-    function View(calendar, viewSpec) {
-        var _this = _super.call(this, null, viewSpec.options) || this;
-        _this.batchRenderDepth = 0;
-        _this.isSelected = false; // boolean whether a range of time is user-selected or not
-        _this.calendar = calendar;
-        _this.viewSpec = viewSpec;
-        // shortcuts
-        _this.type = viewSpec.type;
-        // .name is deprecated
-        _this.name = _this.type;
-        _this.initRenderQueue();
-        _this.initHiddenDays();
-        _this.dateProfileGenerator = new _this.dateProfileGeneratorClass(_this);
-        _this.bindBaseRenderHandlers();
-        _this.eventOrderSpecs = util_1.parseFieldSpecs(_this.opt('eventOrder'));
-        // legacy
-        if (_this['initialize']) {
-            _this['initialize']();
-        }
-        return _this;
-    }
-    View.prototype._getView = function () {
-        return this;
-    };
-    // Retrieves an option with the given name
-    View.prototype.opt = function (name) {
-        return this.options[name];
-    };
-    /* Render Queue
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.initRenderQueue = function () {
-        this.renderQueue = new RenderQueue_1.default({
-            event: this.opt('eventRenderWait')
-        });
-        this.renderQueue.on('start', this.onRenderQueueStart.bind(this));
-        this.renderQueue.on('stop', this.onRenderQueueStop.bind(this));
-        this.on('before:change', this.startBatchRender);
-        this.on('change', this.stopBatchRender);
-    };
-    View.prototype.onRenderQueueStart = function () {
-        this.calendar.freezeContentHeight();
-        this.addScroll(this.queryScroll());
-    };
-    View.prototype.onRenderQueueStop = function () {
-        if (this.calendar.updateViewSize()) {
-            this.popScroll();
-        }
-        this.calendar.thawContentHeight();
-    };
-    View.prototype.startBatchRender = function () {
-        if (!(this.batchRenderDepth++)) {
-            this.renderQueue.pause();
-        }
-    };
-    View.prototype.stopBatchRender = function () {
-        if (!(--this.batchRenderDepth)) {
-            this.renderQueue.resume();
-        }
-    };
-    View.prototype.requestRender = function (func, namespace, actionType) {
-        this.renderQueue.queue(func, namespace, actionType);
-    };
-    // given func will auto-bind to `this`
-    View.prototype.whenSizeUpdated = function (func) {
-        if (this.renderQueue.isRunning) {
-            this.renderQueue.one('stop', func.bind(this));
-        }
-        else {
-            func.call(this);
-        }
-    };
-    /* Title and Date Formatting
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Computes what the title at the top of the calendar should be for this view
-    View.prototype.computeTitle = function (dateProfile) {
-        var unzonedRange;
-        // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
-        if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
-            unzonedRange = dateProfile.currentUnzonedRange;
-        }
-        else {
-            unzonedRange = dateProfile.activeUnzonedRange;
-        }
-        return this.formatRange({
-            start: this.calendar.msToMoment(unzonedRange.startMs, dateProfile.isRangeAllDay),
-            end: this.calendar.msToMoment(unzonedRange.endMs, dateProfile.isRangeAllDay)
-        }, dateProfile.isRangeAllDay, this.opt('titleFormat') || this.computeTitleFormat(dateProfile), this.opt('titleRangeSeparator'));
-    };
-    // Generates the format string that should be used to generate the title for the current date range.
-    // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
-    View.prototype.computeTitleFormat = function (dateProfile) {
-        var currentRangeUnit = dateProfile.currentRangeUnit;
-        if (currentRangeUnit === 'year') {
-            return 'YYYY';
-        }
-        else if (currentRangeUnit === 'month') {
-            return this.opt('monthYearFormat'); // like "September 2014"
-        }
-        else if (dateProfile.currentUnzonedRange.as('days') > 1) {
-            return 'll'; // multi-day range. shorter, like "Sep 9 - 10 2014"
-        }
-        else {
-            return 'LL'; // one day. longer, like "September 9 2014"
-        }
-    };
-    // Date Setting/Unsetting
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.setDate = function (date) {
-        var currentDateProfile = this.get('dateProfile');
-        var newDateProfile = this.dateProfileGenerator.build(date, undefined, true); // forceToValid=true
-        if (!currentDateProfile ||
-            !currentDateProfile.activeUnzonedRange.equals(newDateProfile.activeUnzonedRange)) {
-            this.set('dateProfile', newDateProfile);
-        }
-    };
-    View.prototype.unsetDate = function () {
-        this.unset('dateProfile');
-    };
-    // Event Data
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.fetchInitialEvents = function (dateProfile) {
-        var calendar = this.calendar;
-        var forceAllDay = dateProfile.isRangeAllDay && !this.usesMinMaxTime;
-        return calendar.requestEvents(calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, forceAllDay), calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, forceAllDay));
-    };
-    View.prototype.bindEventChanges = function () {
-        this.listenTo(this.calendar, 'eventsReset', this.resetEvents); // TODO: make this a real event
-    };
-    View.prototype.unbindEventChanges = function () {
-        this.stopListeningTo(this.calendar, 'eventsReset');
-    };
-    View.prototype.setEvents = function (eventsPayload) {
-        this.set('currentEvents', eventsPayload);
-        this.set('hasEvents', true);
-    };
-    View.prototype.unsetEvents = function () {
-        this.unset('currentEvents');
-        this.unset('hasEvents');
-    };
-    View.prototype.resetEvents = function (eventsPayload) {
-        this.startBatchRender();
-        this.unsetEvents();
-        this.setEvents(eventsPayload);
-        this.stopBatchRender();
-    };
-    // Date High-level Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.requestDateRender = function (dateProfile) {
-        var _this = this;
-        this.requestRender(function () {
-            _this.executeDateRender(dateProfile);
-        }, 'date', 'init');
-    };
-    View.prototype.requestDateUnrender = function () {
-        var _this = this;
-        this.requestRender(function () {
-            _this.executeDateUnrender();
-        }, 'date', 'destroy');
-    };
-    // if dateProfile not specified, uses current
-    View.prototype.executeDateRender = function (dateProfile) {
-        _super.prototype.executeDateRender.call(this, dateProfile);
-        if (this['render']) {
-            this['render'](); // TODO: deprecate
-        }
-        this.trigger('datesRendered');
-        this.addScroll({ isDateInit: true });
-        this.startNowIndicator(); // shouldn't render yet because updateSize will be called soon
-    };
-    View.prototype.executeDateUnrender = function () {
-        this.unselect();
-        this.stopNowIndicator();
-        this.trigger('before:datesUnrendered');
-        if (this['destroy']) {
-            this['destroy'](); // TODO: deprecate
-        }
-        _super.prototype.executeDateUnrender.call(this);
-    };
-    // "Base" rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.bindBaseRenderHandlers = function () {
-        var _this = this;
-        this.on('datesRendered', function () {
-            _this.whenSizeUpdated(_this.triggerViewRender);
-        });
-        this.on('before:datesUnrendered', function () {
-            _this.triggerViewDestroy();
-        });
-    };
-    View.prototype.triggerViewRender = function () {
-        this.publiclyTrigger('viewRender', {
-            context: this,
-            args: [this, this.el]
-        });
-    };
-    View.prototype.triggerViewDestroy = function () {
-        this.publiclyTrigger('viewDestroy', {
-            context: this,
-            args: [this, this.el]
-        });
-    };
-    // Event High-level Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.requestEventsRender = function (eventsPayload) {
-        var _this = this;
-        this.requestRender(function () {
-            _this.executeEventRender(eventsPayload);
-            _this.whenSizeUpdated(_this.triggerAfterEventsRendered);
-        }, 'event', 'init');
-    };
-    View.prototype.requestEventsUnrender = function () {
-        var _this = this;
-        this.requestRender(function () {
-            _this.triggerBeforeEventsDestroyed();
-            _this.executeEventUnrender();
-        }, 'event', 'destroy');
-    };
-    // Business Hour High-level Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.requestBusinessHoursRender = function (businessHourGenerator) {
-        var _this = this;
-        this.requestRender(function () {
-            _this.renderBusinessHours(businessHourGenerator);
-        }, 'businessHours', 'init');
-    };
-    View.prototype.requestBusinessHoursUnrender = function () {
-        var _this = this;
-        this.requestRender(function () {
-            _this.unrenderBusinessHours();
-        }, 'businessHours', 'destroy');
-    };
-    // Misc view rendering utils
-    // -----------------------------------------------------------------------------------------------------------------
-    // Binds DOM handlers to elements that reside outside the view container, such as the document
-    View.prototype.bindGlobalHandlers = function () {
-        _super.prototype.bindGlobalHandlers.call(this);
-        this.listenTo(GlobalEmitter_1.default.get(), {
-            touchstart: this.processUnselect,
-            mousedown: this.handleDocumentMousedown
-        });
-    };
-    // Unbinds DOM handlers from elements that reside outside the view container
-    View.prototype.unbindGlobalHandlers = function () {
-        _super.prototype.unbindGlobalHandlers.call(this);
-        this.stopListeningTo(GlobalEmitter_1.default.get());
-    };
-    /* Now Indicator
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Immediately render the current time indicator and begins re-rendering it at an interval,
-    // which is defined by this.getNowIndicatorUnit().
-    // TODO: somehow do this for the current whole day's background too
-    View.prototype.startNowIndicator = function () {
-        var _this = this;
-        var unit;
-        var update;
-        var delay; // ms wait value
-        if (this.opt('nowIndicator')) {
-            unit = this.getNowIndicatorUnit();
-            if (unit) {
-                update = util_1.proxy(this, 'updateNowIndicator'); // bind to `this`
-                this.initialNowDate = this.calendar.getNow();
-                this.initialNowQueriedMs = new Date().valueOf();
-                // wait until the beginning of the next interval
-                delay = this.initialNowDate.clone().startOf(unit).add(1, unit).valueOf() - this.initialNowDate.valueOf();
-                this.nowIndicatorTimeoutID = setTimeout(function () {
-                    _this.nowIndicatorTimeoutID = null;
-                    update();
-                    delay = +moment.duration(1, unit);
-                    delay = Math.max(100, delay); // prevent too frequent
-                    _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
-                }, delay);
-            }
-            // rendering will be initiated in updateSize
-        }
-    };
-    // rerenders the now indicator, computing the new current time from the amount of time that has passed
-    // since the initial getNow call.
-    View.prototype.updateNowIndicator = function () {
-        if (this.isDatesRendered &&
-            this.initialNowDate // activated before?
-        ) {
-            this.unrenderNowIndicator(); // won't unrender if unnecessary
-            this.renderNowIndicator(this.initialNowDate.clone().add(new Date().valueOf() - this.initialNowQueriedMs) // add ms
-            );
-            this.isNowIndicatorRendered = true;
-        }
-    };
-    // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
-    // Won't cause side effects if indicator isn't rendered.
-    View.prototype.stopNowIndicator = function () {
-        if (this.isNowIndicatorRendered) {
-            if (this.nowIndicatorTimeoutID) {
-                clearTimeout(this.nowIndicatorTimeoutID);
-                this.nowIndicatorTimeoutID = null;
-            }
-            if (this.nowIndicatorIntervalID) {
-                clearInterval(this.nowIndicatorIntervalID);
-                this.nowIndicatorIntervalID = null;
-            }
-            this.unrenderNowIndicator();
-            this.isNowIndicatorRendered = false;
-        }
-    };
-    /* Dimensions
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.updateSize = function (totalHeight, isAuto, isResize) {
-        if (this['setHeight']) {
-            this['setHeight'](totalHeight, isAuto);
-        }
-        else {
-            _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);
-        }
-        this.updateNowIndicator();
-    };
-    /* Scroller
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.addScroll = function (scroll) {
-        var queuedScroll = this.queuedScroll || (this.queuedScroll = {});
-        $.extend(queuedScroll, scroll);
-    };
-    View.prototype.popScroll = function () {
-        this.applyQueuedScroll();
-        this.queuedScroll = null;
-    };
-    View.prototype.applyQueuedScroll = function () {
-        if (this.queuedScroll) {
-            this.applyScroll(this.queuedScroll);
-        }
-    };
-    View.prototype.queryScroll = function () {
-        var scroll = {};
-        if (this.isDatesRendered) {
-            $.extend(scroll, this.queryDateScroll());
-        }
-        return scroll;
-    };
-    View.prototype.applyScroll = function (scroll) {
-        if (scroll.isDateInit && this.isDatesRendered) {
-            $.extend(scroll, this.computeInitialDateScroll());
-        }
-        if (this.isDatesRendered) {
-            this.applyDateScroll(scroll);
-        }
-    };
-    View.prototype.computeInitialDateScroll = function () {
-        return {}; // subclasses must implement
-    };
-    View.prototype.queryDateScroll = function () {
-        return {}; // subclasses must implement
-    };
-    View.prototype.applyDateScroll = function (scroll) {
-        // subclasses must implement
-    };
-    /* Event Drag-n-Drop
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.reportEventDrop = function (eventInstance, eventMutation, el, ev) {
-        var eventManager = this.calendar.eventManager;
-        var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);
-        var dateMutation = eventMutation.dateMutation;
-        // update the EventInstance, for handlers
-        if (dateMutation) {
-            eventInstance.dateProfile = dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);
-        }
-        this.triggerEventDrop(eventInstance, 
-        // a drop doesn't necessarily mean a date mutation (ex: resource change)
-        (dateMutation && dateMutation.dateDelta) || moment.duration(), undoFunc, el, ev);
-    };
-    // Triggers event-drop handlers that have subscribed via the API
-    View.prototype.triggerEventDrop = function (eventInstance, dateDelta, undoFunc, el, ev) {
-        this.publiclyTrigger('eventDrop', {
-            context: el[0],
-            args: [
-                eventInstance.toLegacy(),
-                dateDelta,
-                undoFunc,
-                ev,
-                {},
-                this
-            ]
-        });
-    };
-    /* External Element Drag-n-Drop
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Must be called when an external element, via jQuery UI, has been dropped onto the calendar.
-    // `meta` is the parsed data that has been embedded into the dragging event.
-    // `dropLocation` is an object that contains the new zoned start/end/allDay values for the event.
-    View.prototype.reportExternalDrop = function (singleEventDef, isEvent, isSticky, el, ev, ui) {
-        if (isEvent) {
-            this.calendar.eventManager.addEventDef(singleEventDef, isSticky);
-        }
-        this.triggerExternalDrop(singleEventDef, isEvent, el, ev, ui);
-    };
-    // Triggers external-drop handlers that have subscribed via the API
-    View.prototype.triggerExternalDrop = function (singleEventDef, isEvent, el, ev, ui) {
-        // trigger 'drop' regardless of whether element represents an event
-        this.publiclyTrigger('drop', {
-            context: el[0],
-            args: [
-                singleEventDef.dateProfile.start.clone(),
-                ev,
-                ui,
-                this
-            ]
-        });
-        if (isEvent) {
-            // signal an external event landed
-            this.publiclyTrigger('eventReceive', {
-                context: this,
-                args: [
-                    singleEventDef.buildInstance().toLegacy(),
-                    this
-                ]
-            });
-        }
-    };
-    /* Event Resizing
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Must be called when an event in the view has been resized to a new length
-    View.prototype.reportEventResize = function (eventInstance, eventMutation, el, ev) {
-        var eventManager = this.calendar.eventManager;
-        var undoFunc = eventManager.mutateEventsWithId(eventInstance.def.id, eventMutation);
-        // update the EventInstance, for handlers
-        eventInstance.dateProfile = eventMutation.dateMutation.buildNewDateProfile(eventInstance.dateProfile, this.calendar);
-        this.triggerEventResize(eventInstance, eventMutation.dateMutation.endDelta, undoFunc, el, ev);
-    };
-    // Triggers event-resize handlers that have subscribed via the API
-    View.prototype.triggerEventResize = function (eventInstance, durationDelta, undoFunc, el, ev) {
-        this.publiclyTrigger('eventResize', {
-            context: el[0],
-            args: [
-                eventInstance.toLegacy(),
-                durationDelta,
-                undoFunc,
-                ev,
-                {},
-                this
-            ]
-        });
-    };
-    /* Selection (time range)
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Selects a date span on the view. `start` and `end` are both Moments.
-    // `ev` is the native mouse event that begin the interaction.
-    View.prototype.select = function (footprint, ev) {
-        this.unselect(ev);
-        this.renderSelectionFootprint(footprint);
-        this.reportSelection(footprint, ev);
-    };
-    View.prototype.renderSelectionFootprint = function (footprint) {
-        if (this['renderSelection']) {
-            this['renderSelection'](footprint.toLegacy(this.calendar));
-        }
-        else {
-            _super.prototype.renderSelectionFootprint.call(this, footprint);
-        }
-    };
-    // Called when a new selection is made. Updates internal state and triggers handlers.
-    View.prototype.reportSelection = function (footprint, ev) {
-        this.isSelected = true;
-        this.triggerSelect(footprint, ev);
-    };
-    // Triggers handlers to 'select'
-    View.prototype.triggerSelect = function (footprint, ev) {
-        var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of "Event"DateProfile?
-        this.publiclyTrigger('select', {
-            context: this,
-            args: [
-                dateProfile.start,
-                dateProfile.end,
-                ev,
-                this
-            ]
-        });
-    };
-    // Undoes a selection. updates in the internal state and triggers handlers.
-    // `ev` is the native mouse event that began the interaction.
-    View.prototype.unselect = function (ev) {
-        if (this.isSelected) {
-            this.isSelected = false;
-            if (this['destroySelection']) {
-                this['destroySelection'](); // TODO: deprecate
-            }
-            this.unrenderSelection();
-            this.publiclyTrigger('unselect', {
-                context: this,
-                args: [ev, this]
-            });
-        }
-    };
-    /* Event Selection
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.selectEventInstance = function (eventInstance) {
-        if (!this.selectedEventInstance ||
-            this.selectedEventInstance !== eventInstance) {
-            this.unselectEventInstance();
-            this.getEventSegs().forEach(function (seg) {
-                if (seg.footprint.eventInstance === eventInstance &&
-                    seg.el // necessary?
-                ) {
-                    seg.el.addClass('fc-selected');
-                }
-            });
-            this.selectedEventInstance = eventInstance;
-        }
-    };
-    View.prototype.unselectEventInstance = function () {
-        if (this.selectedEventInstance) {
-            this.getEventSegs().forEach(function (seg) {
-                if (seg.el) {
-                    seg.el.removeClass('fc-selected');
-                }
-            });
-            this.selectedEventInstance = null;
-        }
-    };
-    View.prototype.isEventDefSelected = function (eventDef) {
-        // event references might change on refetchEvents(), while selectedEventInstance doesn't,
-        // so compare IDs
-        return this.selectedEventInstance && this.selectedEventInstance.def.id === eventDef.id;
-    };
-    /* Mouse / Touch Unselecting (time range & event unselection)
-    ------------------------------------------------------------------------------------------------------------------*/
-    // TODO: move consistently to down/start or up/end?
-    // TODO: don't kill previous selection if touch scrolling
-    View.prototype.handleDocumentMousedown = function (ev) {
-        if (util_1.isPrimaryMouseButton(ev)) {
-            this.processUnselect(ev);
-        }
-    };
-    View.prototype.processUnselect = function (ev) {
-        this.processRangeUnselect(ev);
-        this.processEventUnselect(ev);
-    };
-    View.prototype.processRangeUnselect = function (ev) {
-        var ignore;
-        // is there a time-range selection?
-        if (this.isSelected && this.opt('unselectAuto')) {
-            // only unselect if the clicked element is not identical to or inside of an 'unselectCancel' element
-            ignore = this.opt('unselectCancel');
-            if (!ignore || !$(ev.target).closest(ignore).length) {
-                this.unselect(ev);
-            }
-        }
-    };
-    View.prototype.processEventUnselect = function (ev) {
-        if (this.selectedEventInstance) {
-            if (!$(ev.target).closest('.fc-selected').length) {
-                this.unselectEventInstance();
-            }
-        }
-    };
-    /* Triggers
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.triggerBaseRendered = function () {
-        this.publiclyTrigger('viewRender', {
-            context: this,
-            args: [this, this.el]
-        });
-    };
-    View.prototype.triggerBaseUnrendered = function () {
-        this.publiclyTrigger('viewDestroy', {
-            context: this,
-            args: [this, this.el]
-        });
-    };
-    // Triggers handlers to 'dayClick'
-    // Span has start/end of the clicked area. Only the start is useful.
-    View.prototype.triggerDayClick = function (footprint, dayEl, ev) {
-        var dateProfile = this.calendar.footprintToDateProfile(footprint); // abuse of "Event"DateProfile?
-        this.publiclyTrigger('dayClick', {
-            context: dayEl,
-            args: [dateProfile.start, ev, this]
-        });
-    };
-    /* Date Utils
-    ------------------------------------------------------------------------------------------------------------------*/
-    // For DateComponent::getDayClasses
-    View.prototype.isDateInOtherMonth = function (date, dateProfile) {
-        return false;
-    };
-    // Arguments after name will be forwarded to a hypothetical function value
-    // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
-    // Always clone your objects if you fear mutation.
-    View.prototype.getUnzonedRangeOption = function (name) {
-        var val = this.opt(name);
-        if (typeof val === 'function') {
-            val = val.apply(null, Array.prototype.slice.call(arguments, 1));
-        }
-        if (val) {
-            return this.calendar.parseUnzonedRange(val);
-        }
-    };
-    /* Hidden Days
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Initializes internal variables related to calculating hidden days-of-week
-    View.prototype.initHiddenDays = function () {
-        var hiddenDays = this.opt('hiddenDays') || []; // array of day-of-week indices that are hidden
-        var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
-        var dayCnt = 0;
-        var i;
-        if (this.opt('weekends') === false) {
-            hiddenDays.push(0, 6); // 0=sunday, 6=saturday
-        }
-        for (i = 0; i < 7; i++) {
-            if (!(isHiddenDayHash[i] = $.inArray(i, hiddenDays) !== -1)) {
-                dayCnt++;
-            }
-        }
-        if (!dayCnt) {
-            throw new Error('invalid hiddenDays'); // all days were hidden? bad.
-        }
-        this.isHiddenDayHash = isHiddenDayHash;
-    };
-    // Remove days from the beginning and end of the range that are computed as hidden.
-    // If the whole range is trimmed off, returns null
-    View.prototype.trimHiddenDays = function (inputUnzonedRange) {
-        var start = inputUnzonedRange.getStart();
-        var end = inputUnzonedRange.getEnd();
-        if (start) {
-            start = this.skipHiddenDays(start);
-        }
-        if (end) {
-            end = this.skipHiddenDays(end, -1, true);
-        }
-        if (start === null || end === null || start < end) {
-            return new UnzonedRange_1.default(start, end);
-        }
-        return null;
-    };
-    // Is the current day hidden?
-    // `day` is a day-of-week index (0-6), or a Moment
-    View.prototype.isHiddenDay = function (day) {
-        if (moment.isMoment(day)) {
-            day = day.day();
-        }
-        return this.isHiddenDayHash[day];
-    };
-    // Incrementing the current day until it is no longer a hidden day, returning a copy.
-    // DOES NOT CONSIDER validUnzonedRange!
-    // If the initial value of `date` is not a hidden day, don't do anything.
-    // Pass `isExclusive` as `true` if you are dealing with an end date.
-    // `inc` defaults to `1` (increment one day forward each time)
-    View.prototype.skipHiddenDays = function (date, inc, isExclusive) {
-        if (inc === void 0) { inc = 1; }
-        if (isExclusive === void 0) { isExclusive = false; }
-        var out = date.clone();
-        while (this.isHiddenDayHash[(out.day() + (isExclusive ? inc : 0) + 7) % 7]) {
-            out.add(inc, 'days');
-        }
-        return out;
-    };
-    return View;
-}(InteractiveDateComponent_1.default));
-exports.default = View;
-View.prototype.usesMinMaxTime = false;
-View.prototype.dateProfileGeneratorClass = DateProfileGenerator_1.default;
-View.watch('displayingDates', ['isInDom', 'dateProfile'], function (deps) {
-    this.requestDateRender(deps.dateProfile);
-}, function () {
-    this.requestDateUnrender();
-});
-View.watch('displayingBusinessHours', ['displayingDates', 'businessHourGenerator'], function (deps) {
-    this.requestBusinessHoursRender(deps.businessHourGenerator);
-}, function () {
-    this.requestBusinessHoursUnrender();
-});
-View.watch('initialEvents', ['dateProfile'], function (deps) {
-    return this.fetchInitialEvents(deps.dateProfile);
-});
-View.watch('bindingEvents', ['initialEvents'], function (deps) {
-    this.setEvents(deps.initialEvents);
-    this.bindEventChanges();
-}, function () {
-    this.unbindEventChanges();
-    this.unsetEvents();
-});
-View.watch('displayingEvents', ['displayingDates', 'hasEvents'], function () {
-    this.requestEventsRender(this.get('currentEvents'));
-}, function () {
-    this.requestEventsUnrender();
-});
-View.watch('title', ['dateProfile'], function (deps) {
-    return (this.title = this.computeTitle(deps.dateProfile)); // assign to View for legacy reasons
-});
-View.watch('legacyDateProps', ['dateProfile'], function (deps) {
-    var calendar = this.calendar;
-    var dateProfile = deps.dateProfile;
-    // DEPRECATED, but we need to keep it updated...
-    this.start = calendar.msToMoment(dateProfile.activeUnzonedRange.startMs, dateProfile.isRangeAllDay);
-    this.end = calendar.msToMoment(dateProfile.activeUnzonedRange.endMs, dateProfile.isRangeAllDay);
-    this.intervalStart = calendar.msToMoment(dateProfile.currentUnzonedRange.startMs, dateProfile.isRangeAllDay);
-    this.intervalEnd = calendar.msToMoment(dateProfile.currentUnzonedRange.endMs, dateProfile.isRangeAllDay);
-});
-
-
-/***/ }),
-/* 42 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var EventRenderer = /** @class */ (function () {
-    function EventRenderer(component, fillRenderer) {
-        this.view = component._getView();
-        this.component = component;
-        this.fillRenderer = fillRenderer;
-    }
-    EventRenderer.prototype.opt = function (name) {
-        return this.view.opt(name);
-    };
-    // Updates values that rely on options and also relate to range
-    EventRenderer.prototype.rangeUpdated = function () {
-        var displayEventTime;
-        var displayEventEnd;
-        this.eventTimeFormat =
-            this.opt('eventTimeFormat') ||
-                this.opt('timeFormat') || // deprecated
-                this.computeEventTimeFormat();
-        displayEventTime = this.opt('displayEventTime');
-        if (displayEventTime == null) {
-            displayEventTime = this.computeDisplayEventTime(); // might be based off of range
-        }
-        displayEventEnd = this.opt('displayEventEnd');
-        if (displayEventEnd == null) {
-            displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
-        }
-        this.displayEventTime = displayEventTime;
-        this.displayEventEnd = displayEventEnd;
-    };
-    EventRenderer.prototype.render = function (eventsPayload) {
-        var dateProfile = this.component._getDateProfile();
-        var eventDefId;
-        var instanceGroup;
-        var eventRanges;
-        var bgRanges = [];
-        var fgRanges = [];
-        for (eventDefId in eventsPayload) {
-            instanceGroup = eventsPayload[eventDefId];
-            eventRanges = instanceGroup.sliceRenderRanges(dateProfile.activeUnzonedRange);
-            if (instanceGroup.getEventDef().hasBgRendering()) {
-                bgRanges.push.apply(bgRanges, eventRanges);
-            }
-            else {
-                fgRanges.push.apply(fgRanges, eventRanges);
-            }
-        }
-        this.renderBgRanges(bgRanges);
-        this.renderFgRanges(fgRanges);
-    };
-    EventRenderer.prototype.unrender = function () {
-        this.unrenderBgRanges();
-        this.unrenderFgRanges();
-    };
-    EventRenderer.prototype.renderFgRanges = function (eventRanges) {
-        var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);
-        var segs = this.component.eventFootprintsToSegs(eventFootprints);
-        // render an `.el` on each seg
-        // returns a subset of the segs. segs that were actually rendered
-        segs = this.renderFgSegEls(segs);
-        if (this.renderFgSegs(segs) !== false) {
-            this.fgSegs = segs;
-        }
-    };
-    EventRenderer.prototype.unrenderFgRanges = function () {
-        this.unrenderFgSegs(this.fgSegs || []);
-        this.fgSegs = null;
-    };
-    EventRenderer.prototype.renderBgRanges = function (eventRanges) {
-        var eventFootprints = this.component.eventRangesToEventFootprints(eventRanges);
-        var segs = this.component.eventFootprintsToSegs(eventFootprints);
-        if (this.renderBgSegs(segs) !== false) {
-            this.bgSegs = segs;
-        }
-    };
-    EventRenderer.prototype.unrenderBgRanges = function () {
-        this.unrenderBgSegs();
-        this.bgSegs = null;
-    };
-    EventRenderer.prototype.getSegs = function () {
-        return (this.bgSegs || []).concat(this.fgSegs || []);
-    };
-    // Renders foreground event segments onto the grid
-    EventRenderer.prototype.renderFgSegs = function (segs) {
-        // subclasses must implement
-        // segs already has rendered els, and has been filtered.
-        return false; // signal failure if not implemented
-    };
-    // Unrenders all currently rendered foreground segments
-    EventRenderer.prototype.unrenderFgSegs = function (segs) {
-        // subclasses must implement
-    };
-    EventRenderer.prototype.renderBgSegs = function (segs) {
-        var _this = this;
-        if (this.fillRenderer) {
-            this.fillRenderer.renderSegs('bgEvent', segs, {
-                getClasses: function (seg) {
-                    return _this.getBgClasses(seg.footprint.eventDef);
-                },
-                getCss: function (seg) {
-                    return {
-                        'background-color': _this.getBgColor(seg.footprint.eventDef)
-                    };
-                },
-                filterEl: function (seg, el) {
-                    return _this.filterEventRenderEl(seg.footprint, el);
-                }
-            });
-        }
-        else {
-            return false; // signal failure if no fillRenderer
-        }
-    };
-    EventRenderer.prototype.unrenderBgSegs = function () {
-        if (this.fillRenderer) {
-            this.fillRenderer.unrender('bgEvent');
-        }
-    };
-    // Renders and assigns an `el` property for each foreground event segment.
-    // Only returns segments that successfully rendered.
-    EventRenderer.prototype.renderFgSegEls = function (segs, disableResizing) {
-        var _this = this;
-        if (disableResizing === void 0) { disableResizing = false; }
-        var hasEventRenderHandlers = this.view.hasPublicHandlers('eventRender');
-        var html = '';
-        var renderedSegs = [];
-        var i;
-        if (segs.length) {
-            // build a large concatenation of event segment HTML
-            for (i = 0; i < segs.length; i++) {
-                this.beforeFgSegHtml(segs[i]);
-                html += this.fgSegHtml(segs[i], disableResizing);
-            }
-            // Grab individual elements from the combined HTML string. Use each as the default rendering.
-            // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
-            $(html).each(function (i, node) {
-                var seg = segs[i];
-                var el = $(node);
-                if (hasEventRenderHandlers) {
-                    el = _this.filterEventRenderEl(seg.footprint, el);
-                }
-                if (el) {
-                    el.data('fc-seg', seg); // used by handlers
-                    seg.el = el;
-                    renderedSegs.push(seg);
-                }
-            });
-        }
-        return renderedSegs;
-    };
-    EventRenderer.prototype.beforeFgSegHtml = function (seg) {
-    };
-    // Generates the HTML for the default rendering of a foreground event segment. Used by renderFgSegEls()
-    EventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {
-        // subclasses should implement
-    };
-    // Generic utility for generating the HTML classNames for an event segment's element
-    EventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable) {
-        var classes = [
-            'fc-event',
-            seg.isStart ? 'fc-start' : 'fc-not-start',
-            seg.isEnd ? 'fc-end' : 'fc-not-end'
-        ].concat(this.getClasses(seg.footprint.eventDef));
-        if (isDraggable) {
-            classes.push('fc-draggable');
-        }
-        if (isResizable) {
-            classes.push('fc-resizable');
-        }
-        // event is currently selected? attach a className.
-        if (this.view.isEventDefSelected(seg.footprint.eventDef)) {
-            classes.push('fc-selected');
-        }
-        return classes;
-    };
-    // Given an event and the default element used for rendering, returns the element that should actually be used.
-    // Basically runs events and elements through the eventRender hook.
-    EventRenderer.prototype.filterEventRenderEl = function (eventFootprint, el) {
-        var legacy = eventFootprint.getEventLegacy();
-        var custom = this.view.publiclyTrigger('eventRender', {
-            context: legacy,
-            args: [legacy, el, this.view]
-        });
-        if (custom === false) {
-            el = null;
-        }
-        else if (custom && custom !== true) {
-            el = $(custom);
-        }
-        return el;
-    };
-    // Compute the text that should be displayed on an event's element.
-    // `range` can be the Event object itself, or something range-like, with at least a `start`.
-    // If event times are disabled, or the event has no time, will return a blank string.
-    // If not specified, formatStr will default to the eventTimeFormat setting,
-    // and displayEnd will default to the displayEventEnd setting.
-    EventRenderer.prototype.getTimeText = function (eventFootprint, formatStr, displayEnd) {
-        return this._getTimeText(eventFootprint.eventInstance.dateProfile.start, eventFootprint.eventInstance.dateProfile.end, eventFootprint.componentFootprint.isAllDay, formatStr, displayEnd);
-    };
-    EventRenderer.prototype._getTimeText = function (start, end, isAllDay, formatStr, displayEnd) {
-        if (formatStr == null) {
-            formatStr = this.eventTimeFormat;
-        }
-        if (displayEnd == null) {
-            displayEnd = this.displayEventEnd;
-        }
-        if (this.displayEventTime && !isAllDay) {
-            if (displayEnd && end) {
-                return this.view.formatRange({ start: start, end: end }, false, // allDay
-                formatStr);
-            }
-            else {
-                return start.format(formatStr);
-            }
-        }
-        return '';
-    };
-    EventRenderer.prototype.computeEventTimeFormat = function () {
-        return this.opt('smallTimeFormat');
-    };
-    EventRenderer.prototype.computeDisplayEventTime = function () {
-        return true;
-    };
-    EventRenderer.prototype.computeDisplayEventEnd = function () {
-        return true;
-    };
-    EventRenderer.prototype.getBgClasses = function (eventDef) {
-        var classNames = this.getClasses(eventDef);
-        classNames.push('fc-bgevent');
-        return classNames;
-    };
-    EventRenderer.prototype.getClasses = function (eventDef) {
-        var objs = this.getStylingObjs(eventDef);
-        var i;
-        var classNames = [];
-        for (i = 0; i < objs.length; i++) {
-            classNames.push.apply(// append
-            classNames, objs[i].eventClassName || objs[i].className || []);
-        }
-        return classNames;
-    };
-    // Utility for generating event skin-related CSS properties
-    EventRenderer.prototype.getSkinCss = function (eventDef) {
-        return {
-            'background-color': this.getBgColor(eventDef),
-            'border-color': this.getBorderColor(eventDef),
-            color: this.getTextColor(eventDef)
-        };
-    };
-    // Queries for caller-specified color, then falls back to default
-    EventRenderer.prototype.getBgColor = function (eventDef) {
-        var objs = this.getStylingObjs(eventDef);
-        var i;
-        var val;
-        for (i = 0; i < objs.length && !val; i++) {
-            val = objs[i].eventBackgroundColor || objs[i].eventColor ||
-                objs[i].backgroundColor || objs[i].color;
-        }
-        if (!val) {
-            val = this.opt('eventBackgroundColor') || this.opt('eventColor');
-        }
-        return val;
-    };
-    // Queries for caller-specified color, then falls back to default
-    EventRenderer.prototype.getBorderColor = function (eventDef) {
-        var objs = this.getStylingObjs(eventDef);
-        var i;
-        var val;
-        for (i = 0; i < objs.length && !val; i++) {
-            val = objs[i].eventBorderColor || objs[i].eventColor ||
-                objs[i].borderColor || objs[i].color;
-        }
-        if (!val) {
-            val = this.opt('eventBorderColor') || this.opt('eventColor');
-        }
-        return val;
-    };
-    // Queries for caller-specified color, then falls back to default
-    EventRenderer.prototype.getTextColor = function (eventDef) {
-        var objs = this.getStylingObjs(eventDef);
-        var i;
-        var val;
-        for (i = 0; i < objs.length && !val; i++) {
-            val = objs[i].eventTextColor ||
-                objs[i].textColor;
-        }
-        if (!val) {
-            val = this.opt('eventTextColor');
-        }
-        return val;
-    };
-    EventRenderer.prototype.getStylingObjs = function (eventDef) {
-        var objs = this.getFallbackStylingObjs(eventDef);
-        objs.unshift(eventDef);
-        return objs;
-    };
-    EventRenderer.prototype.getFallbackStylingObjs = function (eventDef) {
-        return [eventDef.source];
-    };
-    EventRenderer.prototype.sortEventSegs = function (segs) {
-        segs.sort(util_1.proxy(this, 'compareEventSegs'));
-    };
-    // A cmp function for determining which segments should take visual priority
-    EventRenderer.prototype.compareEventSegs = function (seg1, seg2) {
-        var f1 = seg1.footprint;
-        var f2 = seg2.footprint;
-        var cf1 = f1.componentFootprint;
-        var cf2 = f2.componentFootprint;
-        var r1 = cf1.unzonedRange;
-        var r2 = cf2.unzonedRange;
-        return r1.startMs - r2.startMs || // earlier events go first
-            (r2.endMs - r2.startMs) - (r1.endMs - r1.startMs) || // tie? longer events go first
-            cf2.isAllDay - cf1.isAllDay || // tie? put all-day events first (booleans cast to 0/1)
-            util_1.compareByFieldSpecs(f1.eventDef, f2.eventDef, this.view.eventOrderSpecs, f1.eventDef.miscProps, f2.eventDef.miscProps);
-    };
-    return EventRenderer;
-}());
-exports.default = EventRenderer;
-
-
-/***/ }),
-/* 43 */,
-/* 44 */,
-/* 45 */,
-/* 46 */,
-/* 47 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment_ext_1 = __webpack_require__(10);
-// Plugin
-// -------------------------------------------------------------------------------------------------
-moment_ext_1.newMomentProto.format = function () {
-    if (this._fullCalendar && arguments[0]) {
-        return formatDate(this, arguments[0]); // our extended formatting
-    }
-    if (this._ambigTime) {
-        return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');
-    }
-    if (this._ambigZone) {
-        return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');
-    }
-    if (this._fullCalendar) {
-        // moment.format() doesn't ensure english, but we want to.
-        return moment_ext_1.oldMomentFormat(englishMoment(this));
-    }
-    return moment_ext_1.oldMomentProto.format.apply(this, arguments);
-};
-moment_ext_1.newMomentProto.toISOString = function () {
-    if (this._ambigTime) {
-        return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD');
-    }
-    if (this._ambigZone) {
-        return moment_ext_1.oldMomentFormat(englishMoment(this), 'YYYY-MM-DD[T]HH:mm:ss');
-    }
-    if (this._fullCalendar) {
-        // depending on browser, moment might not output english. ensure english.
-        // https://github.com/moment/moment/blob/2.18.1/src/lib/moment/format.js#L22
-        return moment_ext_1.oldMomentProto.toISOString.apply(englishMoment(this), arguments);
-    }
-    return moment_ext_1.oldMomentProto.toISOString.apply(this, arguments);
-};
-function englishMoment(mom) {
-    if (mom.locale() !== 'en') {
-        return mom.clone().locale('en');
-    }
-    return mom;
-}
-// Config
-// ---------------------------------------------------------------------------------------------------------------------
-/*
-Inserted between chunks in the fake ("intermediate") formatting string.
-Important that it passes as whitespace (\s) because moment often identifies non-standalone months
-via a regexp with an \s.
-*/
-var PART_SEPARATOR = '\u000b'; // vertical tab
-/*
-Inserted as the first character of a literal-text chunk to indicate that the literal text is not actually literal text,
-but rather, a "special" token that has custom rendering (see specialTokens map).
-*/
-var SPECIAL_TOKEN_MARKER = '\u001f'; // information separator 1
-/*
-Inserted at the beginning and end of a span of text that must have non-zero numeric characters.
-Handling of these markers is done in a post-processing step at the very end of text rendering.
-*/
-var MAYBE_MARKER = '\u001e'; // information separator 2
-var MAYBE_REGEXP = new RegExp(MAYBE_MARKER + '([^' + MAYBE_MARKER + ']*)' + MAYBE_MARKER, 'g'); // must be global
-/*
-Addition formatting tokens we want recognized
-*/
-var specialTokens = {
-    t: function (date) {
-        return moment_ext_1.oldMomentFormat(date, 'a').charAt(0);
-    },
-    T: function (date) {
-        return moment_ext_1.oldMomentFormat(date, 'A').charAt(0);
-    }
-};
-/*
-The first characters of formatting tokens for units that are 1 day or larger.
-`value` is for ranking relative size (lower means bigger).
-`unit` is a normalized unit, used for comparing moments.
-*/
-var largeTokenMap = {
-    Y: { value: 1, unit: 'year' },
-    M: { value: 2, unit: 'month' },
-    W: { value: 3, unit: 'week' },
-    w: { value: 3, unit: 'week' },
-    D: { value: 4, unit: 'day' },
-    d: { value: 4, unit: 'day' } // day of week
-};
-// Single Date Formatting
-// ---------------------------------------------------------------------------------------------------------------------
-/*
-Formats `date` with a Moment formatting string, but allow our non-zero areas and special token
-*/
-function formatDate(date, formatStr) {
-    return renderFakeFormatString(getParsedFormatString(formatStr).fakeFormatString, date);
-}
-exports.formatDate = formatDate;
-// Date Range Formatting
-// -------------------------------------------------------------------------------------------------
-// TODO: make it work with timezone offset
-/*
-Using a formatting string meant for a single date, generate a range string, like
-"Sep 2 - 9 2013", that intelligently inserts a separator where the dates differ.
-If the dates are the same as far as the format string is concerned, just return a single
-rendering of one date, without any separator.
-*/
-function formatRange(date1, date2, formatStr, separator, isRTL) {
-    var localeData;
-    date1 = moment_ext_1.default.parseZone(date1);
-    date2 = moment_ext_1.default.parseZone(date2);
-    localeData = date1.localeData();
-    // Expand localized format strings, like "LL" -> "MMMM D YYYY".
-    // BTW, this is not important for `formatDate` because it is impossible to put custom tokens
-    // or non-zero areas in Moment's localized format strings.
-    formatStr = localeData.longDateFormat(formatStr) || formatStr;
-    return renderParsedFormat(getParsedFormatString(formatStr), date1, date2, separator || ' - ', isRTL);
-}
-exports.formatRange = formatRange;
-/*
-Renders a range with an already-parsed format string.
-*/
-function renderParsedFormat(parsedFormat, date1, date2, separator, isRTL) {
-    var sameUnits = parsedFormat.sameUnits;
-    var unzonedDate1 = date1.clone().stripZone(); // for same-unit comparisons
-    var unzonedDate2 = date2.clone().stripZone(); // "
-    var renderedParts1 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date1);
-    var renderedParts2 = renderFakeFormatStringParts(parsedFormat.fakeFormatString, date2);
-    var leftI;
-    var leftStr = '';
-    var rightI;
-    var rightStr = '';
-    var middleI;
-    var middleStr1 = '';
-    var middleStr2 = '';
-    var middleStr = '';
-    // Start at the leftmost side of the formatting string and continue until you hit a token
-    // that is not the same between dates.
-    for (leftI = 0; leftI < sameUnits.length && (!sameUnits[leftI] || unzonedDate1.isSame(unzonedDate2, sameUnits[leftI])); leftI++) {
-        leftStr += renderedParts1[leftI];
-    }
-    // Similarly, start at the rightmost side of the formatting string and move left
-    for (rightI = sameUnits.length - 1; rightI > leftI && (!sameUnits[rightI] || unzonedDate1.isSame(unzonedDate2, sameUnits[rightI])); rightI--) {
-        // If current chunk is on the boundary of unique date-content, and is a special-case
-        // date-formatting postfix character, then don't consume it. Consider it unique date-content.
-        // TODO: make configurable
-        if (rightI - 1 === leftI && renderedParts1[rightI] === '.') {
-            break;
-        }
-        rightStr = renderedParts1[rightI] + rightStr;
-    }
-    // The area in the middle is different for both of the dates.
-    // Collect them distinctly so we can jam them together later.
-    for (middleI = leftI; middleI <= rightI; middleI++) {
-        middleStr1 += renderedParts1[middleI];
-        middleStr2 += renderedParts2[middleI];
-    }
-    if (middleStr1 || middleStr2) {
-        if (isRTL) {
-            middleStr = middleStr2 + separator + middleStr1;
-        }
-        else {
-            middleStr = middleStr1 + separator + middleStr2;
-        }
-    }
-    return processMaybeMarkers(leftStr + middleStr + rightStr);
-}
-// Format String Parsing
-// ---------------------------------------------------------------------------------------------------------------------
-var parsedFormatStrCache = {};
-/*
-Returns a parsed format string, leveraging a cache.
-*/
-function getParsedFormatString(formatStr) {
-    return parsedFormatStrCache[formatStr] ||
-        (parsedFormatStrCache[formatStr] = parseFormatString(formatStr));
-}
-/*
-Parses a format string into the following:
-- fakeFormatString: a momentJS formatting string, littered with special control characters that get post-processed.
-- sameUnits: for every part in fakeFormatString, if the part is a token, the value will be a unit string (like "day"),
-  that indicates how similar a range's start & end must be in order to share the same formatted text.
-  If not a token, then the value is null.
-  Always a flat array (not nested liked "chunks").
-*/
-function parseFormatString(formatStr) {
-    var chunks = chunkFormatString(formatStr);
-    return {
-        fakeFormatString: buildFakeFormatString(chunks),
-        sameUnits: buildSameUnits(chunks)
-    };
-}
-/*
-Break the formatting string into an array of chunks.
-A 'maybe' chunk will have nested chunks.
-*/
-function chunkFormatString(formatStr) {
-    var chunks = [];
-    var match;
-    // TODO: more descrimination
-    // \4 is a backreference to the first character of a multi-character set.
-    var chunker = /\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;
-    while ((match = chunker.exec(formatStr))) {
-        if (match[1]) {
-            chunks.push.apply(chunks, // append
-            splitStringLiteral(match[1]));
-        }
-        else if (match[2]) {
-            chunks.push({ maybe: chunkFormatString(match[2]) });
-        }
-        else if (match[3]) {
-            chunks.push({ token: match[3] });
-        }
-        else if (match[5]) {
-            chunks.push.apply(chunks, // append
-            splitStringLiteral(match[5]));
-        }
-    }
-    return chunks;
-}
-/*
-Potentially splits a literal-text string into multiple parts. For special cases.
-*/
-function splitStringLiteral(s) {
-    if (s === '. ') {
-        return ['.', ' ']; // for locales with periods bound to the end of each year/month/date
-    }
-    else {
-        return [s];
-    }
-}
-/*
-Given chunks parsed from a real format string, generate a fake (aka "intermediate") format string with special control
-characters that will eventually be given to moment for formatting, and then post-processed.
-*/
-function buildFakeFormatString(chunks) {
-    var parts = [];
-    var i;
-    var chunk;
-    for (i = 0; i < chunks.length; i++) {
-        chunk = chunks[i];
-        if (typeof chunk === 'string') {
-            parts.push('[' + chunk + ']');
-        }
-        else if (chunk.token) {
-            if (chunk.token in specialTokens) {
-                parts.push(SPECIAL_TOKEN_MARKER + // useful during post-processing
-                    '[' + chunk.token + ']' // preserve as literal text
-                );
-            }
-            else {
-                parts.push(chunk.token); // unprotected text implies a format string
-            }
-        }
-        else if (chunk.maybe) {
-            parts.push(MAYBE_MARKER + // useful during post-processing
-                buildFakeFormatString(chunk.maybe) +
-                MAYBE_MARKER);
-        }
-    }
-    return parts.join(PART_SEPARATOR);
-}
-/*
-Given parsed chunks from a real formatting string, generates an array of unit strings (like "day") that indicate
-in which regard two dates must be similar in order to share range formatting text.
-The `chunks` can be nested (because of "maybe" chunks), however, the returned array will be flat.
-*/
-function buildSameUnits(chunks) {
-    var units = [];
-    var i;
-    var chunk;
-    var tokenInfo;
-    for (i = 0; i < chunks.length; i++) {
-        chunk = chunks[i];
-        if (chunk.token) {
-            tokenInfo = largeTokenMap[chunk.token.charAt(0)];
-            units.push(tokenInfo ? tokenInfo.unit : 'second'); // default to a very strict same-second
-        }
-        else if (chunk.maybe) {
-            units.push.apply(units, // append
-            buildSameUnits(chunk.maybe));
-        }
-        else {
-            units.push(null);
-        }
-    }
-    return units;
-}
-// Rendering to text
-// ---------------------------------------------------------------------------------------------------------------------
-/*
-Formats a date with a fake format string, post-processes the control characters, then returns.
-*/
-function renderFakeFormatString(fakeFormatString, date) {
-    return processMaybeMarkers(renderFakeFormatStringParts(fakeFormatString, date).join(''));
-}
-/*
-Formats a date into parts that will have been post-processed, EXCEPT for the "maybe" markers.
-*/
-function renderFakeFormatStringParts(fakeFormatString, date) {
-    var parts = [];
-    var fakeRender = moment_ext_1.oldMomentFormat(date, fakeFormatString);
-    var fakeParts = fakeRender.split(PART_SEPARATOR);
-    var i;
-    var fakePart;
-    for (i = 0; i < fakeParts.length; i++) {
-        fakePart = fakeParts[i];
-        if (fakePart.charAt(0) === SPECIAL_TOKEN_MARKER) {
-            parts.push(
-            // the literal string IS the token's name.
-            // call special token's registered function.
-            specialTokens[fakePart.substring(1)](date));
-        }
-        else {
-            parts.push(fakePart);
-        }
-    }
-    return parts;
-}
-/*
-Accepts an almost-finally-formatted string and processes the "maybe" control characters, returning a new string.
-*/
-function processMaybeMarkers(s) {
-    return s.replace(MAYBE_REGEXP, function (m0, m1) {
-        if (m1.match(/[1-9]/)) {
-            return m1;
-        }
-        else {
-            return '';
-        }
-    });
-}
-// Misc Utils
-// -------------------------------------------------------------------------------------------------
-/*
-Returns a unit string, either 'year', 'month', 'day', or null for the most granular formatting token in the string.
-*/
-function queryMostGranularFormatUnit(formatStr) {
-    var chunks = chunkFormatString(formatStr);
-    var i;
-    var chunk;
-    var candidate;
-    var best;
-    for (i = 0; i < chunks.length; i++) {
-        chunk = chunks[i];
-        if (chunk.token) {
-            candidate = largeTokenMap[chunk.token.charAt(0)];
-            if (candidate) {
-                if (!best || candidate.value > best.value) {
-                    best = candidate;
-                }
-            }
-        }
-    }
-    if (best) {
-        return best.unit;
-    }
-    return null;
-}
-exports.queryMostGranularFormatUnit = queryMostGranularFormatUnit;
-
-
-/***/ }),
-/* 48 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Class_1 = __webpack_require__(33);
-var EmitterMixin_1 = __webpack_require__(11);
-var ListenerMixin_1 = __webpack_require__(7);
-var Model = /** @class */ (function (_super) {
-    tslib_1.__extends(Model, _super);
-    function Model() {
-        var _this = _super.call(this) || this;
-        _this._watchers = {};
-        _this._props = {};
-        _this.applyGlobalWatchers();
-        _this.constructed();
-        return _this;
-    }
-    Model.watch = function (name) {
-        var args = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            args[_i - 1] = arguments[_i];
-        }
-        // subclasses should make a masked-copy of the superclass's map
-        // TODO: write test
-        if (!this.prototype.hasOwnProperty('_globalWatchArgs')) {
-            this.prototype._globalWatchArgs = Object.create(this.prototype._globalWatchArgs);
-        }
-        this.prototype._globalWatchArgs[name] = args;
-    };
-    Model.prototype.constructed = function () {
-        // useful for monkeypatching. TODO: BaseClass?
-    };
-    Model.prototype.applyGlobalWatchers = function () {
-        var map = this._globalWatchArgs;
-        var name;
-        for (name in map) {
-            this.watch.apply(this, [name].concat(map[name]));
-        }
-    };
-    Model.prototype.has = function (name) {
-        return name in this._props;
-    };
-    Model.prototype.get = function (name) {
-        if (name === undefined) {
-            return this._props;
-        }
-        return this._props[name];
-    };
-    Model.prototype.set = function (name, val) {
-        var newProps;
-        if (typeof name === 'string') {
-            newProps = {};
-            newProps[name] = val === undefined ? null : val;
-        }
-        else {
-            newProps = name;
-        }
-        this.setProps(newProps);
-    };
-    Model.prototype.reset = function (newProps) {
-        var oldProps = this._props;
-        var changeset = {}; // will have undefined's to signal unsets
-        var name;
-        for (name in oldProps) {
-            changeset[name] = undefined;
-        }
-        for (name in newProps) {
-            changeset[name] = newProps[name];
-        }
-        this.setProps(changeset);
-    };
-    Model.prototype.unset = function (name) {
-        var newProps = {};
-        var names;
-        var i;
-        if (typeof name === 'string') {
-            names = [name];
-        }
-        else {
-            names = name;
-        }
-        for (i = 0; i < names.length; i++) {
-            newProps[names[i]] = undefined;
-        }
-        this.setProps(newProps);
-    };
-    Model.prototype.setProps = function (newProps) {
-        var changedProps = {};
-        var changedCnt = 0;
-        var name;
-        var val;
-        for (name in newProps) {
-            val = newProps[name];
-            // a change in value?
-            // if an object, don't check equality, because might have been mutated internally.
-            // TODO: eventually enforce immutability.
-            if (typeof val === 'object' ||
-                val !== this._props[name]) {
-                changedProps[name] = val;
-                changedCnt++;
-            }
-        }
-        if (changedCnt) {
-            this.trigger('before:batchChange', changedProps);
-            for (name in changedProps) {
-                val = changedProps[name];
-                this.trigger('before:change', name, val);
-                this.trigger('before:change:' + name, val);
-            }
-            for (name in changedProps) {
-                val = changedProps[name];
-                if (val === undefined) {
-                    delete this._props[name];
-                }
-                else {
-                    this._props[name] = val;
-                }
-                this.trigger('change:' + name, val);
-                this.trigger('change', name, val);
-            }
-            this.trigger('batchChange', changedProps);
-        }
-    };
-    Model.prototype.watch = function (name, depList, startFunc, stopFunc) {
-        var _this = this;
-        this.unwatch(name);
-        this._watchers[name] = this._watchDeps(depList, function (deps) {
-            var res = startFunc.call(_this, deps);
-            if (res && res.then) {
-                _this.unset(name); // put in an unset state while resolving
-                res.then(function (val) {
-                    _this.set(name, val);
-                });
-            }
-            else {
-                _this.set(name, res);
-            }
-        }, function (deps) {
-            _this.unset(name);
-            if (stopFunc) {
-                stopFunc.call(_this, deps);
-            }
-        });
-    };
-    Model.prototype.unwatch = function (name) {
-        var watcher = this._watchers[name];
-        if (watcher) {
-            delete this._watchers[name];
-            watcher.teardown();
-        }
-    };
-    Model.prototype._watchDeps = function (depList, startFunc, stopFunc) {
-        var _this = this;
-        var queuedChangeCnt = 0;
-        var depCnt = depList.length;
-        var satisfyCnt = 0;
-        var values = {}; // what's passed as the `deps` arguments
-        var bindTuples = []; // array of [ eventName, handlerFunc ] arrays
-        var isCallingStop = false;
-        var onBeforeDepChange = function (depName, val, isOptional) {
-            queuedChangeCnt++;
-            if (queuedChangeCnt === 1) {
-                if (satisfyCnt === depCnt) {
-                    isCallingStop = true;
-                    stopFunc(values);
-                    isCallingStop = false;
-                }
-            }
-        };
-        var onDepChange = function (depName, val, isOptional) {
-            if (val === undefined) {
-                // required dependency that was previously set?
-                if (!isOptional && values[depName] !== undefined) {
-                    satisfyCnt--;
-                }
-                delete values[depName];
-            }
-            else {
-                // required dependency that was previously unset?
-                if (!isOptional && values[depName] === undefined) {
-                    satisfyCnt++;
-                }
-                values[depName] = val;
-            }
-            queuedChangeCnt--;
-            if (!queuedChangeCnt) {
-                // now finally satisfied or satisfied all along?
-                if (satisfyCnt === depCnt) {
-                    // if the stopFunc initiated another value change, ignore it.
-                    // it will be processed by another change event anyway.
-                    if (!isCallingStop) {
-                        startFunc(values);
-                    }
-                }
-            }
-        };
-        // intercept for .on() that remembers handlers
-        var bind = function (eventName, handler) {
-            _this.on(eventName, handler);
-            bindTuples.push([eventName, handler]);
-        };
-        // listen to dependency changes
-        depList.forEach(function (depName) {
-            var isOptional = false;
-            if (depName.charAt(0) === '?') {
-                depName = depName.substring(1);
-                isOptional = true;
-            }
-            bind('before:change:' + depName, function (val) {
-                onBeforeDepChange(depName, val, isOptional);
-            });
-            bind('change:' + depName, function (val) {
-                onDepChange(depName, val, isOptional);
-            });
-        });
-        // process current dependency values
-        depList.forEach(function (depName) {
-            var isOptional = false;
-            if (depName.charAt(0) === '?') {
-                depName = depName.substring(1);
-                isOptional = true;
-            }
-            if (_this.has(depName)) {
-                values[depName] = _this.get(depName);
-                satisfyCnt++;
-            }
-            else if (isOptional) {
-                satisfyCnt++;
-            }
-        });
-        // initially satisfied
-        if (satisfyCnt === depCnt) {
-            startFunc(values);
-        }
-        return {
-            teardown: function () {
-                // remove all handlers
-                for (var i = 0; i < bindTuples.length; i++) {
-                    _this.off(bindTuples[i][0], bindTuples[i][1]);
-                }
-                bindTuples = null;
-                // was satisfied, so call stopFunc
-                if (satisfyCnt === depCnt) {
-                    stopFunc();
-                }
-            },
-            flash: function () {
-                if (satisfyCnt === depCnt) {
-                    stopFunc();
-                    startFunc(values);
-                }
-            }
-        };
-    };
-    Model.prototype.flash = function (name) {
-        var watcher = this._watchers[name];
-        if (watcher) {
-            watcher.flash();
-        }
-    };
-    return Model;
-}(Class_1.default));
-exports.default = Model;
-Model.prototype._globalWatchArgs = {}; // mutation protection in Model.watch
-EmitterMixin_1.default.mixInto(Model);
-ListenerMixin_1.default.mixInto(Model);
-
-
-/***/ }),
-/* 49 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var SingleEventDef_1 = __webpack_require__(13);
-var RecurringEventDef_1 = __webpack_require__(210);
-exports.default = {
-    parse: function (eventInput, source) {
-        if (util_1.isTimeString(eventInput.start) || moment.isDuration(eventInput.start) ||
-            util_1.isTimeString(eventInput.end) || moment.isDuration(eventInput.end)) {
-            return RecurringEventDef_1.default.parse(eventInput, source);
-        }
-        else {
-            return SingleEventDef_1.default.parse(eventInput, source);
-        }
-    }
-};
-
-
-/***/ }),
-/* 50 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var util_1 = __webpack_require__(4);
-var EventDateProfile_1 = __webpack_require__(17);
-var EventDefDateMutation = /** @class */ (function () {
-    function EventDefDateMutation() {
-        this.clearEnd = false;
-        this.forceTimed = false;
-        this.forceAllDay = false;
-    }
-    EventDefDateMutation.createFromDiff = function (dateProfile0, dateProfile1, largeUnit) {
-        var clearEnd = dateProfile0.end && !dateProfile1.end;
-        var forceTimed = dateProfile0.isAllDay() && !dateProfile1.isAllDay();
-        var forceAllDay = !dateProfile0.isAllDay() && dateProfile1.isAllDay();
-        var dateDelta;
-        var endDiff;
-        var endDelta;
-        var mutation;
-        // subtracts the dates in the appropriate way, returning a duration
-        function subtractDates(date1, date0) {
-            if (largeUnit) {
-                return util_1.diffByUnit(date1, date0, largeUnit); // poorly named
-            }
-            else if (dateProfile1.isAllDay()) {
-                return util_1.diffDay(date1, date0); // poorly named
-            }
-            else {
-                return util_1.diffDayTime(date1, date0); // poorly named
-            }
-        }
-        dateDelta = subtractDates(dateProfile1.start, dateProfile0.start);
-        if (dateProfile1.end) {
-            // use unzonedRanges because dateProfile0.end might be null
-            endDiff = subtractDates(dateProfile1.unzonedRange.getEnd(), dateProfile0.unzonedRange.getEnd());
-            endDelta = endDiff.subtract(dateDelta);
-        }
-        mutation = new EventDefDateMutation();
-        mutation.clearEnd = clearEnd;
-        mutation.forceTimed = forceTimed;
-        mutation.forceAllDay = forceAllDay;
-        mutation.setDateDelta(dateDelta);
-        mutation.setEndDelta(endDelta);
-        return mutation;
-    };
-    /*
-    returns an undo function.
-    */
-    EventDefDateMutation.prototype.buildNewDateProfile = function (eventDateProfile, calendar) {
-        var start = eventDateProfile.start.clone();
-        var end = null;
-        var shouldRezone = false;
-        if (eventDateProfile.end && !this.clearEnd) {
-            end = eventDateProfile.end.clone();
-        }
-        else if (this.endDelta && !end) {
-            end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);
-        }
-        if (this.forceTimed) {
-            shouldRezone = true;
-            if (!start.hasTime()) {
-                start.time(0);
-            }
-            if (end && !end.hasTime()) {
-                end.time(0);
-            }
-        }
-        else if (this.forceAllDay) {
-            if (start.hasTime()) {
-                start.stripTime();
-            }
-            if (end && end.hasTime()) {
-                end.stripTime();
-            }
-        }
-        if (this.dateDelta) {
-            shouldRezone = true;
-            start.add(this.dateDelta);
-            if (end) {
-                end.add(this.dateDelta);
-            }
-        }
-        // do this before adding startDelta to start, so we can work off of start
-        if (this.endDelta) {
-            shouldRezone = true;
-            end.add(this.endDelta);
-        }
-        if (this.startDelta) {
-            shouldRezone = true;
-            start.add(this.startDelta);
-        }
-        if (shouldRezone) {
-            start = calendar.applyTimezone(start);
-            if (end) {
-                end = calendar.applyTimezone(end);
-            }
-        }
-        // TODO: okay to access calendar option?
-        if (!end && calendar.opt('forceEventDuration')) {
-            end = calendar.getDefaultEventEnd(eventDateProfile.isAllDay(), start);
-        }
-        return new EventDateProfile_1.default(start, end, calendar);
-    };
-    EventDefDateMutation.prototype.setDateDelta = function (dateDelta) {
-        if (dateDelta && dateDelta.valueOf()) {
-            this.dateDelta = dateDelta;
-        }
-        else {
-            this.dateDelta = null;
-        }
-    };
-    EventDefDateMutation.prototype.setStartDelta = function (startDelta) {
-        if (startDelta && startDelta.valueOf()) {
-            this.startDelta = startDelta;
-        }
-        else {
-            this.startDelta = null;
-        }
-    };
-    EventDefDateMutation.prototype.setEndDelta = function (endDelta) {
-        if (endDelta && endDelta.valueOf()) {
-            this.endDelta = endDelta;
-        }
-        else {
-            this.endDelta = null;
-        }
-    };
-    EventDefDateMutation.prototype.isEmpty = function () {
-        return !this.clearEnd && !this.forceTimed && !this.forceAllDay &&
-            !this.dateDelta && !this.startDelta && !this.endDelta;
-    };
-    return EventDefDateMutation;
-}());
-exports.default = EventDefDateMutation;
-
-
-/***/ }),
-/* 51 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var StandardTheme_1 = __webpack_require__(213);
-var JqueryUiTheme_1 = __webpack_require__(214);
-var themeClassHash = {};
-function defineThemeSystem(themeName, themeClass) {
-    themeClassHash[themeName] = themeClass;
-}
-exports.defineThemeSystem = defineThemeSystem;
-function getThemeSystemClass(themeSetting) {
-    if (!themeSetting) {
-        return StandardTheme_1.default;
-    }
-    else if (themeSetting === true) {
-        return JqueryUiTheme_1.default;
-    }
-    else {
-        return themeClassHash[themeSetting];
-    }
-}
-exports.getThemeSystemClass = getThemeSystemClass;
-
-
-/***/ }),
-/* 52 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var Promise_1 = __webpack_require__(20);
-var EventSource_1 = __webpack_require__(6);
-var SingleEventDef_1 = __webpack_require__(13);
-var ArrayEventSource = /** @class */ (function (_super) {
-    tslib_1.__extends(ArrayEventSource, _super);
-    function ArrayEventSource(calendar) {
-        var _this = _super.call(this, calendar) || this;
-        _this.eventDefs = []; // for if setRawEventDefs is never called
-        return _this;
-    }
-    ArrayEventSource.parse = function (rawInput, calendar) {
-        var rawProps;
-        // normalize raw input
-        if ($.isArray(rawInput.events)) {
-            rawProps = rawInput;
-        }
-        else if ($.isArray(rawInput)) {
-            rawProps = { events: rawInput };
-        }
-        if (rawProps) {
-            return EventSource_1.default.parse.call(this, rawProps, calendar);
-        }
-        return false;
-    };
-    ArrayEventSource.prototype.setRawEventDefs = function (rawEventDefs) {
-        this.rawEventDefs = rawEventDefs;
-        this.eventDefs = this.parseEventDefs(rawEventDefs);
-    };
-    ArrayEventSource.prototype.fetch = function (start, end, timezone) {
-        var eventDefs = this.eventDefs;
-        var i;
-        if (this.currentTimezone != null &&
-            this.currentTimezone !== timezone) {
-            for (i = 0; i < eventDefs.length; i++) {
-                if (eventDefs[i] instanceof SingleEventDef_1.default) {
-                    eventDefs[i].rezone();
-                }
-            }
-        }
-        this.currentTimezone = timezone;
-        return Promise_1.default.resolve(eventDefs);
-    };
-    ArrayEventSource.prototype.addEventDef = function (eventDef) {
-        this.eventDefs.push(eventDef);
-    };
-    /*
-    eventDefId already normalized to a string
-    */
-    ArrayEventSource.prototype.removeEventDefsById = function (eventDefId) {
-        return util_1.removeMatching(this.eventDefs, function (eventDef) {
-            return eventDef.id === eventDefId;
-        });
-    };
-    ArrayEventSource.prototype.removeAllEventDefs = function () {
-        this.eventDefs = [];
-    };
-    ArrayEventSource.prototype.getPrimitive = function () {
-        return this.rawEventDefs;
-    };
-    ArrayEventSource.prototype.applyManualStandardProps = function (rawProps) {
-        var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);
-        this.setRawEventDefs(rawProps.events);
-        return superSuccess;
-    };
-    return ArrayEventSource;
-}(EventSource_1.default));
-exports.default = ArrayEventSource;
-ArrayEventSource.defineStandardProps({
-    events: false // don't automatically transfer
-});
-
-
-/***/ }),
-/* 53 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-/*
-A cache for the left/right/top/bottom/width/height values for one or more elements.
-Works with both offset (from topleft document) and position (from offsetParent).
-
-options:
-- els
-- isHorizontal
-- isVertical
-*/
-var CoordCache = /** @class */ (function () {
-    function CoordCache(options) {
-        this.isHorizontal = false; // whether to query for left/right/width
-        this.isVertical = false; // whether to query for top/bottom/height
-        this.els = $(options.els);
-        this.isHorizontal = options.isHorizontal;
-        this.isVertical = options.isVertical;
-        this.forcedOffsetParentEl = options.offsetParent ? $(options.offsetParent) : null;
-    }
-    // Queries the els for coordinates and stores them.
-    // Call this method before using and of the get* methods below.
-    CoordCache.prototype.build = function () {
-        var offsetParentEl = this.forcedOffsetParentEl;
-        if (!offsetParentEl && this.els.length > 0) {
-            offsetParentEl = this.els.eq(0).offsetParent();
-        }
-        this.origin = offsetParentEl ?
-            offsetParentEl.offset() :
-            null;
-        this.boundingRect = this.queryBoundingRect();
-        if (this.isHorizontal) {
-            this.buildElHorizontals();
-        }
-        if (this.isVertical) {
-            this.buildElVerticals();
-        }
-    };
-    // Destroys all internal data about coordinates, freeing memory
-    CoordCache.prototype.clear = function () {
-        this.origin = null;
-        this.boundingRect = null;
-        this.lefts = null;
-        this.rights = null;
-        this.tops = null;
-        this.bottoms = null;
-    };
-    // When called, if coord caches aren't built, builds them
-    CoordCache.prototype.ensureBuilt = function () {
-        if (!this.origin) {
-            this.build();
-        }
-    };
-    // Populates the left/right internal coordinate arrays
-    CoordCache.prototype.buildElHorizontals = function () {
-        var lefts = [];
-        var rights = [];
-        this.els.each(function (i, node) {
-            var el = $(node);
-            var left = el.offset().left;
-            var width = el.outerWidth();
-            lefts.push(left);
-            rights.push(left + width);
-        });
-        this.lefts = lefts;
-        this.rights = rights;
-    };
-    // Populates the top/bottom internal coordinate arrays
-    CoordCache.prototype.buildElVerticals = function () {
-        var tops = [];
-        var bottoms = [];
-        this.els.each(function (i, node) {
-            var el = $(node);
-            var top = el.offset().top;
-            var height = el.outerHeight();
-            tops.push(top);
-            bottoms.push(top + height);
-        });
-        this.tops = tops;
-        this.bottoms = bottoms;
-    };
-    // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
-    // If no intersection is made, returns undefined.
-    CoordCache.prototype.getHorizontalIndex = function (leftOffset) {
-        this.ensureBuilt();
-        var lefts = this.lefts;
-        var rights = this.rights;
-        var len = lefts.length;
-        var i;
-        for (i = 0; i < len; i++) {
-            if (leftOffset >= lefts[i] && leftOffset < rights[i]) {
-                return i;
-            }
-        }
-    };
-    // Given a top offset (from document top), returns the index of the el that it vertically intersects.
-    // If no intersection is made, returns undefined.
-    CoordCache.prototype.getVerticalIndex = function (topOffset) {
-        this.ensureBuilt();
-        var tops = this.tops;
-        var bottoms = this.bottoms;
-        var len = tops.length;
-        var i;
-        for (i = 0; i < len; i++) {
-            if (topOffset >= tops[i] && topOffset < bottoms[i]) {
-                return i;
-            }
-        }
-    };
-    // Gets the left offset (from document left) of the element at the given index
-    CoordCache.prototype.getLeftOffset = function (leftIndex) {
-        this.ensureBuilt();
-        return this.lefts[leftIndex];
-    };
-    // Gets the left position (from offsetParent left) of the element at the given index
-    CoordCache.prototype.getLeftPosition = function (leftIndex) {
-        this.ensureBuilt();
-        return this.lefts[leftIndex] - this.origin.left;
-    };
-    // Gets the right offset (from document left) of the element at the given index.
-    // This value is NOT relative to the document's right edge, like the CSS concept of "right" would be.
-    CoordCache.prototype.getRightOffset = function (leftIndex) {
-        this.ensureBuilt();
-        return this.rights[leftIndex];
-    };
-    // Gets the right position (from offsetParent left) of the element at the given index.
-    // This value is NOT relative to the offsetParent's right edge, like the CSS concept of "right" would be.
-    CoordCache.prototype.getRightPosition = function (leftIndex) {
-        this.ensureBuilt();
-        return this.rights[leftIndex] - this.origin.left;
-    };
-    // Gets the width of the element at the given index
-    CoordCache.prototype.getWidth = function (leftIndex) {
-        this.ensureBuilt();
-        return this.rights[leftIndex] - this.lefts[leftIndex];
-    };
-    // Gets the top offset (from document top) of the element at the given index
-    CoordCache.prototype.getTopOffset = function (topIndex) {
-        this.ensureBuilt();
-        return this.tops[topIndex];
-    };
-    // Gets the top position (from offsetParent top) of the element at the given position
-    CoordCache.prototype.getTopPosition = function (topIndex) {
-        this.ensureBuilt();
-        return this.tops[topIndex] - this.origin.top;
-    };
-    // Gets the bottom offset (from the document top) of the element at the given index.
-    // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of "bottom" would be.
-    CoordCache.prototype.getBottomOffset = function (topIndex) {
-        this.ensureBuilt();
-        return this.bottoms[topIndex];
-    };
-    // Gets the bottom position (from the offsetParent top) of the element at the given index.
-    // This value is NOT relative to the offsetParent's bottom edge, like the CSS concept of "bottom" would be.
-    CoordCache.prototype.getBottomPosition = function (topIndex) {
-        this.ensureBuilt();
-        return this.bottoms[topIndex] - this.origin.top;
-    };
-    // Gets the height of the element at the given index
-    CoordCache.prototype.getHeight = function (topIndex) {
-        this.ensureBuilt();
-        return this.bottoms[topIndex] - this.tops[topIndex];
-    };
-    // Bounding Rect
-    // TODO: decouple this from CoordCache
-    // Compute and return what the elements' bounding rectangle is, from the user's perspective.
-    // Right now, only returns a rectangle if constrained by an overflow:scroll element.
-    // Returns null if there are no elements
-    CoordCache.prototype.queryBoundingRect = function () {
-        var scrollParentEl;
-        if (this.els.length > 0) {
-            scrollParentEl = util_1.getScrollParent(this.els.eq(0));
-            if (!scrollParentEl.is(document)) {
-                return util_1.getClientRect(scrollParentEl);
-            }
-        }
-        return null;
-    };
-    CoordCache.prototype.isPointInBounds = function (leftOffset, topOffset) {
-        return this.isLeftInBounds(leftOffset) && this.isTopInBounds(topOffset);
-    };
-    CoordCache.prototype.isLeftInBounds = function (leftOffset) {
-        return !this.boundingRect || (leftOffset >= this.boundingRect.left && leftOffset < this.boundingRect.right);
-    };
-    CoordCache.prototype.isTopInBounds = function (topOffset) {
-        return !this.boundingRect || (topOffset >= this.boundingRect.top && topOffset < this.boundingRect.bottom);
-    };
-    return CoordCache;
-}());
-exports.default = CoordCache;
-
-
-/***/ }),
-/* 54 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var ListenerMixin_1 = __webpack_require__(7);
-var GlobalEmitter_1 = __webpack_require__(21);
-/* Tracks a drag's mouse movement, firing various handlers
-----------------------------------------------------------------------------------------------------------------------*/
-// TODO: use Emitter
-var DragListener = /** @class */ (function () {
-    function DragListener(options) {
-        this.isInteracting = false;
-        this.isDistanceSurpassed = false;
-        this.isDelayEnded = false;
-        this.isDragging = false;
-        this.isTouch = false;
-        this.isGeneric = false; // initiated by 'dragstart' (jqui)
-        this.shouldCancelTouchScroll = true;
-        this.scrollAlwaysKills = false;
-        this.isAutoScroll = false;
-        // defaults
-        this.scrollSensitivity = 30; // pixels from edge for scrolling to start
-        this.scrollSpeed = 200; // pixels per second, at maximum speed
-        this.scrollIntervalMs = 50; // millisecond wait between scroll increment
-        this.options = options || {};
-    }
-    // Interaction (high-level)
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.startInteraction = function (ev, extraOptions) {
-        if (extraOptions === void 0) { extraOptions = {}; }
-        if (ev.type === 'mousedown') {
-            if (GlobalEmitter_1.default.get().shouldIgnoreMouse()) {
-                return;
-            }
-            else if (!util_1.isPrimaryMouseButton(ev)) {
-                return;
-            }
-            else {
-                ev.preventDefault(); // prevents native selection in most browsers
-            }
-        }
-        if (!this.isInteracting) {
-            // process options
-            this.delay = util_1.firstDefined(extraOptions.delay, this.options.delay, 0);
-            this.minDistance = util_1.firstDefined(extraOptions.distance, this.options.distance, 0);
-            this.subjectEl = this.options.subjectEl;
-            util_1.preventSelection($('body'));
-            this.isInteracting = true;
-            this.isTouch = util_1.getEvIsTouch(ev);
-            this.isGeneric = ev.type === 'dragstart';
-            this.isDelayEnded = false;
-            this.isDistanceSurpassed = false;
-            this.originX = util_1.getEvX(ev);
-            this.originY = util_1.getEvY(ev);
-            this.scrollEl = util_1.getScrollParent($(ev.target));
-            this.bindHandlers();
-            this.initAutoScroll();
-            this.handleInteractionStart(ev);
-            this.startDelay(ev);
-            if (!this.minDistance) {
-                this.handleDistanceSurpassed(ev);
-            }
-        }
-    };
-    DragListener.prototype.handleInteractionStart = function (ev) {
-        this.trigger('interactionStart', ev);
-    };
-    DragListener.prototype.endInteraction = function (ev, isCancelled) {
-        if (this.isInteracting) {
-            this.endDrag(ev);
-            if (this.delayTimeoutId) {
-                clearTimeout(this.delayTimeoutId);
-                this.delayTimeoutId = null;
-            }
-            this.destroyAutoScroll();
-            this.unbindHandlers();
-            this.isInteracting = false;
-            this.handleInteractionEnd(ev, isCancelled);
-            util_1.allowSelection($('body'));
-        }
-    };
-    DragListener.prototype.handleInteractionEnd = function (ev, isCancelled) {
-        this.trigger('interactionEnd', ev, isCancelled || false);
-    };
-    // Binding To DOM
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.bindHandlers = function () {
-        // some browsers (Safari in iOS 10) don't allow preventDefault on touch events that are bound after touchstart,
-        // so listen to the GlobalEmitter singleton, which is always bound, instead of the document directly.
-        var globalEmitter = GlobalEmitter_1.default.get();
-        if (this.isGeneric) {
-            this.listenTo($(document), {
-                drag: this.handleMove,
-                dragstop: this.endInteraction
-            });
-        }
-        else if (this.isTouch) {
-            this.listenTo(globalEmitter, {
-                touchmove: this.handleTouchMove,
-                touchend: this.endInteraction,
-                scroll: this.handleTouchScroll
-            });
-        }
-        else {
-            this.listenTo(globalEmitter, {
-                mousemove: this.handleMouseMove,
-                mouseup: this.endInteraction
-            });
-        }
-        this.listenTo(globalEmitter, {
-            selectstart: util_1.preventDefault,
-            contextmenu: util_1.preventDefault // long taps would open menu on Chrome dev tools
-        });
-    };
-    DragListener.prototype.unbindHandlers = function () {
-        this.stopListeningTo(GlobalEmitter_1.default.get());
-        this.stopListeningTo($(document)); // for isGeneric
-    };
-    // Drag (high-level)
-    // -----------------------------------------------------------------------------------------------------------------
-    // extraOptions ignored if drag already started
-    DragListener.prototype.startDrag = function (ev, extraOptions) {
-        this.startInteraction(ev, extraOptions); // ensure interaction began
-        if (!this.isDragging) {
-            this.isDragging = true;
-            this.handleDragStart(ev);
-        }
-    };
-    DragListener.prototype.handleDragStart = function (ev) {
-        this.trigger('dragStart', ev);
-    };
-    DragListener.prototype.handleMove = function (ev) {
-        var dx = util_1.getEvX(ev) - this.originX;
-        var dy = util_1.getEvY(ev) - this.originY;
-        var minDistance = this.minDistance;
-        var distanceSq; // current distance from the origin, squared
-        if (!this.isDistanceSurpassed) {
-            distanceSq = dx * dx + dy * dy;
-            if (distanceSq >= minDistance * minDistance) {
-                this.handleDistanceSurpassed(ev);
-            }
-        }
-        if (this.isDragging) {
-            this.handleDrag(dx, dy, ev);
-        }
-    };
-    // Called while the mouse is being moved and when we know a legitimate drag is taking place
-    DragListener.prototype.handleDrag = function (dx, dy, ev) {
-        this.trigger('drag', dx, dy, ev);
-        this.updateAutoScroll(ev); // will possibly cause scrolling
-    };
-    DragListener.prototype.endDrag = function (ev) {
-        if (this.isDragging) {
-            this.isDragging = false;
-            this.handleDragEnd(ev);
-        }
-    };
-    DragListener.prototype.handleDragEnd = function (ev) {
-        this.trigger('dragEnd', ev);
-    };
-    // Delay
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.startDelay = function (initialEv) {
-        var _this = this;
-        if (this.delay) {
-            this.delayTimeoutId = setTimeout(function () {
-                _this.handleDelayEnd(initialEv);
-            }, this.delay);
-        }
-        else {
-            this.handleDelayEnd(initialEv);
-        }
-    };
-    DragListener.prototype.handleDelayEnd = function (initialEv) {
-        this.isDelayEnded = true;
-        if (this.isDistanceSurpassed) {
-            this.startDrag(initialEv);
-        }
-    };
-    // Distance
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.handleDistanceSurpassed = function (ev) {
-        this.isDistanceSurpassed = true;
-        if (this.isDelayEnded) {
-            this.startDrag(ev);
-        }
-    };
-    // Mouse / Touch
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.handleTouchMove = function (ev) {
-        // prevent inertia and touchmove-scrolling while dragging
-        if (this.isDragging && this.shouldCancelTouchScroll) {
-            ev.preventDefault();
-        }
-        this.handleMove(ev);
-    };
-    DragListener.prototype.handleMouseMove = function (ev) {
-        this.handleMove(ev);
-    };
-    // Scrolling (unrelated to auto-scroll)
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.handleTouchScroll = function (ev) {
-        // if the drag is being initiated by touch, but a scroll happens before
-        // the drag-initiating delay is over, cancel the drag
-        if (!this.isDragging || this.scrollAlwaysKills) {
-            this.endInteraction(ev, true); // isCancelled=true
-        }
-    };
-    // Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    // Triggers a callback. Calls a function in the option hash of the same name.
-    // Arguments beyond the first `name` are forwarded on.
-    DragListener.prototype.trigger = function (name) {
-        var args = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            args[_i - 1] = arguments[_i];
-        }
-        if (this.options[name]) {
-            this.options[name].apply(this, args);
-        }
-        // makes _methods callable by event name. TODO: kill this
-        if (this['_' + name]) {
-            this['_' + name].apply(this, args);
-        }
-    };
-    // Auto-scroll
-    // -----------------------------------------------------------------------------------------------------------------
-    DragListener.prototype.initAutoScroll = function () {
-        var scrollEl = this.scrollEl;
-        this.isAutoScroll =
-            this.options.scroll &&
-                scrollEl &&
-                !scrollEl.is(window) &&
-                !scrollEl.is(document);
-        if (this.isAutoScroll) {
-            // debounce makes sure rapid calls don't happen
-            this.listenTo(scrollEl, 'scroll', util_1.debounce(this.handleDebouncedScroll, 100));
-        }
-    };
-    DragListener.prototype.destroyAutoScroll = function () {
-        this.endAutoScroll(); // kill any animation loop
-        // remove the scroll handler if there is a scrollEl
-        if (this.isAutoScroll) {
-            this.stopListeningTo(this.scrollEl, 'scroll'); // will probably get removed by unbindHandlers too :(
-        }
-    };
-    // Computes and stores the bounding rectangle of scrollEl
-    DragListener.prototype.computeScrollBounds = function () {
-        if (this.isAutoScroll) {
-            this.scrollBounds = util_1.getOuterRect(this.scrollEl);
-            // TODO: use getClientRect in future. but prevents auto scrolling when on top of scrollbars
-        }
-    };
-    // Called when the dragging is in progress and scrolling should be updated
-    DragListener.prototype.updateAutoScroll = function (ev) {
-        var sensitivity = this.scrollSensitivity;
-        var bounds = this.scrollBounds;
-        var topCloseness;
-        var bottomCloseness;
-        var leftCloseness;
-        var rightCloseness;
-        var topVel = 0;
-        var leftVel = 0;
-        if (bounds) {
-            // compute closeness to edges. valid range is from 0.0 - 1.0
-            topCloseness = (sensitivity - (util_1.getEvY(ev) - bounds.top)) / sensitivity;
-            bottomCloseness = (sensitivity - (bounds.bottom - util_1.getEvY(ev))) / sensitivity;
-            leftCloseness = (sensitivity - (util_1.getEvX(ev) - bounds.left)) / sensitivity;
-            rightCloseness = (sensitivity - (bounds.right - util_1.getEvX(ev))) / sensitivity;
-            // translate vertical closeness into velocity.
-            // mouse must be completely in bounds for velocity to happen.
-            if (topCloseness >= 0 && topCloseness <= 1) {
-                topVel = topCloseness * this.scrollSpeed * -1; // negative. for scrolling up
-            }
-            else if (bottomCloseness >= 0 && bottomCloseness <= 1) {
-                topVel = bottomCloseness * this.scrollSpeed;
-            }
-            // translate horizontal closeness into velocity
-            if (leftCloseness >= 0 && leftCloseness <= 1) {
-                leftVel = leftCloseness * this.scrollSpeed * -1; // negative. for scrolling left
-            }
-            else if (rightCloseness >= 0 && rightCloseness <= 1) {
-                leftVel = rightCloseness * this.scrollSpeed;
-            }
-        }
-        this.setScrollVel(topVel, leftVel);
-    };
-    // Sets the speed-of-scrolling for the scrollEl
-    DragListener.prototype.setScrollVel = function (topVel, leftVel) {
-        this.scrollTopVel = topVel;
-        this.scrollLeftVel = leftVel;
-        this.constrainScrollVel(); // massages into realistic values
-        // if there is non-zero velocity, and an animation loop hasn't already started, then START
-        if ((this.scrollTopVel || this.scrollLeftVel) && !this.scrollIntervalId) {
-            this.scrollIntervalId = setInterval(util_1.proxy(this, 'scrollIntervalFunc'), // scope to `this`
-            this.scrollIntervalMs);
-        }
-    };
-    // Forces scrollTopVel and scrollLeftVel to be zero if scrolling has already gone all the way
-    DragListener.prototype.constrainScrollVel = function () {
-        var el = this.scrollEl;
-        if (this.scrollTopVel < 0) {
-            if (el.scrollTop() <= 0) {
-                this.scrollTopVel = 0;
-            }
-        }
-        else if (this.scrollTopVel > 0) {
-            if (el.scrollTop() + el[0].clientHeight >= el[0].scrollHeight) {
-                this.scrollTopVel = 0;
-            }
-        }
-        if (this.scrollLeftVel < 0) {
-            if (el.scrollLeft() <= 0) {
-                this.scrollLeftVel = 0;
-            }
-        }
-        else if (this.scrollLeftVel > 0) {
-            if (el.scrollLeft() + el[0].clientWidth >= el[0].scrollWidth) {
-                this.scrollLeftVel = 0;
-            }
-        }
-    };
-    // This function gets called during every iteration of the scrolling animation loop
-    DragListener.prototype.scrollIntervalFunc = function () {
-        var el = this.scrollEl;
-        var frac = this.scrollIntervalMs / 1000; // considering animation frequency, what the vel should be mult'd by
-        // change the value of scrollEl's scroll
-        if (this.scrollTopVel) {
-            el.scrollTop(el.scrollTop() + this.scrollTopVel * frac);
-        }
-        if (this.scrollLeftVel) {
-            el.scrollLeft(el.scrollLeft() + this.scrollLeftVel * frac);
-        }
-        this.constrainScrollVel(); // since the scroll values changed, recompute the velocities
-        // if scrolled all the way, which causes the vels to be zero, stop the animation loop
-        if (!this.scrollTopVel && !this.scrollLeftVel) {
-            this.endAutoScroll();
-        }
-    };
-    // Kills any existing scrolling animation loop
-    DragListener.prototype.endAutoScroll = function () {
-        if (this.scrollIntervalId) {
-            clearInterval(this.scrollIntervalId);
-            this.scrollIntervalId = null;
-            this.handleScrollEnd();
-        }
-    };
-    // Get called when the scrollEl is scrolled (NOTE: this is delayed via debounce)
-    DragListener.prototype.handleDebouncedScroll = function () {
-        // recompute all coordinates, but *only* if this is *not* part of our scrolling animation
-        if (!this.scrollIntervalId) {
-            this.handleScrollEnd();
-        }
-    };
-    DragListener.prototype.handleScrollEnd = function () {
-        // Called when scrolling has stopped, whether through auto scroll, or the user scrolling
-    };
-    return DragListener;
-}());
-exports.default = DragListener;
-ListenerMixin_1.default.mixInto(DragListener);
-
-
-/***/ }),
-/* 55 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var Mixin_1 = __webpack_require__(14);
-/*
-A set of rendering and date-related methods for a visual component comprised of one or more rows of day columns.
-Prerequisite: the object being mixed into needs to be a *Grid*
-*/
-var DayTableMixin = /** @class */ (function (_super) {
-    tslib_1.__extends(DayTableMixin, _super);
-    function DayTableMixin() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Populates internal variables used for date calculation and rendering
-    DayTableMixin.prototype.updateDayTable = function () {
-        var t = this;
-        var view = t.view;
-        var calendar = view.calendar;
-        var date = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.startMs, true);
-        var end = calendar.msToUtcMoment(t.dateProfile.renderUnzonedRange.endMs, true);
-        var dayIndex = -1;
-        var dayIndices = [];
-        var dayDates = [];
-        var daysPerRow;
-        var firstDay;
-        var rowCnt;
-        while (date.isBefore(end)) {
-            if (view.isHiddenDay(date)) {
-                dayIndices.push(dayIndex + 0.5); // mark that it's between indices
-            }
-            else {
-                dayIndex++;
-                dayIndices.push(dayIndex);
-                dayDates.push(date.clone());
-            }
-            date.add(1, 'days');
-        }
-        if (this.breakOnWeeks) {
-            // count columns until the day-of-week repeats
-            firstDay = dayDates[0].day();
-            for (daysPerRow = 1; daysPerRow < dayDates.length; daysPerRow++) {
-                if (dayDates[daysPerRow].day() === firstDay) {
-                    break;
-                }
-            }
-            rowCnt = Math.ceil(dayDates.length / daysPerRow);
-        }
-        else {
-            rowCnt = 1;
-            daysPerRow = dayDates.length;
-        }
-        this.dayDates = dayDates;
-        this.dayIndices = dayIndices;
-        this.daysPerRow = daysPerRow;
-        this.rowCnt = rowCnt;
-        this.updateDayTableCols();
-    };
-    // Computes and assigned the colCnt property and updates any options that may be computed from it
-    DayTableMixin.prototype.updateDayTableCols = function () {
-        this.colCnt = this.computeColCnt();
-        this.colHeadFormat =
-            this.opt('columnHeaderFormat') ||
-                this.opt('columnFormat') || // deprecated
-                this.computeColHeadFormat();
-    };
-    // Determines how many columns there should be in the table
-    DayTableMixin.prototype.computeColCnt = function () {
-        return this.daysPerRow;
-    };
-    // Computes the ambiguously-timed moment for the given cell
-    DayTableMixin.prototype.getCellDate = function (row, col) {
-        return this.dayDates[this.getCellDayIndex(row, col)].clone();
-    };
-    // Computes the ambiguously-timed date range for the given cell
-    DayTableMixin.prototype.getCellRange = function (row, col) {
-        var start = this.getCellDate(row, col);
-        var end = start.clone().add(1, 'days');
-        return { start: start, end: end };
-    };
-    // Returns the number of day cells, chronologically, from the first of the grid (0-based)
-    DayTableMixin.prototype.getCellDayIndex = function (row, col) {
-        return row * this.daysPerRow + this.getColDayIndex(col);
-    };
-    // Returns the numner of day cells, chronologically, from the first cell in *any given row*
-    DayTableMixin.prototype.getColDayIndex = function (col) {
-        if (this.isRTL) {
-            return this.colCnt - 1 - col;
-        }
-        else {
-            return col;
-        }
-    };
-    // Given a date, returns its chronolocial cell-index from the first cell of the grid.
-    // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
-    // If before the first offset, returns a negative number.
-    // If after the last offset, returns an offset past the last cell offset.
-    // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
-    DayTableMixin.prototype.getDateDayIndex = function (date) {
-        var dayIndices = this.dayIndices;
-        var dayOffset = date.diff(this.dayDates[0], 'days');
-        if (dayOffset < 0) {
-            return dayIndices[0] - 1;
-        }
-        else if (dayOffset >= dayIndices.length) {
-            return dayIndices[dayIndices.length - 1] + 1;
-        }
-        else {
-            return dayIndices[dayOffset];
-        }
-    };
-    /* Options
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Computes a default column header formatting string if `colFormat` is not explicitly defined
-    DayTableMixin.prototype.computeColHeadFormat = function () {
-        // if more than one week row, or if there are a lot of columns with not much space,
-        // put just the day numbers will be in each cell
-        if (this.rowCnt > 1 || this.colCnt > 10) {
-            return 'ddd'; // "Sat"
-        }
-        else if (this.colCnt > 1) {
-            return this.opt('dayOfMonthFormat'); // "Sat 12/10"
-        }
-        else {
-            return 'dddd'; // "Saturday"
-        }
-    };
-    /* Slicing
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Slices up a date range into a segment for every week-row it intersects with
-    DayTableMixin.prototype.sliceRangeByRow = function (unzonedRange) {
-        var daysPerRow = this.daysPerRow;
-        var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold
-        var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index
-        var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index
-        var segs = [];
-        var row;
-        var rowFirst;
-        var rowLast; // inclusive day-index range for current row
-        var segFirst;
-        var segLast; // inclusive day-index range for segment
-        for (row = 0; row < this.rowCnt; row++) {
-            rowFirst = row * daysPerRow;
-            rowLast = rowFirst + daysPerRow - 1;
-            // intersect segment's offset range with the row's
-            segFirst = Math.max(rangeFirst, rowFirst);
-            segLast = Math.min(rangeLast, rowLast);
-            // deal with in-between indices
-            segFirst = Math.ceil(segFirst); // in-between starts round to next cell
-            segLast = Math.floor(segLast); // in-between ends round to prev cell
-            if (segFirst <= segLast) {
-                segs.push({
-                    row: row,
-                    // normalize to start of row
-                    firstRowDayIndex: segFirst - rowFirst,
-                    lastRowDayIndex: segLast - rowFirst,
-                    // must be matching integers to be the segment's start/end
-                    isStart: segFirst === rangeFirst,
-                    isEnd: segLast === rangeLast
-                });
-            }
-        }
-        return segs;
-    };
-    // Slices up a date range into a segment for every day-cell it intersects with.
-    // TODO: make more DRY with sliceRangeByRow somehow.
-    DayTableMixin.prototype.sliceRangeByDay = function (unzonedRange) {
-        var daysPerRow = this.daysPerRow;
-        var normalRange = this.view.computeDayRange(unzonedRange); // make whole-day range, considering nextDayThreshold
-        var rangeFirst = this.getDateDayIndex(normalRange.start); // inclusive first index
-        var rangeLast = this.getDateDayIndex(normalRange.end.clone().subtract(1, 'days')); // inclusive last index
-        var segs = [];
-        var row;
-        var rowFirst;
-        var rowLast; // inclusive day-index range for current row
-        var i;
-        var segFirst;
-        var segLast; // inclusive day-index range for segment
-        for (row = 0; row < this.rowCnt; row++) {
-            rowFirst = row * daysPerRow;
-            rowLast = rowFirst + daysPerRow - 1;
-            for (i = rowFirst; i <= rowLast; i++) {
-                // intersect segment's offset range with the row's
-                segFirst = Math.max(rangeFirst, i);
-                segLast = Math.min(rangeLast, i);
-                // deal with in-between indices
-                segFirst = Math.ceil(segFirst); // in-between starts round to next cell
-                segLast = Math.floor(segLast); // in-between ends round to prev cell
-                if (segFirst <= segLast) {
-                    segs.push({
-                        row: row,
-                        // normalize to start of row
-                        firstRowDayIndex: segFirst - rowFirst,
-                        lastRowDayIndex: segLast - rowFirst,
-                        // must be matching integers to be the segment's start/end
-                        isStart: segFirst === rangeFirst,
-                        isEnd: segLast === rangeLast
-                    });
-                }
-            }
-        }
-        return segs;
-    };
-    /* Header Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayTableMixin.prototype.renderHeadHtml = function () {
-        var theme = this.view.calendar.theme;
-        return '' +
-            '<div class="fc-row ' + theme.getClass('headerRow') + '">' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            '<thead>' +
-            this.renderHeadTrHtml() +
-            '</thead>' +
-            '</table>' +
-            '</div>';
-    };
-    DayTableMixin.prototype.renderHeadIntroHtml = function () {
-        return this.renderIntroHtml(); // fall back to generic
-    };
-    DayTableMixin.prototype.renderHeadTrHtml = function () {
-        return '' +
-            '<tr>' +
-            (this.isRTL ? '' : this.renderHeadIntroHtml()) +
-            this.renderHeadDateCellsHtml() +
-            (this.isRTL ? this.renderHeadIntroHtml() : '') +
-            '</tr>';
-    };
-    DayTableMixin.prototype.renderHeadDateCellsHtml = function () {
-        var htmls = [];
-        var col;
-        var date;
-        for (col = 0; col < this.colCnt; col++) {
-            date = this.getCellDate(0, col);
-            htmls.push(this.renderHeadDateCellHtml(date));
-        }
-        return htmls.join('');
-    };
-    // TODO: when internalApiVersion, accept an object for HTML attributes
-    // (colspan should be no different)
-    DayTableMixin.prototype.renderHeadDateCellHtml = function (date, colspan, otherAttrs) {
-        var t = this;
-        var view = t.view;
-        var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.
-        var classNames = [
-            'fc-day-header',
-            view.calendar.theme.getClass('widgetHeader')
-        ];
-        var innerHtml;
-        if (typeof t.opt('columnHeaderHtml') === 'function') {
-            innerHtml = t.opt('columnHeaderHtml')(date);
-        }
-        else if (typeof t.opt('columnHeaderText') === 'function') {
-            innerHtml = util_1.htmlEscape(t.opt('columnHeaderText')(date));
-        }
-        else {
-            innerHtml = util_1.htmlEscape(date.format(t.colHeadFormat));
-        }
-        // if only one row of days, the classNames on the header can represent the specific days beneath
-        if (t.rowCnt === 1) {
-            classNames = classNames.concat(
-            // includes the day-of-week class
-            // noThemeHighlight=true (don't highlight the header)
-            t.getDayClasses(date, true));
-        }
-        else {
-            classNames.push('fc-' + util_1.dayIDs[date.day()]); // only add the day-of-week class
-        }
-        return '' +
-            '<th class="' + classNames.join(' ') + '"' +
-            ((isDateValid && t.rowCnt) === 1 ?
-                ' data-date="' + date.format('YYYY-MM-DD') + '"' :
-                '') +
-            (colspan > 1 ?
-                ' colspan="' + colspan + '"' :
-                '') +
-            (otherAttrs ?
-                ' ' + otherAttrs :
-                '') +
-            '>' +
-            (isDateValid ?
-                // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
-                view.buildGotoAnchorHtml({ date: date, forceOff: t.rowCnt > 1 || t.colCnt === 1 }, innerHtml) :
-                // if not valid, display text, but no link
-                innerHtml) +
-            '</th>';
-    };
-    /* Background Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayTableMixin.prototype.renderBgTrHtml = function (row) {
-        return '' +
-            '<tr>' +
-            (this.isRTL ? '' : this.renderBgIntroHtml(row)) +
-            this.renderBgCellsHtml(row) +
-            (this.isRTL ? this.renderBgIntroHtml(row) : '') +
-            '</tr>';
-    };
-    DayTableMixin.prototype.renderBgIntroHtml = function (row) {
-        return this.renderIntroHtml(); // fall back to generic
-    };
-    DayTableMixin.prototype.renderBgCellsHtml = function (row) {
-        var htmls = [];
-        var col;
-        var date;
-        for (col = 0; col < this.colCnt; col++) {
-            date = this.getCellDate(row, col);
-            htmls.push(this.renderBgCellHtml(date));
-        }
-        return htmls.join('');
-    };
-    DayTableMixin.prototype.renderBgCellHtml = function (date, otherAttrs) {
-        var t = this;
-        var view = t.view;
-        var isDateValid = t.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.
-        var classes = t.getDayClasses(date);
-        classes.unshift('fc-day', view.calendar.theme.getClass('widgetContent'));
-        return '<td class="' + classes.join(' ') + '"' +
-            (isDateValid ?
-                ' data-date="' + date.format('YYYY-MM-DD') + '"' : // if date has a time, won't format it
-                '') +
-            (otherAttrs ?
-                ' ' + otherAttrs :
-                '') +
-            '></td>';
-    };
-    /* Generic
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayTableMixin.prototype.renderIntroHtml = function () {
-        // Generates the default HTML intro for any row. User classes should override
-    };
-    // TODO: a generic method for dealing with <tr>, RTL, intro
-    // when increment internalApiVersion
-    // wrapTr (scheduler)
-    /* Utils
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Applies the generic "intro" and "outro" HTML to the given cells.
-    // Intro means the leftmost cell when the calendar is LTR and the rightmost cell when RTL. Vice-versa for outro.
-    DayTableMixin.prototype.bookendCells = function (trEl) {
-        var introHtml = this.renderIntroHtml();
-        if (introHtml) {
-            if (this.isRTL) {
-                trEl.append(introHtml);
-            }
-            else {
-                trEl.prepend(introHtml);
-            }
-        }
-    };
-    return DayTableMixin;
-}(Mixin_1.default));
-exports.default = DayTableMixin;
-
-
-/***/ }),
-/* 56 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var BusinessHourRenderer = /** @class */ (function () {
-    /*
-    component implements:
-      - eventRangesToEventFootprints
-      - eventFootprintsToSegs
-    */
-    function BusinessHourRenderer(component, fillRenderer) {
-        this.component = component;
-        this.fillRenderer = fillRenderer;
-    }
-    BusinessHourRenderer.prototype.render = function (businessHourGenerator) {
-        var component = this.component;
-        var unzonedRange = component._getDateProfile().activeUnzonedRange;
-        var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(component.hasAllDayBusinessHours, unzonedRange);
-        var eventFootprints = eventInstanceGroup ?
-            component.eventRangesToEventFootprints(eventInstanceGroup.sliceRenderRanges(unzonedRange)) :
-            [];
-        this.renderEventFootprints(eventFootprints);
-    };
-    BusinessHourRenderer.prototype.renderEventFootprints = function (eventFootprints) {
-        var segs = this.component.eventFootprintsToSegs(eventFootprints);
-        this.renderSegs(segs);
-        this.segs = segs;
-    };
-    BusinessHourRenderer.prototype.renderSegs = function (segs) {
-        if (this.fillRenderer) {
-            this.fillRenderer.renderSegs('businessHours', segs, {
-                getClasses: function (seg) {
-                    return ['fc-nonbusiness', 'fc-bgevent'];
-                }
-            });
-        }
-    };
-    BusinessHourRenderer.prototype.unrender = function () {
-        if (this.fillRenderer) {
-            this.fillRenderer.unrender('businessHours');
-        }
-        this.segs = null;
-    };
-    BusinessHourRenderer.prototype.getSegs = function () {
-        return this.segs || [];
-    };
-    return BusinessHourRenderer;
-}());
-exports.default = BusinessHourRenderer;
-
-
-/***/ }),
-/* 57 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var FillRenderer = /** @class */ (function () {
-    function FillRenderer(component) {
-        this.fillSegTag = 'div';
-        this.component = component;
-        this.elsByFill = {};
-    }
-    FillRenderer.prototype.renderFootprint = function (type, componentFootprint, props) {
-        this.renderSegs(type, this.component.componentFootprintToSegs(componentFootprint), props);
-    };
-    FillRenderer.prototype.renderSegs = function (type, segs, props) {
-        var els;
-        segs = this.buildSegEls(type, segs, props); // assignes `.el` to each seg. returns successfully rendered segs
-        els = this.attachSegEls(type, segs);
-        if (els) {
-            this.reportEls(type, els);
-        }
-        return segs;
-    };
-    // Unrenders a specific type of fill that is currently rendered on the grid
-    FillRenderer.prototype.unrender = function (type) {
-        var el = this.elsByFill[type];
-        if (el) {
-            el.remove();
-            delete this.elsByFill[type];
-        }
-    };
-    // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
-    // Only returns segments that successfully rendered.
-    FillRenderer.prototype.buildSegEls = function (type, segs, props) {
-        var _this = this;
-        var html = '';
-        var renderedSegs = [];
-        var i;
-        if (segs.length) {
-            // build a large concatenation of segment HTML
-            for (i = 0; i < segs.length; i++) {
-                html += this.buildSegHtml(type, segs[i], props);
-            }
-            // Grab individual elements from the combined HTML string. Use each as the default rendering.
-            // Then, compute the 'el' for each segment.
-            $(html).each(function (i, node) {
-                var seg = segs[i];
-                var el = $(node);
-                // allow custom filter methods per-type
-                if (props.filterEl) {
-                    el = props.filterEl(seg, el);
-                }
-                if (el) {
-                    el = $(el); // allow custom filter to return raw DOM node
-                    // correct element type? (would be bad if a non-TD were inserted into a table for example)
-                    if (el.is(_this.fillSegTag)) {
-                        seg.el = el;
-                        renderedSegs.push(seg);
-                    }
-                }
-            });
-        }
-        return renderedSegs;
-    };
-    // Builds the HTML needed for one fill segment. Generic enough to work with different types.
-    FillRenderer.prototype.buildSegHtml = function (type, seg, props) {
-        // custom hooks per-type
-        var classes = props.getClasses ? props.getClasses(seg) : [];
-        var css = util_1.cssToStr(props.getCss ? props.getCss(seg) : {});
-        return '<' + this.fillSegTag +
-            (classes.length ? ' class="' + classes.join(' ') + '"' : '') +
-            (css ? ' style="' + css + '"' : '') +
-            ' />';
-    };
-    // Should return wrapping DOM structure
-    FillRenderer.prototype.attachSegEls = function (type, segs) {
-        // subclasses must implement
-    };
-    FillRenderer.prototype.reportEls = function (type, nodes) {
-        if (this.elsByFill[type]) {
-            this.elsByFill[type] = this.elsByFill[type].add(nodes);
-        }
-        else {
-            this.elsByFill[type] = $(nodes);
-        }
-    };
-    return FillRenderer;
-}());
-exports.default = FillRenderer;
-
-
-/***/ }),
-/* 58 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var SingleEventDef_1 = __webpack_require__(13);
-var EventFootprint_1 = __webpack_require__(36);
-var EventSource_1 = __webpack_require__(6);
-var HelperRenderer = /** @class */ (function () {
-    function HelperRenderer(component, eventRenderer) {
-        this.view = component._getView();
-        this.component = component;
-        this.eventRenderer = eventRenderer;
-    }
-    HelperRenderer.prototype.renderComponentFootprint = function (componentFootprint) {
-        this.renderEventFootprints([
-            this.fabricateEventFootprint(componentFootprint)
-        ]);
-    };
-    HelperRenderer.prototype.renderEventDraggingFootprints = function (eventFootprints, sourceSeg, isTouch) {
-        this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-dragging', isTouch ? null : this.view.opt('dragOpacity'));
-    };
-    HelperRenderer.prototype.renderEventResizingFootprints = function (eventFootprints, sourceSeg, isTouch) {
-        this.renderEventFootprints(eventFootprints, sourceSeg, 'fc-resizing');
-    };
-    HelperRenderer.prototype.renderEventFootprints = function (eventFootprints, sourceSeg, extraClassNames, opacity) {
-        var segs = this.component.eventFootprintsToSegs(eventFootprints);
-        var classNames = 'fc-helper ' + (extraClassNames || '');
-        var i;
-        // assigns each seg's el and returns a subset of segs that were rendered
-        segs = this.eventRenderer.renderFgSegEls(segs);
-        for (i = 0; i < segs.length; i++) {
-            segs[i].el.addClass(classNames);
-        }
-        if (opacity != null) {
-            for (i = 0; i < segs.length; i++) {
-                segs[i].el.css('opacity', opacity);
-            }
-        }
-        this.helperEls = this.renderSegs(segs, sourceSeg);
-    };
-    /*
-    Must return all mock event elements
-    */
-    HelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {
-        // Subclasses must implement
-    };
-    HelperRenderer.prototype.unrender = function () {
-        if (this.helperEls) {
-            this.helperEls.remove();
-            this.helperEls = null;
-        }
-    };
-    HelperRenderer.prototype.fabricateEventFootprint = function (componentFootprint) {
-        var calendar = this.view.calendar;
-        var eventDateProfile = calendar.footprintToDateProfile(componentFootprint);
-        var dummyEvent = new SingleEventDef_1.default(new EventSource_1.default(calendar));
-        var dummyInstance;
-        dummyEvent.dateProfile = eventDateProfile;
-        dummyInstance = dummyEvent.buildInstance();
-        return new EventFootprint_1.default(componentFootprint, dummyEvent, dummyInstance);
-    };
-    return HelperRenderer;
-}());
-exports.default = HelperRenderer;
-
-
-/***/ }),
-/* 59 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var GlobalEmitter_1 = __webpack_require__(21);
-var Interaction_1 = __webpack_require__(15);
-var EventPointing = /** @class */ (function (_super) {
-    tslib_1.__extends(EventPointing, _super);
-    function EventPointing() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    /*
-    component must implement:
-      - publiclyTrigger
-    */
-    EventPointing.prototype.bindToEl = function (el) {
-        var component = this.component;
-        component.bindSegHandlerToEl(el, 'click', this.handleClick.bind(this));
-        component.bindSegHandlerToEl(el, 'mouseenter', this.handleMouseover.bind(this));
-        component.bindSegHandlerToEl(el, 'mouseleave', this.handleMouseout.bind(this));
-    };
-    EventPointing.prototype.handleClick = function (seg, ev) {
-        var res = this.component.publiclyTrigger('eventClick', {
-            context: seg.el[0],
-            args: [seg.footprint.getEventLegacy(), ev, this.view]
-        });
-        if (res === false) {
-            ev.preventDefault();
-        }
-    };
-    // Updates internal state and triggers handlers for when an event element is moused over
-    EventPointing.prototype.handleMouseover = function (seg, ev) {
-        if (!GlobalEmitter_1.default.get().shouldIgnoreMouse() &&
-            !this.mousedOverSeg) {
-            this.mousedOverSeg = seg;
-            // TODO: move to EventSelecting's responsibility
-            if (this.view.isEventDefResizable(seg.footprint.eventDef)) {
-                seg.el.addClass('fc-allow-mouse-resize');
-            }
-            this.component.publiclyTrigger('eventMouseover', {
-                context: seg.el[0],
-                args: [seg.footprint.getEventLegacy(), ev, this.view]
-            });
-        }
-    };
-    // Updates internal state and triggers handlers for when an event element is moused out.
-    // Can be given no arguments, in which case it will mouseout the segment that was previously moused over.
-    EventPointing.prototype.handleMouseout = function (seg, ev) {
-        if (this.mousedOverSeg) {
-            this.mousedOverSeg = null;
-            // TODO: move to EventSelecting's responsibility
-            if (this.view.isEventDefResizable(seg.footprint.eventDef)) {
-                seg.el.removeClass('fc-allow-mouse-resize');
-            }
-            this.component.publiclyTrigger('eventMouseout', {
-                context: seg.el[0],
-                args: [
-                    seg.footprint.getEventLegacy(),
-                    ev || {},
-                    this.view
-                ]
-            });
-        }
-    };
-    EventPointing.prototype.end = function () {
-        if (this.mousedOverSeg) {
-            this.handleMouseout(this.mousedOverSeg);
-        }
-    };
-    return EventPointing;
-}(Interaction_1.default));
-exports.default = EventPointing;
-
-
-/***/ }),
-/* 60 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Mixin_1 = __webpack_require__(14);
-var DateClicking_1 = __webpack_require__(245);
-var DateSelecting_1 = __webpack_require__(225);
-var EventPointing_1 = __webpack_require__(59);
-var EventDragging_1 = __webpack_require__(224);
-var EventResizing_1 = __webpack_require__(223);
-var ExternalDropping_1 = __webpack_require__(222);
-var StandardInteractionsMixin = /** @class */ (function (_super) {
-    tslib_1.__extends(StandardInteractionsMixin, _super);
-    function StandardInteractionsMixin() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return StandardInteractionsMixin;
-}(Mixin_1.default));
-exports.default = StandardInteractionsMixin;
-StandardInteractionsMixin.prototype.dateClickingClass = DateClicking_1.default;
-StandardInteractionsMixin.prototype.dateSelectingClass = DateSelecting_1.default;
-StandardInteractionsMixin.prototype.eventPointingClass = EventPointing_1.default;
-StandardInteractionsMixin.prototype.eventDraggingClass = EventDragging_1.default;
-StandardInteractionsMixin.prototype.eventResizingClass = EventResizing_1.default;
-StandardInteractionsMixin.prototype.externalDroppingClass = ExternalDropping_1.default;
-
-
-/***/ }),
-/* 61 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var CoordCache_1 = __webpack_require__(53);
-var Popover_1 = __webpack_require__(249);
-var UnzonedRange_1 = __webpack_require__(5);
-var ComponentFootprint_1 = __webpack_require__(12);
-var EventFootprint_1 = __webpack_require__(36);
-var BusinessHourRenderer_1 = __webpack_require__(56);
-var StandardInteractionsMixin_1 = __webpack_require__(60);
-var InteractiveDateComponent_1 = __webpack_require__(40);
-var DayTableMixin_1 = __webpack_require__(55);
-var DayGridEventRenderer_1 = __webpack_require__(250);
-var DayGridHelperRenderer_1 = __webpack_require__(251);
-var DayGridFillRenderer_1 = __webpack_require__(252);
-/* A component that renders a grid of whole-days that runs horizontally. There can be multiple rows, one per week.
-----------------------------------------------------------------------------------------------------------------------*/
-var DayGrid = /** @class */ (function (_super) {
-    tslib_1.__extends(DayGrid, _super);
-    function DayGrid(view) {
-        var _this = _super.call(this, view) || this;
-        _this.cellWeekNumbersVisible = false; // display week numbers in day cell?
-        _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
-        // isRigid determines whether the individual rows should ignore the contents and be a constant height.
-        // Relies on the view's colCnt and rowCnt. In the future, this component should probably be self-sufficient.
-        _this.isRigid = false;
-        _this.hasAllDayBusinessHours = true;
-        return _this;
-    }
-    // Slices up the given span (unzoned start/end with other misc data) into an array of segments
-    DayGrid.prototype.componentFootprintToSegs = function (componentFootprint) {
-        var segs = this.sliceRangeByRow(componentFootprint.unzonedRange);
-        var i;
-        var seg;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            if (this.isRTL) {
-                seg.leftCol = this.daysPerRow - 1 - seg.lastRowDayIndex;
-                seg.rightCol = this.daysPerRow - 1 - seg.firstRowDayIndex;
-            }
-            else {
-                seg.leftCol = seg.firstRowDayIndex;
-                seg.rightCol = seg.lastRowDayIndex;
-            }
-        }
-        return segs;
-    };
-    /* Date Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.renderDates = function (dateProfile) {
-        this.dateProfile = dateProfile;
-        this.updateDayTable();
-        this.renderGrid();
-    };
-    DayGrid.prototype.unrenderDates = function () {
-        this.removeSegPopover();
-    };
-    // Renders the rows and columns into the component's `this.el`, which should already be assigned.
-    DayGrid.prototype.renderGrid = function () {
-        var view = this.view;
-        var rowCnt = this.rowCnt;
-        var colCnt = this.colCnt;
-        var html = '';
-        var row;
-        var col;
-        if (this.headContainerEl) {
-            this.headContainerEl.html(this.renderHeadHtml());
-        }
-        for (row = 0; row < rowCnt; row++) {
-            html += this.renderDayRowHtml(row, this.isRigid);
-        }
-        this.el.html(html);
-        this.rowEls = this.el.find('.fc-row');
-        this.cellEls = this.el.find('.fc-day, .fc-disabled-day');
-        this.rowCoordCache = new CoordCache_1.default({
-            els: this.rowEls,
-            isVertical: true
-        });
-        this.colCoordCache = new CoordCache_1.default({
-            els: this.cellEls.slice(0, this.colCnt),
-            isHorizontal: true
-        });
-        // trigger dayRender with each cell's element
-        for (row = 0; row < rowCnt; row++) {
-            for (col = 0; col < colCnt; col++) {
-                this.publiclyTrigger('dayRender', {
-                    context: view,
-                    args: [
-                        this.getCellDate(row, col),
-                        this.getCellEl(row, col),
-                        view
-                    ]
-                });
-            }
-        }
-    };
-    // Generates the HTML for a single row, which is a div that wraps a table.
-    // `row` is the row number.
-    DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
-        var theme = this.view.calendar.theme;
-        var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
-        if (isRigid) {
-            classes.push('fc-rigid');
-        }
-        return '' +
-            '<div class="' + classes.join(' ') + '">' +
-            '<div class="fc-bg">' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            this.renderBgTrHtml(row) +
-            '</table>' +
-            '</div>' +
-            '<div class="fc-content-skeleton">' +
-            '<table>' +
-            (this.getIsNumbersVisible() ?
-                '<thead>' +
-                    this.renderNumberTrHtml(row) +
-                    '</thead>' :
-                '') +
-            '</table>' +
-            '</div>' +
-            '</div>';
-    };
-    DayGrid.prototype.getIsNumbersVisible = function () {
-        return this.getIsDayNumbersVisible() || this.cellWeekNumbersVisible;
-    };
-    DayGrid.prototype.getIsDayNumbersVisible = function () {
-        return this.rowCnt > 1;
-    };
-    /* Grid Number Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.renderNumberTrHtml = function (row) {
-        return '' +
-            '<tr>' +
-            (this.isRTL ? '' : this.renderNumberIntroHtml(row)) +
-            this.renderNumberCellsHtml(row) +
-            (this.isRTL ? this.renderNumberIntroHtml(row) : '') +
-            '</tr>';
-    };
-    DayGrid.prototype.renderNumberIntroHtml = function (row) {
-        return this.renderIntroHtml();
-    };
-    DayGrid.prototype.renderNumberCellsHtml = function (row) {
-        var htmls = [];
-        var col;
-        var date;
-        for (col = 0; col < this.colCnt; col++) {
-            date = this.getCellDate(row, col);
-            htmls.push(this.renderNumberCellHtml(date));
-        }
-        return htmls.join('');
-    };
-    // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
-    // The number row will only exist if either day numbers or week numbers are turned on.
-    DayGrid.prototype.renderNumberCellHtml = function (date) {
-        var view = this.view;
-        var html = '';
-        var isDateValid = this.dateProfile.activeUnzonedRange.containsDate(date); // TODO: called too frequently. cache somehow.
-        var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
-        var classes;
-        var weekCalcFirstDoW;
-        if (!isDayNumberVisible && !this.cellWeekNumbersVisible) {
-            // no numbers in day cell (week number must be along the side)
-            return '<td/>'; //  will create an empty space above events :(
-        }
-        classes = this.getDayClasses(date);
-        classes.unshift('fc-day-top');
-        if (this.cellWeekNumbersVisible) {
-            // To determine the day of week number change under ISO, we cannot
-            // rely on moment.js methods such as firstDayOfWeek() or weekday(),
-            // because they rely on the locale's dow (possibly overridden by
-            // our firstDay option), which may not be Monday. We cannot change
-            // dow, because that would affect the calendar start day as well.
-            if (date._locale._fullCalendar_weekCalc === 'ISO') {
-                weekCalcFirstDoW = 1; // Monday by ISO 8601 definition
-            }
-            else {
-                weekCalcFirstDoW = date._locale.firstDayOfWeek();
-            }
-        }
-        html += '<td class="' + classes.join(' ') + '"' +
-            (isDateValid ?
-                ' data-date="' + date.format() + '"' :
-                '') +
-            '>';
-        if (this.cellWeekNumbersVisible && (date.day() === weekCalcFirstDoW)) {
-            html += view.buildGotoAnchorHtml({ date: date, type: 'week' }, { 'class': 'fc-week-number' }, date.format('w') // inner HTML
-            );
-        }
-        if (isDayNumberVisible) {
-            html += view.buildGotoAnchorHtml(date, { 'class': 'fc-day-number' }, date.format('D') // inner HTML
-            );
-        }
-        html += '</td>';
-        return html;
-    };
-    /* Hit System
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.prepareHits = function () {
-        this.colCoordCache.build();
-        this.rowCoordCache.build();
-        this.rowCoordCache.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
-    };
-    DayGrid.prototype.releaseHits = function () {
-        this.colCoordCache.clear();
-        this.rowCoordCache.clear();
-    };
-    DayGrid.prototype.queryHit = function (leftOffset, topOffset) {
-        if (this.colCoordCache.isLeftInBounds(leftOffset) && this.rowCoordCache.isTopInBounds(topOffset)) {
-            var col = this.colCoordCache.getHorizontalIndex(leftOffset);
-            var row = this.rowCoordCache.getVerticalIndex(topOffset);
-            if (row != null && col != null) {
-                return this.getCellHit(row, col);
-            }
-        }
-    };
-    DayGrid.prototype.getHitFootprint = function (hit) {
-        var range = this.getCellRange(hit.row, hit.col);
-        return new ComponentFootprint_1.default(new UnzonedRange_1.default(range.start, range.end), true // all-day?
-        );
-    };
-    DayGrid.prototype.getHitEl = function (hit) {
-        return this.getCellEl(hit.row, hit.col);
-    };
-    /* Cell System
-    ------------------------------------------------------------------------------------------------------------------*/
-    // FYI: the first column is the leftmost column, regardless of date
-    DayGrid.prototype.getCellHit = function (row, col) {
-        return {
-            row: row,
-            col: col,
-            component: this,
-            left: this.colCoordCache.getLeftOffset(col),
-            right: this.colCoordCache.getRightOffset(col),
-            top: this.rowCoordCache.getTopOffset(row),
-            bottom: this.rowCoordCache.getBottomOffset(row)
-        };
-    };
-    DayGrid.prototype.getCellEl = function (row, col) {
-        return this.cellEls.eq(row * this.colCnt + col);
-    };
-    /* Event Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Unrenders all events currently rendered on the grid
-    DayGrid.prototype.executeEventUnrender = function () {
-        this.removeSegPopover(); // removes the "more.." events popover
-        _super.prototype.executeEventUnrender.call(this);
-    };
-    // Retrieves all rendered segment objects currently rendered on the grid
-    DayGrid.prototype.getOwnEventSegs = function () {
-        // append the segments from the "more..." popover
-        return _super.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs || []);
-    };
-    /* Event Drag Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of an event or external element being dragged.
-    // `eventLocation` has zoned start and end (optional)
-    DayGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {
-        var i;
-        for (i = 0; i < eventFootprints.length; i++) {
-            this.renderHighlight(eventFootprints[i].componentFootprint);
-        }
-        // render drags from OTHER components as helpers
-        if (eventFootprints.length && seg && seg.component !== this) {
-            this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);
-            return true; // signal helpers rendered
-        }
-    };
-    // Unrenders any visual indication of a hovering event
-    DayGrid.prototype.unrenderDrag = function () {
-        this.unrenderHighlight();
-        this.helperRenderer.unrender();
-    };
-    /* Event Resize Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of an event being resized
-    DayGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {
-        var i;
-        for (i = 0; i < eventFootprints.length; i++) {
-            this.renderHighlight(eventFootprints[i].componentFootprint);
-        }
-        this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);
-    };
-    // Unrenders a visual indication of an event being resized
-    DayGrid.prototype.unrenderEventResize = function () {
-        this.unrenderHighlight();
-        this.helperRenderer.unrender();
-    };
-    /* More+ Link Popover
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.removeSegPopover = function () {
-        if (this.segPopover) {
-            this.segPopover.hide(); // in handler, will call segPopover's removeElement
-        }
-    };
-    // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
-    // `levelLimit` can be false (don't limit), a number, or true (should be computed).
-    DayGrid.prototype.limitRows = function (levelLimit) {
-        var rowStructs = this.eventRenderer.rowStructs || [];
-        var row; // row #
-        var rowLevelLimit;
-        for (row = 0; row < rowStructs.length; row++) {
-            this.unlimitRow(row);
-            if (!levelLimit) {
-                rowLevelLimit = false;
-            }
-            else if (typeof levelLimit === 'number') {
-                rowLevelLimit = levelLimit;
-            }
-            else {
-                rowLevelLimit = this.computeRowLevelLimit(row);
-            }
-            if (rowLevelLimit !== false) {
-                this.limitRow(row, rowLevelLimit);
-            }
-        }
-    };
-    // Computes the number of levels a row will accomodate without going outside its bounds.
-    // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
-    // `row` is the row number.
-    DayGrid.prototype.computeRowLevelLimit = function (row) {
-        var rowEl = this.rowEls.eq(row); // the containing "fake" row div
-        var rowHeight = rowEl.height(); // TODO: cache somehow?
-        var trEls = this.eventRenderer.rowStructs[row].tbodyEl.children();
-        var i;
-        var trEl;
-        var trHeight;
-        function iterInnerHeights(i, childNode) {
-            trHeight = Math.max(trHeight, $(childNode).outerHeight());
-        }
-        // Reveal one level <tr> at a time and stop when we find one out of bounds
-        for (i = 0; i < trEls.length; i++) {
-            trEl = trEls.eq(i).removeClass('fc-limited'); // reset to original state (reveal)
-            // with rowspans>1 and IE8, trEl.outerHeight() would return the height of the largest cell,
-            // so instead, find the tallest inner content element.
-            trHeight = 0;
-            trEl.find('> td > :first-child').each(iterInnerHeights);
-            if (trEl.position().top + trHeight > rowHeight) {
-                return i;
-            }
-        }
-        return false; // should not limit at all
-    };
-    // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
-    // `row` is the row number.
-    // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
-    DayGrid.prototype.limitRow = function (row, levelLimit) {
-        var _this = this;
-        var rowStruct = this.eventRenderer.rowStructs[row];
-        var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
-        var col = 0; // col #, left-to-right (not chronologically)
-        var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
-        var cellMatrix; // a matrix (by level, then column) of all <td> jQuery elements in the row
-        var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
-        var i;
-        var seg;
-        var segsBelow; // array of segment objects below `seg` in the current `col`
-        var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
-        var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
-        var td;
-        var rowspan;
-        var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
-        var j;
-        var moreTd;
-        var moreWrap;
-        var moreLink;
-        // Iterates through empty level cells and places "more" links inside if need be
-        var emptyCellsUntil = function (endCol) {
-            while (col < endCol) {
-                segsBelow = _this.getCellSegs(row, col, levelLimit);
-                if (segsBelow.length) {
-                    td = cellMatrix[levelLimit - 1][col];
-                    moreLink = _this.renderMoreLink(row, col, segsBelow);
-                    moreWrap = $('<div/>').append(moreLink);
-                    td.append(moreWrap);
-                    moreNodes.push(moreWrap[0]);
-                }
-                col++;
-            }
-        };
-        if (levelLimit && levelLimit < rowStruct.segLevels.length) {
-            levelSegs = rowStruct.segLevels[levelLimit - 1];
-            cellMatrix = rowStruct.cellMatrix;
-            limitedNodes = rowStruct.tbodyEl.children().slice(levelLimit) // get level <tr> elements past the limit
-                .addClass('fc-limited').get(); // hide elements and get a simple DOM-nodes array
-            // iterate though segments in the last allowable level
-            for (i = 0; i < levelSegs.length; i++) {
-                seg = levelSegs[i];
-                emptyCellsUntil(seg.leftCol); // process empty cells before the segment
-                // determine *all* segments below `seg` that occupy the same columns
-                colSegsBelow = [];
-                totalSegsBelow = 0;
-                while (col <= seg.rightCol) {
-                    segsBelow = this.getCellSegs(row, col, levelLimit);
-                    colSegsBelow.push(segsBelow);
-                    totalSegsBelow += segsBelow.length;
-                    col++;
-                }
-                if (totalSegsBelow) {
-                    td = cellMatrix[levelLimit - 1][seg.leftCol]; // the segment's parent cell
-                    rowspan = td.attr('rowspan') || 1;
-                    segMoreNodes = [];
-                    // make a replacement <td> for each column the segment occupies. will be one for each colspan
-                    for (j = 0; j < colSegsBelow.length; j++) {
-                        moreTd = $('<td class="fc-more-cell"/>').attr('rowspan', rowspan);
-                        segsBelow = colSegsBelow[j];
-                        moreLink = this.renderMoreLink(row, seg.leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
-                        );
-                        moreWrap = $('<div/>').append(moreLink);
-                        moreTd.append(moreWrap);
-                        segMoreNodes.push(moreTd[0]);
-                        moreNodes.push(moreTd[0]);
-                    }
-                    td.addClass('fc-limited').after($(segMoreNodes)); // hide original <td> and inject replacements
-                    limitedNodes.push(td[0]);
-                }
-            }
-            emptyCellsUntil(this.colCnt); // finish off the level
-            rowStruct.moreEls = $(moreNodes); // for easy undoing later
-            rowStruct.limitedEls = $(limitedNodes); // for easy undoing later
-        }
-    };
-    // Reveals all levels and removes all "more"-related elements for a grid's row.
-    // `row` is a row number.
-    DayGrid.prototype.unlimitRow = function (row) {
-        var rowStruct = this.eventRenderer.rowStructs[row];
-        if (rowStruct.moreEls) {
-            rowStruct.moreEls.remove();
-            rowStruct.moreEls = null;
-        }
-        if (rowStruct.limitedEls) {
-            rowStruct.limitedEls.removeClass('fc-limited');
-            rowStruct.limitedEls = null;
-        }
-    };
-    // Renders an <a> element that represents hidden event element for a cell.
-    // Responsible for attaching click handler as well.
-    DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
-        var _this = this;
-        var view = this.view;
-        return $('<a class="fc-more"/>')
-            .text(this.getMoreLinkText(hiddenSegs.length))
-            .on('click', function (ev) {
-            var clickOption = _this.opt('eventLimitClick');
-            var date = _this.getCellDate(row, col);
-            var moreEl = $(ev.currentTarget);
-            var dayEl = _this.getCellEl(row, col);
-            var allSegs = _this.getCellSegs(row, col);
-            // rescope the segments to be within the cell's date
-            var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
-            var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
-            if (typeof clickOption === 'function') {
-                // the returned value can be an atomic option
-                clickOption = _this.publiclyTrigger('eventLimitClick', {
-                    context: view,
-                    args: [
-                        {
-                            date: date.clone(),
-                            dayEl: dayEl,
-                            moreEl: moreEl,
-                            segs: reslicedAllSegs,
-                            hiddenSegs: reslicedHiddenSegs
-                        },
-                        ev,
-                        view
-                    ]
-                });
-            }
-            if (clickOption === 'popover') {
-                _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
-            }
-            else if (typeof clickOption === 'string') {
-                view.calendar.zoomTo(date, clickOption);
-            }
-        });
-    };
-    // Reveals the popover that displays all events within a cell
-    DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
-        var _this = this;
-        var view = this.view;
-        var moreWrap = moreLink.parent(); // the <div> wrapper around the <a>
-        var topEl; // the element we want to match the top coordinate of
-        var options;
-        if (this.rowCnt === 1) {
-            topEl = view.el; // will cause the popover to cover any sort of header
-        }
-        else {
-            topEl = this.rowEls.eq(row); // will align with top of row
-        }
-        options = {
-            className: 'fc-more-popover ' + view.calendar.theme.getClass('popover'),
-            content: this.renderSegPopoverContent(row, col, segs),
-            parentEl: view.el,
-            top: topEl.offset().top,
-            autoHide: true,
-            viewportConstrain: this.opt('popoverViewportConstrain'),
-            hide: function () {
-                // kill everything when the popover is hidden
-                // notify events to be removed
-                if (_this.popoverSegs) {
-                    _this.triggerBeforeEventSegsDestroyed(_this.popoverSegs);
-                }
-                _this.segPopover.removeElement();
-                _this.segPopover = null;
-                _this.popoverSegs = null;
-            }
-        };
-        // Determine horizontal coordinate.
-        // We use the moreWrap instead of the <td> to avoid border confusion.
-        if (this.isRTL) {
-            options.right = moreWrap.offset().left + moreWrap.outerWidth() + 1; // +1 to be over cell border
-        }
-        else {
-            options.left = moreWrap.offset().left - 1; // -1 to be over cell border
-        }
-        this.segPopover = new Popover_1.default(options);
-        this.segPopover.show();
-        // the popover doesn't live within the grid's container element, and thus won't get the event
-        // delegated-handlers for free. attach event-related handlers to the popover.
-        this.bindAllSegHandlersToEl(this.segPopover.el);
-        this.triggerAfterEventSegsRendered(segs);
-    };
-    // Builds the inner DOM contents of the segment popover
-    DayGrid.prototype.renderSegPopoverContent = function (row, col, segs) {
-        var view = this.view;
-        var theme = view.calendar.theme;
-        var title = this.getCellDate(row, col).format(this.opt('dayPopoverFormat'));
-        var content = $('<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
-            '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
-            '<span class="fc-title">' +
-            util_1.htmlEscape(title) +
-            '</span>' +
-            '<div class="fc-clear"/>' +
-            '</div>' +
-            '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
-            '<div class="fc-event-container"></div>' +
-            '</div>');
-        var segContainer = content.find('.fc-event-container');
-        var i;
-        // render each seg's `el` and only return the visible segs
-        segs = this.eventRenderer.renderFgSegEls(segs, true); // disableResizing=true
-        this.popoverSegs = segs;
-        for (i = 0; i < segs.length; i++) {
-            // because segments in the popover are not part of a grid coordinate system, provide a hint to any
-            // grids that want to do drag-n-drop about which cell it came from
-            this.hitsNeeded();
-            segs[i].hit = this.getCellHit(row, col);
-            this.hitsNotNeeded();
-            segContainer.append(segs[i].el);
-        }
-        return content;
-    };
-    // Given the events within an array of segment objects, reslice them to be in a single day
-    DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
-        var dayStart = dayDate.clone();
-        var dayEnd = dayStart.clone().add(1, 'days');
-        var dayRange = new UnzonedRange_1.default(dayStart, dayEnd);
-        var newSegs = [];
-        var i;
-        var seg;
-        var slicedRange;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            slicedRange = seg.footprint.componentFootprint.unzonedRange.intersect(dayRange);
-            if (slicedRange) {
-                newSegs.push($.extend({}, seg, {
-                    footprint: new EventFootprint_1.default(new ComponentFootprint_1.default(slicedRange, seg.footprint.componentFootprint.isAllDay), seg.footprint.eventDef, seg.footprint.eventInstance),
-                    isStart: seg.isStart && slicedRange.isStart,
-                    isEnd: seg.isEnd && slicedRange.isEnd
-                }));
-            }
-        }
-        // force an order because eventsToSegs doesn't guarantee one
-        // TODO: research if still needed
-        this.eventRenderer.sortEventSegs(newSegs);
-        return newSegs;
-    };
-    // Generates the text that should be inside a "more" link, given the number of events it represents
-    DayGrid.prototype.getMoreLinkText = function (num) {
-        var opt = this.opt('eventLimitText');
-        if (typeof opt === 'function') {
-            return opt(num);
-        }
-        else {
-            return '+' + num + ' ' + opt;
-        }
-    };
-    // Returns segments within a given cell.
-    // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
-    DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
-        var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
-        var level = startLevel || 0;
-        var segs = [];
-        var seg;
-        while (level < segMatrix.length) {
-            seg = segMatrix[level][col];
-            if (seg) {
-                segs.push(seg);
-            }
-            level++;
-        }
-        return segs;
-    };
-    return DayGrid;
-}(InteractiveDateComponent_1.default));
-exports.default = DayGrid;
-DayGrid.prototype.eventRendererClass = DayGridEventRenderer_1.default;
-DayGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;
-DayGrid.prototype.helperRendererClass = DayGridHelperRenderer_1.default;
-DayGrid.prototype.fillRendererClass = DayGridFillRenderer_1.default;
-StandardInteractionsMixin_1.default.mixInto(DayGrid);
-DayTableMixin_1.default.mixInto(DayGrid);
-
-
-/***/ }),
-/* 62 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var Scroller_1 = __webpack_require__(39);
-var View_1 = __webpack_require__(41);
-var BasicViewDateProfileGenerator_1 = __webpack_require__(228);
-var DayGrid_1 = __webpack_require__(61);
-/* An abstract class for the "basic" views, as well as month view. Renders one or more rows of day cells.
-----------------------------------------------------------------------------------------------------------------------*/
-// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
-// It is responsible for managing width/height.
-var BasicView = /** @class */ (function (_super) {
-    tslib_1.__extends(BasicView, _super);
-    function BasicView(calendar, viewSpec) {
-        var _this = _super.call(this, calendar, viewSpec) || this;
-        _this.dayGrid = _this.instantiateDayGrid();
-        _this.dayGrid.isRigid = _this.hasRigidRows();
-        if (_this.opt('weekNumbers')) {
-            if (_this.opt('weekNumbersWithinDays')) {
-                _this.dayGrid.cellWeekNumbersVisible = true;
-                _this.dayGrid.colWeekNumbersVisible = false;
-            }
-            else {
-                _this.dayGrid.cellWeekNumbersVisible = false;
-                _this.dayGrid.colWeekNumbersVisible = true;
-            }
-        }
-        _this.addChild(_this.dayGrid);
-        _this.scroller = new Scroller_1.default({
-            overflowX: 'hidden',
-            overflowY: 'auto'
-        });
-        return _this;
-    }
-    // Generates the DayGrid object this view needs. Draws from this.dayGridClass
-    BasicView.prototype.instantiateDayGrid = function () {
-        // generate a subclass on the fly with BasicView-specific behavior
-        // TODO: cache this subclass
-        var subclass = makeDayGridSubclass(this.dayGridClass);
-        return new subclass(this);
-    };
-    BasicView.prototype.executeDateRender = function (dateProfile) {
-        this.dayGrid.breakOnWeeks = /year|month|week/.test(dateProfile.currentRangeUnit);
-        _super.prototype.executeDateRender.call(this, dateProfile);
-    };
-    BasicView.prototype.renderSkeleton = function () {
-        var dayGridContainerEl;
-        var dayGridEl;
-        this.el.addClass('fc-basic-view').html(this.renderSkeletonHtml());
-        this.scroller.render();
-        dayGridContainerEl = this.scroller.el.addClass('fc-day-grid-container');
-        dayGridEl = $('<div class="fc-day-grid" />').appendTo(dayGridContainerEl);
-        this.el.find('.fc-body > tr > td').append(dayGridContainerEl);
-        this.dayGrid.headContainerEl = this.el.find('.fc-head-container');
-        this.dayGrid.setElement(dayGridEl);
-    };
-    BasicView.prototype.unrenderSkeleton = function () {
-        this.dayGrid.removeElement();
-        this.scroller.destroy();
-    };
-    // Builds the HTML skeleton for the view.
-    // The day-grid component will render inside of a container defined by this HTML.
-    BasicView.prototype.renderSkeletonHtml = function () {
-        var theme = this.calendar.theme;
-        return '' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            (this.opt('columnHeader') ?
-                '<thead class="fc-head">' +
-                    '<tr>' +
-                    '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
-                    '</tr>' +
-                    '</thead>' :
-                '') +
-            '<tbody class="fc-body">' +
-            '<tr>' +
-            '<td class="' + theme.getClass('widgetContent') + '"></td>' +
-            '</tr>' +
-            '</tbody>' +
-            '</table>';
-    };
-    // Generates an HTML attribute string for setting the width of the week number column, if it is known
-    BasicView.prototype.weekNumberStyleAttr = function () {
-        if (this.weekNumberWidth != null) {
-            return 'style="width:' + this.weekNumberWidth + 'px"';
-        }
-        return '';
-    };
-    // Determines whether each row should have a constant height
-    BasicView.prototype.hasRigidRows = function () {
-        var eventLimit = this.opt('eventLimit');
-        return eventLimit && typeof eventLimit !== 'number';
-    };
-    /* Dimensions
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Refreshes the horizontal dimensions of the view
-    BasicView.prototype.updateSize = function (totalHeight, isAuto, isResize) {
-        var eventLimit = this.opt('eventLimit');
-        var headRowEl = this.dayGrid.headContainerEl.find('.fc-row');
-        var scrollerHeight;
-        var scrollbarWidths;
-        // hack to give the view some height prior to dayGrid's columns being rendered
-        // TODO: separate setting height from scroller VS dayGrid.
-        if (!this.dayGrid.rowEls) {
-            if (!isAuto) {
-                scrollerHeight = this.computeScrollerHeight(totalHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            return;
-        }
-        _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);
-        if (this.dayGrid.colWeekNumbersVisible) {
-            // Make sure all week number cells running down the side have the same width.
-            // Record the width for cells created later.
-            this.weekNumberWidth = util_1.matchCellWidths(this.el.find('.fc-week-number'));
-        }
-        // reset all heights to be natural
-        this.scroller.clear();
-        util_1.uncompensateScroll(headRowEl);
-        this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
-        // is the event limit a constant level number?
-        if (eventLimit && typeof eventLimit === 'number') {
-            this.dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
-        }
-        // distribute the height to the rows
-        // (totalHeight is a "recommended" value if isAuto)
-        scrollerHeight = this.computeScrollerHeight(totalHeight);
-        this.setGridHeight(scrollerHeight, isAuto);
-        // is the event limit dynamically calculated?
-        if (eventLimit && typeof eventLimit !== 'number') {
-            this.dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
-        }
-        if (!isAuto) {
-            this.scroller.setHeight(scrollerHeight);
-            scrollbarWidths = this.scroller.getScrollbarWidths();
-            if (scrollbarWidths.left || scrollbarWidths.right) {
-                util_1.compensateScroll(headRowEl, scrollbarWidths);
-                // doing the scrollbar compensation might have created text overflow which created more height. redo
-                scrollerHeight = this.computeScrollerHeight(totalHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            // guarantees the same scrollbar widths
-            this.scroller.lockOverflow(scrollbarWidths);
-        }
-    };
-    // given a desired total height of the view, returns what the height of the scroller should be
-    BasicView.prototype.computeScrollerHeight = function (totalHeight) {
-        return totalHeight -
-            util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-    };
-    // Sets the height of just the DayGrid component in this view
-    BasicView.prototype.setGridHeight = function (height, isAuto) {
-        if (isAuto) {
-            util_1.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
-        }
-        else {
-            util_1.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
-        }
-    };
-    /* Scroll
-    ------------------------------------------------------------------------------------------------------------------*/
-    BasicView.prototype.computeInitialDateScroll = function () {
-        return { top: 0 };
-    };
-    BasicView.prototype.queryDateScroll = function () {
-        return { top: this.scroller.getScrollTop() };
-    };
-    BasicView.prototype.applyDateScroll = function (scroll) {
-        if (scroll.top !== undefined) {
-            this.scroller.setScrollTop(scroll.top);
-        }
-    };
-    return BasicView;
-}(View_1.default));
-exports.default = BasicView;
-BasicView.prototype.dateProfileGeneratorClass = BasicViewDateProfileGenerator_1.default;
-BasicView.prototype.dayGridClass = DayGrid_1.default;
-// customize the rendering behavior of BasicView's dayGrid
-function makeDayGridSubclass(SuperClass) {
-    return /** @class */ (function (_super) {
-        tslib_1.__extends(SubClass, _super);
-        function SubClass() {
-            var _this = _super !== null && _super.apply(this, arguments) || this;
-            _this.colWeekNumbersVisible = false; // display week numbers along the side?
-            return _this;
-        }
-        // Generates the HTML that will go before the day-of week header cells
-        SubClass.prototype.renderHeadIntroHtml = function () {
-            var view = this.view;
-            if (this.colWeekNumbersVisible) {
-                return '' +
-                    '<th class="fc-week-number ' + view.calendar.theme.getClass('widgetHeader') + '" ' + view.weekNumberStyleAttr() + '>' +
-                    '<span>' + // needed for matchCellWidths
-                    util_1.htmlEscape(this.opt('weekNumberTitle')) +
-                    '</span>' +
-                    '</th>';
-            }
-            return '';
-        };
-        // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
-        SubClass.prototype.renderNumberIntroHtml = function (row) {
-            var view = this.view;
-            var weekStart = this.getCellDate(row, 0);
-            if (this.colWeekNumbersVisible) {
-                return '' +
-                    '<td class="fc-week-number" ' + view.weekNumberStyleAttr() + '>' +
-                    view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
-                    { date: weekStart, type: 'week', forceOff: this.colCnt === 1 }, weekStart.format('w') // inner HTML
-                    ) +
-                    '</td>';
-            }
-            return '';
-        };
-        // Generates the HTML that goes before the day bg cells for each day-row
-        SubClass.prototype.renderBgIntroHtml = function () {
-            var view = this.view;
-            if (this.colWeekNumbersVisible) {
-                return '<td class="fc-week-number ' + view.calendar.theme.getClass('widgetContent') + '" ' +
-                    view.weekNumberStyleAttr() + '></td>';
-            }
-            return '';
-        };
-        // Generates the HTML that goes before every other type of row generated by DayGrid.
-        // Affects helper-skeleton and highlight-skeleton rows.
-        SubClass.prototype.renderIntroHtml = function () {
-            var view = this.view;
-            if (this.colWeekNumbersVisible) {
-                return '<td class="fc-week-number" ' + view.weekNumberStyleAttr() + '></td>';
-            }
-            return '';
-        };
-        SubClass.prototype.getIsNumbersVisible = function () {
-            return DayGrid_1.default.prototype.getIsNumbersVisible.apply(this, arguments) || this.colWeekNumbersVisible;
-        };
-        return SubClass;
-    }(SuperClass));
-}
-
-
-/***/ }),
-/* 63 */,
-/* 64 */,
-/* 65 */,
-/* 66 */,
-/* 67 */,
-/* 68 */,
-/* 69 */,
-/* 70 */,
-/* 71 */,
-/* 72 */,
-/* 73 */,
-/* 74 */,
-/* 75 */,
-/* 76 */,
-/* 77 */,
-/* 78 */,
-/* 79 */,
-/* 80 */,
-/* 81 */,
-/* 82 */,
-/* 83 */,
-/* 84 */,
-/* 85 */,
-/* 86 */,
-/* 87 */,
-/* 88 */,
-/* 89 */,
-/* 90 */,
-/* 91 */,
-/* 92 */,
-/* 93 */,
-/* 94 */,
-/* 95 */,
-/* 96 */,
-/* 97 */,
-/* 98 */,
-/* 99 */,
-/* 100 */,
-/* 101 */,
-/* 102 */,
-/* 103 */,
-/* 104 */,
-/* 105 */,
-/* 106 */,
-/* 107 */,
-/* 108 */,
-/* 109 */,
-/* 110 */,
-/* 111 */,
-/* 112 */,
-/* 113 */,
-/* 114 */,
-/* 115 */,
-/* 116 */,
-/* 117 */,
-/* 118 */,
-/* 119 */,
-/* 120 */,
-/* 121 */,
-/* 122 */,
-/* 123 */,
-/* 124 */,
-/* 125 */,
-/* 126 */,
-/* 127 */,
-/* 128 */,
-/* 129 */,
-/* 130 */,
-/* 131 */,
-/* 132 */,
-/* 133 */,
-/* 134 */,
-/* 135 */,
-/* 136 */,
-/* 137 */,
-/* 138 */,
-/* 139 */,
-/* 140 */,
-/* 141 */,
-/* 142 */,
-/* 143 */,
-/* 144 */,
-/* 145 */,
-/* 146 */,
-/* 147 */,
-/* 148 */,
-/* 149 */,
-/* 150 */,
-/* 151 */,
-/* 152 */,
-/* 153 */,
-/* 154 */,
-/* 155 */,
-/* 156 */,
-/* 157 */,
-/* 158 */,
-/* 159 */,
-/* 160 */,
-/* 161 */,
-/* 162 */,
-/* 163 */,
-/* 164 */,
-/* 165 */,
-/* 166 */,
-/* 167 */,
-/* 168 */,
-/* 169 */,
-/* 170 */,
-/* 171 */,
-/* 172 */,
-/* 173 */,
-/* 174 */,
-/* 175 */,
-/* 176 */,
-/* 177 */,
-/* 178 */,
-/* 179 */,
-/* 180 */,
-/* 181 */,
-/* 182 */,
-/* 183 */,
-/* 184 */,
-/* 185 */,
-/* 186 */,
-/* 187 */,
-/* 188 */,
-/* 189 */,
-/* 190 */,
-/* 191 */,
-/* 192 */,
-/* 193 */,
-/* 194 */,
-/* 195 */,
-/* 196 */,
-/* 197 */,
-/* 198 */,
-/* 199 */,
-/* 200 */,
-/* 201 */,
-/* 202 */,
-/* 203 */,
-/* 204 */,
-/* 205 */,
-/* 206 */,
-/* 207 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var UnzonedRange_1 = __webpack_require__(5);
-var ComponentFootprint_1 = __webpack_require__(12);
-var EventDefParser_1 = __webpack_require__(49);
-var EventSource_1 = __webpack_require__(6);
-var util_1 = __webpack_require__(35);
-var Constraints = /** @class */ (function () {
-    function Constraints(eventManager, _calendar) {
-        this.eventManager = eventManager;
-        this._calendar = _calendar;
-    }
-    Constraints.prototype.opt = function (name) {
-        return this._calendar.opt(name);
-    };
-    /*
-    determines if eventInstanceGroup is allowed,
-    in relation to other EVENTS and business hours.
-    */
-    Constraints.prototype.isEventInstanceGroupAllowed = function (eventInstanceGroup) {
-        var eventDef = eventInstanceGroup.getEventDef();
-        var eventFootprints = this.eventRangesToEventFootprints(eventInstanceGroup.getAllEventRanges());
-        var i;
-        var peerEventInstances = this.getPeerEventInstances(eventDef);
-        var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);
-        var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);
-        var constraintVal = eventDef.getConstraint();
-        var overlapVal = eventDef.getOverlap();
-        var eventAllowFunc = this.opt('eventAllow');
-        for (i = 0; i < eventFootprints.length; i++) {
-            if (!this.isFootprintAllowed(eventFootprints[i].componentFootprint, peerEventFootprints, constraintVal, overlapVal, eventFootprints[i].eventInstance)) {
-                return false;
-            }
-        }
-        if (eventAllowFunc) {
-            for (i = 0; i < eventFootprints.length; i++) {
-                if (eventAllowFunc(eventFootprints[i].componentFootprint.toLegacy(this._calendar), eventFootprints[i].getEventLegacy()) === false) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    };
-    Constraints.prototype.getPeerEventInstances = function (eventDef) {
-        return this.eventManager.getEventInstancesWithoutId(eventDef.id);
-    };
-    Constraints.prototype.isSelectionFootprintAllowed = function (componentFootprint) {
-        var peerEventInstances = this.eventManager.getEventInstances();
-        var peerEventRanges = peerEventInstances.map(util_1.eventInstanceToEventRange);
-        var peerEventFootprints = this.eventRangesToEventFootprints(peerEventRanges);
-        var selectAllowFunc;
-        if (this.isFootprintAllowed(componentFootprint, peerEventFootprints, this.opt('selectConstraint'), this.opt('selectOverlap'))) {
-            selectAllowFunc = this.opt('selectAllow');
-            if (selectAllowFunc) {
-                return selectAllowFunc(componentFootprint.toLegacy(this._calendar)) !== false;
-            }
-            else {
-                return true;
-            }
-        }
-        return false;
-    };
-    Constraints.prototype.isFootprintAllowed = function (componentFootprint, peerEventFootprints, constraintVal, overlapVal, subjectEventInstance // optional
-    ) {
-        var constraintFootprints; // ComponentFootprint[]
-        var overlapEventFootprints; // EventFootprint[]
-        if (constraintVal != null) {
-            constraintFootprints = this.constraintValToFootprints(constraintVal, componentFootprint.isAllDay);
-            if (!this.isFootprintWithinConstraints(componentFootprint, constraintFootprints)) {
-                return false;
-            }
-        }
-        overlapEventFootprints = this.collectOverlapEventFootprints(peerEventFootprints, componentFootprint);
-        if (overlapVal === false) {
-            if (overlapEventFootprints.length) {
-                return false;
-            }
-        }
-        else if (typeof overlapVal === 'function') {
-            if (!isOverlapsAllowedByFunc(overlapEventFootprints, overlapVal, subjectEventInstance)) {
-                return false;
-            }
-        }
-        if (subjectEventInstance) {
-            if (!isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance)) {
-                return false;
-            }
-        }
-        return true;
-    };
-    // Constraint
-    // ------------------------------------------------------------------------------------------------
-    Constraints.prototype.isFootprintWithinConstraints = function (componentFootprint, constraintFootprints) {
-        var i;
-        for (i = 0; i < constraintFootprints.length; i++) {
-            if (this.footprintContainsFootprint(constraintFootprints[i], componentFootprint)) {
-                return true;
-            }
-        }
-        return false;
-    };
-    Constraints.prototype.constraintValToFootprints = function (constraintVal, isAllDay) {
-        var eventInstances;
-        if (constraintVal === 'businessHours') {
-            return this.buildCurrentBusinessFootprints(isAllDay);
-        }
-        else if (typeof constraintVal === 'object') {
-            eventInstances = this.parseEventDefToInstances(constraintVal); // handles recurring events
-            if (!eventInstances) {
-                return this.parseFootprints(constraintVal);
-            }
-            else {
-                return this.eventInstancesToFootprints(eventInstances);
-            }
-        }
-        else if (constraintVal != null) {
-            eventInstances = this.eventManager.getEventInstancesWithId(constraintVal);
-            return this.eventInstancesToFootprints(eventInstances);
-        }
-    };
-    // returns ComponentFootprint[]
-    // uses current view's range
-    Constraints.prototype.buildCurrentBusinessFootprints = function (isAllDay) {
-        var view = this._calendar.view;
-        var businessHourGenerator = view.get('businessHourGenerator');
-        var unzonedRange = view.dateProfile.activeUnzonedRange;
-        var eventInstanceGroup = businessHourGenerator.buildEventInstanceGroup(isAllDay, unzonedRange);
-        if (eventInstanceGroup) {
-            return this.eventInstancesToFootprints(eventInstanceGroup.eventInstances);
-        }
-        else {
-            return [];
-        }
-    };
-    // conversion util
-    Constraints.prototype.eventInstancesToFootprints = function (eventInstances) {
-        var eventRanges = eventInstances.map(util_1.eventInstanceToEventRange);
-        var eventFootprints = this.eventRangesToEventFootprints(eventRanges);
-        return eventFootprints.map(util_1.eventFootprintToComponentFootprint);
-    };
-    // Overlap
-    // ------------------------------------------------------------------------------------------------
-    Constraints.prototype.collectOverlapEventFootprints = function (peerEventFootprints, targetFootprint) {
-        var overlapEventFootprints = [];
-        var i;
-        for (i = 0; i < peerEventFootprints.length; i++) {
-            if (this.footprintsIntersect(targetFootprint, peerEventFootprints[i].componentFootprint)) {
-                overlapEventFootprints.push(peerEventFootprints[i]);
-            }
-        }
-        return overlapEventFootprints;
-    };
-    // Conversion: eventDefs -> eventInstances -> eventRanges -> eventFootprints -> componentFootprints
-    // ------------------------------------------------------------------------------------------------
-    // NOTE: this might seem like repetitive code with the Grid class, however, this code is related to
-    // constraints whereas the Grid code is related to rendering. Each approach might want to convert
-    // eventRanges -> eventFootprints in a different way. Regardless, there are opportunities to make
-    // this more DRY.
-    /*
-    Returns false on invalid input.
-    */
-    Constraints.prototype.parseEventDefToInstances = function (eventInput) {
-        var eventManager = this.eventManager;
-        var eventDef = EventDefParser_1.default.parse(eventInput, new EventSource_1.default(this._calendar));
-        if (!eventDef) {
-            return false;
-        }
-        return eventDef.buildInstances(eventManager.currentPeriod.unzonedRange);
-    };
-    Constraints.prototype.eventRangesToEventFootprints = function (eventRanges) {
-        var i;
-        var eventFootprints = [];
-        for (i = 0; i < eventRanges.length; i++) {
-            eventFootprints.push.apply(// footprints
-            eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));
-        }
-        return eventFootprints;
-    };
-    Constraints.prototype.eventRangeToEventFootprints = function (eventRange) {
-        return [util_1.eventRangeToEventFootprint(eventRange)];
-    };
-    /*
-    Parses footprints directly.
-    Very similar to EventDateProfile::parse :(
-    */
-    Constraints.prototype.parseFootprints = function (rawInput) {
-        var start;
-        var end;
-        if (rawInput.start) {
-            start = this._calendar.moment(rawInput.start);
-            if (!start.isValid()) {
-                start = null;
-            }
-        }
-        if (rawInput.end) {
-            end = this._calendar.moment(rawInput.end);
-            if (!end.isValid()) {
-                end = null;
-            }
-        }
-        return [
-            new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), (start && !start.hasTime()) || (end && !end.hasTime()) // isAllDay
-            )
-        ];
-    };
-    // Footprint Utils
-    // ----------------------------------------------------------------------------------------
-    Constraints.prototype.footprintContainsFootprint = function (outerFootprint, innerFootprint) {
-        return outerFootprint.unzonedRange.containsRange(innerFootprint.unzonedRange);
-    };
-    Constraints.prototype.footprintsIntersect = function (footprint0, footprint1) {
-        return footprint0.unzonedRange.intersectsWith(footprint1.unzonedRange);
-    };
-    return Constraints;
-}());
-exports.default = Constraints;
-// optional subjectEventInstance
-function isOverlapsAllowedByFunc(overlapEventFootprints, overlapFunc, subjectEventInstance) {
-    var i;
-    for (i = 0; i < overlapEventFootprints.length; i++) {
-        if (!overlapFunc(overlapEventFootprints[i].eventInstance.toLegacy(), subjectEventInstance ? subjectEventInstance.toLegacy() : null)) {
-            return false;
-        }
-    }
-    return true;
-}
-function isOverlapEventInstancesAllowed(overlapEventFootprints, subjectEventInstance) {
-    var subjectLegacyInstance = subjectEventInstance.toLegacy();
-    var i;
-    var overlapEventInstance;
-    var overlapEventDef;
-    var overlapVal;
-    for (i = 0; i < overlapEventFootprints.length; i++) {
-        overlapEventInstance = overlapEventFootprints[i].eventInstance;
-        overlapEventDef = overlapEventInstance.def;
-        // don't need to pass in calendar, because don't want to consider global eventOverlap property,
-        // because we already considered that earlier in the process.
-        overlapVal = overlapEventDef.getOverlap();
-        if (overlapVal === false) {
-            return false;
-        }
-        else if (typeof overlapVal === 'function') {
-            if (!overlapVal(overlapEventInstance.toLegacy(), subjectLegacyInstance)) {
-                return false;
-            }
-        }
-    }
-    return true;
-}
-
-
-/***/ }),
-/* 208 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/*
-USAGE:
-  import { default as ParsableModelMixin, ParsableModelInterface } from './ParsableModelMixin'
-in class:
-  applyProps: ParsableModelInterface['applyProps']
-  applyManualStandardProps: ParsableModelInterface['applyManualStandardProps']
-  applyMiscProps: ParsableModelInterface['applyMiscProps']
-  isStandardProp: ParsableModelInterface['isStandardProp']
-  static defineStandardProps = ParsableModelMixin.defineStandardProps
-  static copyVerbatimStandardProps = ParsableModelMixin.copyVerbatimStandardProps
-after class:
-  ParsableModelMixin.mixInto(TheClass)
-*/
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var Mixin_1 = __webpack_require__(14);
-var ParsableModelMixin = /** @class */ (function (_super) {
-    tslib_1.__extends(ParsableModelMixin, _super);
-    function ParsableModelMixin() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ParsableModelMixin.defineStandardProps = function (propDefs) {
-        var proto = this.prototype;
-        if (!proto.hasOwnProperty('standardPropMap')) {
-            proto.standardPropMap = Object.create(proto.standardPropMap);
-        }
-        util_1.copyOwnProps(propDefs, proto.standardPropMap);
-    };
-    ParsableModelMixin.copyVerbatimStandardProps = function (src, dest) {
-        var map = this.prototype.standardPropMap;
-        var propName;
-        for (propName in map) {
-            if (src[propName] != null && // in the src object?
-                map[propName] === true // false means "copy verbatim"
-            ) {
-                dest[propName] = src[propName];
-            }
-        }
-    };
-    /*
-    Returns true/false for success.
-    Meant to be only called ONCE, at object creation.
-    */
-    ParsableModelMixin.prototype.applyProps = function (rawProps) {
-        var standardPropMap = this.standardPropMap;
-        var manualProps = {};
-        var miscProps = {};
-        var propName;
-        for (propName in rawProps) {
-            if (standardPropMap[propName] === true) {
-                this[propName] = rawProps[propName];
-            }
-            else if (standardPropMap[propName] === false) {
-                manualProps[propName] = rawProps[propName];
-            }
-            else {
-                miscProps[propName] = rawProps[propName];
-            }
-        }
-        this.applyMiscProps(miscProps);
-        return this.applyManualStandardProps(manualProps);
-    };
-    /*
-    If subclasses override, they must call this supermethod and return the boolean response.
-    Meant to be only called ONCE, at object creation.
-    */
-    ParsableModelMixin.prototype.applyManualStandardProps = function (rawProps) {
-        return true;
-    };
-    /*
-    Can be called even after initial object creation.
-    */
-    ParsableModelMixin.prototype.applyMiscProps = function (rawProps) {
-        // subclasses can implement
-    };
-    /*
-    TODO: why is this a method when defineStandardProps is static
-    */
-    ParsableModelMixin.prototype.isStandardProp = function (propName) {
-        return propName in this.standardPropMap;
-    };
-    return ParsableModelMixin;
-}(Mixin_1.default));
-exports.default = ParsableModelMixin;
-ParsableModelMixin.prototype.standardPropMap = {}; // will be cloned by defineStandardProps
-
-
-/***/ }),
-/* 209 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var EventInstance = /** @class */ (function () {
-    function EventInstance(def, dateProfile) {
-        this.def = def;
-        this.dateProfile = dateProfile;
-    }
-    EventInstance.prototype.toLegacy = function () {
-        var dateProfile = this.dateProfile;
-        var obj = this.def.toLegacy();
-        obj.start = dateProfile.start.clone();
-        obj.end = dateProfile.end ? dateProfile.end.clone() : null;
-        return obj;
-    };
-    return EventInstance;
-}());
-exports.default = EventInstance;
-
-
-/***/ }),
-/* 210 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var EventDef_1 = __webpack_require__(34);
-var EventInstance_1 = __webpack_require__(209);
-var EventDateProfile_1 = __webpack_require__(17);
-var RecurringEventDef = /** @class */ (function (_super) {
-    tslib_1.__extends(RecurringEventDef, _super);
-    function RecurringEventDef() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    RecurringEventDef.prototype.isAllDay = function () {
-        return !this.startTime && !this.endTime;
-    };
-    RecurringEventDef.prototype.buildInstances = function (unzonedRange) {
-        var calendar = this.source.calendar;
-        var unzonedDate = unzonedRange.getStart();
-        var unzonedEnd = unzonedRange.getEnd();
-        var zonedDayStart;
-        var instanceStart;
-        var instanceEnd;
-        var instances = [];
-        while (unzonedDate.isBefore(unzonedEnd)) {
-            // if everyday, or this particular day-of-week
-            if (!this.dowHash || this.dowHash[unzonedDate.day()]) {
-                zonedDayStart = calendar.applyTimezone(unzonedDate);
-                instanceStart = zonedDayStart.clone();
-                instanceEnd = null;
-                if (this.startTime) {
-                    instanceStart.time(this.startTime);
-                }
-                else {
-                    instanceStart.stripTime();
-                }
-                if (this.endTime) {
-                    instanceEnd = zonedDayStart.clone().time(this.endTime);
-                }
-                instances.push(new EventInstance_1.default(this, // definition
-                new EventDateProfile_1.default(instanceStart, instanceEnd, calendar)));
-            }
-            unzonedDate.add(1, 'days');
-        }
-        return instances;
-    };
-    RecurringEventDef.prototype.setDow = function (dowNumbers) {
-        if (!this.dowHash) {
-            this.dowHash = {};
-        }
-        for (var i = 0; i < dowNumbers.length; i++) {
-            this.dowHash[dowNumbers[i]] = true;
-        }
-    };
-    RecurringEventDef.prototype.clone = function () {
-        var def = _super.prototype.clone.call(this);
-        if (def.startTime) {
-            def.startTime = moment.duration(this.startTime);
-        }
-        if (def.endTime) {
-            def.endTime = moment.duration(this.endTime);
-        }
-        if (this.dowHash) {
-            def.dowHash = $.extend({}, this.dowHash);
-        }
-        return def;
-    };
-    return RecurringEventDef;
-}(EventDef_1.default));
-exports.default = RecurringEventDef;
-/*
-HACK to work with TypeScript mixins
-NOTE: if super-method fails, should still attempt to apply
-*/
-RecurringEventDef.prototype.applyProps = function (rawProps) {
-    var superSuccess = EventDef_1.default.prototype.applyProps.call(this, rawProps);
-    if (rawProps.start) {
-        this.startTime = moment.duration(rawProps.start);
-    }
-    if (rawProps.end) {
-        this.endTime = moment.duration(rawProps.end);
-    }
-    if (rawProps.dow) {
-        this.setDow(rawProps.dow);
-    }
-    return superSuccess;
-};
-// Parsing
-// ---------------------------------------------------------------------------------------------------------------------
-RecurringEventDef.defineStandardProps({
-    start: false,
-    end: false,
-    dow: false
-});
-
-
-/***/ }),
-/* 211 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var EventRange = /** @class */ (function () {
-    function EventRange(unzonedRange, eventDef, eventInstance) {
-        this.unzonedRange = unzonedRange;
-        this.eventDef = eventDef;
-        if (eventInstance) {
-            this.eventInstance = eventInstance;
-        }
-    }
-    return EventRange;
-}());
-exports.default = EventRange;
-
-
-/***/ }),
-/* 212 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(35);
-var EventInstanceGroup_1 = __webpack_require__(18);
-var RecurringEventDef_1 = __webpack_require__(210);
-var EventSource_1 = __webpack_require__(6);
-var BUSINESS_HOUR_EVENT_DEFAULTS = {
-    start: '09:00',
-    end: '17:00',
-    dow: [1, 2, 3, 4, 5],
-    rendering: 'inverse-background'
-    // classNames are defined in businessHoursSegClasses
-};
-var BusinessHourGenerator = /** @class */ (function () {
-    function BusinessHourGenerator(rawComplexDef, calendar) {
-        this.rawComplexDef = rawComplexDef;
-        this.calendar = calendar;
-    }
-    BusinessHourGenerator.prototype.buildEventInstanceGroup = function (isAllDay, unzonedRange) {
-        var eventDefs = this.buildEventDefs(isAllDay);
-        var eventInstanceGroup;
-        if (eventDefs.length) {
-            eventInstanceGroup = new EventInstanceGroup_1.default(util_1.eventDefsToEventInstances(eventDefs, unzonedRange));
-            // so that inverse-background rendering can happen even when no eventRanges in view
-            eventInstanceGroup.explicitEventDef = eventDefs[0];
-            return eventInstanceGroup;
-        }
-    };
-    BusinessHourGenerator.prototype.buildEventDefs = function (isAllDay) {
-        var rawComplexDef = this.rawComplexDef;
-        var rawDefs = [];
-        var requireDow = false;
-        var i;
-        var defs = [];
-        if (rawComplexDef === true) {
-            rawDefs = [{}]; // will get BUSINESS_HOUR_EVENT_DEFAULTS verbatim
-        }
-        else if ($.isPlainObject(rawComplexDef)) {
-            rawDefs = [rawComplexDef];
-        }
-        else if ($.isArray(rawComplexDef)) {
-            rawDefs = rawComplexDef;
-            requireDow = true; // every sub-definition NEEDS a day-of-week
-        }
-        for (i = 0; i < rawDefs.length; i++) {
-            if (!requireDow || rawDefs[i].dow) {
-                defs.push(this.buildEventDef(isAllDay, rawDefs[i]));
-            }
-        }
-        return defs;
-    };
-    BusinessHourGenerator.prototype.buildEventDef = function (isAllDay, rawDef) {
-        var fullRawDef = $.extend({}, BUSINESS_HOUR_EVENT_DEFAULTS, rawDef);
-        if (isAllDay) {
-            fullRawDef.start = null;
-            fullRawDef.end = null;
-        }
-        return RecurringEventDef_1.default.parse(fullRawDef, new EventSource_1.default(this.calendar) // dummy source
-        );
-    };
-    return BusinessHourGenerator;
-}());
-exports.default = BusinessHourGenerator;
-
-
-/***/ }),
-/* 213 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Theme_1 = __webpack_require__(19);
-var StandardTheme = /** @class */ (function (_super) {
-    tslib_1.__extends(StandardTheme, _super);
-    function StandardTheme() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return StandardTheme;
-}(Theme_1.default));
-exports.default = StandardTheme;
-StandardTheme.prototype.classes = {
-    widget: 'fc-unthemed',
-    widgetHeader: 'fc-widget-header',
-    widgetContent: 'fc-widget-content',
-    buttonGroup: 'fc-button-group',
-    button: 'fc-button',
-    cornerLeft: 'fc-corner-left',
-    cornerRight: 'fc-corner-right',
-    stateDefault: 'fc-state-default',
-    stateActive: 'fc-state-active',
-    stateDisabled: 'fc-state-disabled',
-    stateHover: 'fc-state-hover',
-    stateDown: 'fc-state-down',
-    popoverHeader: 'fc-widget-header',
-    popoverContent: 'fc-widget-content',
-    // day grid
-    headerRow: 'fc-widget-header',
-    dayRow: 'fc-widget-content',
-    // list view
-    listView: 'fc-widget-content'
-};
-StandardTheme.prototype.baseIconClass = 'fc-icon';
-StandardTheme.prototype.iconClasses = {
-    close: 'fc-icon-x',
-    prev: 'fc-icon-left-single-arrow',
-    next: 'fc-icon-right-single-arrow',
-    prevYear: 'fc-icon-left-double-arrow',
-    nextYear: 'fc-icon-right-double-arrow'
-};
-StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
-StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
-StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
-
-/***/ }),
-/* 214 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Theme_1 = __webpack_require__(19);
-var JqueryUiTheme = /** @class */ (function (_super) {
-    tslib_1.__extends(JqueryUiTheme, _super);
-    function JqueryUiTheme() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return JqueryUiTheme;
-}(Theme_1.default));
-exports.default = JqueryUiTheme;
-JqueryUiTheme.prototype.classes = {
-    widget: 'ui-widget',
-    widgetHeader: 'ui-widget-header',
-    widgetContent: 'ui-widget-content',
-    buttonGroup: 'fc-button-group',
-    button: 'ui-button',
-    cornerLeft: 'ui-corner-left',
-    cornerRight: 'ui-corner-right',
-    stateDefault: 'ui-state-default',
-    stateActive: 'ui-state-active',
-    stateDisabled: 'ui-state-disabled',
-    stateHover: 'ui-state-hover',
-    stateDown: 'ui-state-down',
-    today: 'ui-state-highlight',
-    popoverHeader: 'ui-widget-header',
-    popoverContent: 'ui-widget-content',
-    // day grid
-    headerRow: 'ui-widget-header',
-    dayRow: 'ui-widget-content',
-    // list view
-    listView: 'ui-widget-content'
-};
-JqueryUiTheme.prototype.baseIconClass = 'ui-icon';
-JqueryUiTheme.prototype.iconClasses = {
-    close: 'ui-icon-closethick',
-    prev: 'ui-icon-circle-triangle-w',
-    next: 'ui-icon-circle-triangle-e',
-    prevYear: 'ui-icon-seek-prev',
-    nextYear: 'ui-icon-seek-next'
-};
-JqueryUiTheme.prototype.iconOverrideOption = 'themeButtonIcons';
-JqueryUiTheme.prototype.iconOverrideCustomButtonOption = 'themeIcon';
-JqueryUiTheme.prototype.iconOverridePrefix = 'ui-icon-';
-
-
-/***/ }),
-/* 215 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var Promise_1 = __webpack_require__(20);
-var EventSource_1 = __webpack_require__(6);
-var FuncEventSource = /** @class */ (function (_super) {
-    tslib_1.__extends(FuncEventSource, _super);
-    function FuncEventSource() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    FuncEventSource.parse = function (rawInput, calendar) {
-        var rawProps;
-        // normalize raw input
-        if ($.isFunction(rawInput.events)) {
-            rawProps = rawInput;
-        }
-        else if ($.isFunction(rawInput)) {
-            rawProps = { events: rawInput };
-        }
-        if (rawProps) {
-            return EventSource_1.default.parse.call(this, rawProps, calendar);
-        }
-        return false;
-    };
-    FuncEventSource.prototype.fetch = function (start, end, timezone) {
-        var _this = this;
-        this.calendar.pushLoading();
-        return Promise_1.default.construct(function (onResolve) {
-            _this.func.call(_this.calendar, start.clone(), end.clone(), timezone, function (rawEventDefs) {
-                _this.calendar.popLoading();
-                onResolve(_this.parseEventDefs(rawEventDefs));
-            });
-        });
-    };
-    FuncEventSource.prototype.getPrimitive = function () {
-        return this.func;
-    };
-    FuncEventSource.prototype.applyManualStandardProps = function (rawProps) {
-        var superSuccess = _super.prototype.applyManualStandardProps.call(this, rawProps);
-        this.func = rawProps.events;
-        return superSuccess;
-    };
-    return FuncEventSource;
-}(EventSource_1.default));
-exports.default = FuncEventSource;
-FuncEventSource.defineStandardProps({
-    events: false // don't automatically transfer
-});
-
-
-/***/ }),
-/* 216 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var Promise_1 = __webpack_require__(20);
-var EventSource_1 = __webpack_require__(6);
-var JsonFeedEventSource = /** @class */ (function (_super) {
-    tslib_1.__extends(JsonFeedEventSource, _super);
-    function JsonFeedEventSource() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    JsonFeedEventSource.parse = function (rawInput, calendar) {
-        var rawProps;
-        // normalize raw input
-        if (typeof rawInput.url === 'string') {
-            rawProps = rawInput;
-        }
-        else if (typeof rawInput === 'string') {
-            rawProps = { url: rawInput };
-        }
-        if (rawProps) {
-            return EventSource_1.default.parse.call(this, rawProps, calendar);
-        }
-        return false;
-    };
-    JsonFeedEventSource.prototype.fetch = function (start, end, timezone) {
-        var _this = this;
-        var ajaxSettings = this.ajaxSettings;
-        var onSuccess = ajaxSettings.success;
-        var onError = ajaxSettings.error;
-        var requestParams = this.buildRequestParams(start, end, timezone);
-        // todo: eventually handle the promise's then,
-        // don't intercept success/error
-        // tho will be a breaking API change
-        this.calendar.pushLoading();
-        return Promise_1.default.construct(function (onResolve, onReject) {
-            $.ajax($.extend({}, // destination
-            JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {
-                url: _this.url,
-                data: requestParams,
-                success: function (rawEventDefs, status, xhr) {
-                    var callbackRes;
-                    _this.calendar.popLoading();
-                    if (rawEventDefs) {
-                        callbackRes = util_1.applyAll(onSuccess, _this, [rawEventDefs, status, xhr]); // redirect `this`
-                        if ($.isArray(callbackRes)) {
-                            rawEventDefs = callbackRes;
-                        }
-                        onResolve(_this.parseEventDefs(rawEventDefs));
-                    }
-                    else {
-                        onReject();
-                    }
-                },
-                error: function (xhr, statusText, errorThrown) {
-                    _this.calendar.popLoading();
-                    util_1.applyAll(onError, _this, [xhr, statusText, errorThrown]); // redirect `this`
-                    onReject();
-                }
-            }));
-        });
-    };
-    JsonFeedEventSource.prototype.buildRequestParams = function (start, end, timezone) {
-        var calendar = this.calendar;
-        var ajaxSettings = this.ajaxSettings;
-        var startParam;
-        var endParam;
-        var timezoneParam;
-        var customRequestParams;
-        var params = {};
-        startParam = this.startParam;
-        if (startParam == null) {
-            startParam = calendar.opt('startParam');
-        }
-        endParam = this.endParam;
-        if (endParam == null) {
-            endParam = calendar.opt('endParam');
-        }
-        timezoneParam = this.timezoneParam;
-        if (timezoneParam == null) {
-            timezoneParam = calendar.opt('timezoneParam');
-        }
-        // retrieve any outbound GET/POST $.ajax data from the options
-        if ($.isFunction(ajaxSettings.data)) {
-            // supplied as a function that returns a key/value object
-            customRequestParams = ajaxSettings.data();
-        }
-        else {
-            // probably supplied as a straight key/value object
-            customRequestParams = ajaxSettings.data || {};
-        }
-        $.extend(params, customRequestParams);
-        params[startParam] = start.format();
-        params[endParam] = end.format();
-        if (timezone && timezone !== 'local') {
-            params[timezoneParam] = timezone;
-        }
-        return params;
-    };
-    JsonFeedEventSource.prototype.getPrimitive = function () {
-        return this.url;
-    };
-    JsonFeedEventSource.prototype.applyMiscProps = function (rawProps) {
-        this.ajaxSettings = rawProps;
-    };
-    JsonFeedEventSource.AJAX_DEFAULTS = {
-        dataType: 'json',
-        cache: false
-    };
-    return JsonFeedEventSource;
-}(EventSource_1.default));
-exports.default = JsonFeedEventSource;
-JsonFeedEventSource.defineStandardProps({
-    // automatically transfer (true)...
-    url: true,
-    startParam: true,
-    endParam: true,
-    timezoneParam: true
-});
-
-
-/***/ }),
-/* 217 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmitterMixin_1 = __webpack_require__(11);
-var TaskQueue = /** @class */ (function () {
-    function TaskQueue() {
-        this.q = [];
-        this.isPaused = false;
-        this.isRunning = false;
-    }
-    TaskQueue.prototype.queue = function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        this.q.push.apply(this.q, args); // append
-        this.tryStart();
-    };
-    TaskQueue.prototype.pause = function () {
-        this.isPaused = true;
-    };
-    TaskQueue.prototype.resume = function () {
-        this.isPaused = false;
-        this.tryStart();
-    };
-    TaskQueue.prototype.getIsIdle = function () {
-        return !this.isRunning && !this.isPaused;
-    };
-    TaskQueue.prototype.tryStart = function () {
-        if (!this.isRunning && this.canRunNext()) {
-            this.isRunning = true;
-            this.trigger('start');
-            this.runRemaining();
-        }
-    };
-    TaskQueue.prototype.canRunNext = function () {
-        return !this.isPaused && this.q.length;
-    };
-    TaskQueue.prototype.runRemaining = function () {
-        var _this = this;
-        var task;
-        var res;
-        do {
-            task = this.q.shift(); // always freshly reference q. might have been reassigned.
-            res = this.runTask(task);
-            if (res && res.then) {
-                res.then(function () {
-                    if (_this.canRunNext()) {
-                        _this.runRemaining();
-                    }
-                });
-                return; // prevent marking as stopped
-            }
-        } while (this.canRunNext());
-        this.trigger('stop'); // not really a 'stop' ... more of a 'drained'
-        this.isRunning = false;
-        // if 'stop' handler added more tasks.... TODO: write test for this
-        this.tryStart();
-    };
-    TaskQueue.prototype.runTask = function (task) {
-        return task(); // task *is* the function, but subclasses can change the format of a task
-    };
-    return TaskQueue;
-}());
-exports.default = TaskQueue;
-EmitterMixin_1.default.mixInto(TaskQueue);
-
-
-/***/ }),
-/* 218 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var TaskQueue_1 = __webpack_require__(217);
-var RenderQueue = /** @class */ (function (_super) {
-    tslib_1.__extends(RenderQueue, _super);
-    function RenderQueue(waitsByNamespace) {
-        var _this = _super.call(this) || this;
-        _this.waitsByNamespace = waitsByNamespace || {};
-        return _this;
-    }
-    RenderQueue.prototype.queue = function (taskFunc, namespace, type) {
-        var task = {
-            func: taskFunc,
-            namespace: namespace,
-            type: type
-        };
-        var waitMs;
-        if (namespace) {
-            waitMs = this.waitsByNamespace[namespace];
-        }
-        if (this.waitNamespace) {
-            if (namespace === this.waitNamespace && waitMs != null) {
-                this.delayWait(waitMs);
-            }
-            else {
-                this.clearWait();
-                this.tryStart();
-            }
-        }
-        if (this.compoundTask(task)) {
-            if (!this.waitNamespace && waitMs != null) {
-                this.startWait(namespace, waitMs);
-            }
-            else {
-                this.tryStart();
-            }
-        }
-    };
-    RenderQueue.prototype.startWait = function (namespace, waitMs) {
-        this.waitNamespace = namespace;
-        this.spawnWait(waitMs);
-    };
-    RenderQueue.prototype.delayWait = function (waitMs) {
-        clearTimeout(this.waitId);
-        this.spawnWait(waitMs);
-    };
-    RenderQueue.prototype.spawnWait = function (waitMs) {
-        var _this = this;
-        this.waitId = setTimeout(function () {
-            _this.waitNamespace = null;
-            _this.tryStart();
-        }, waitMs);
-    };
-    RenderQueue.prototype.clearWait = function () {
-        if (this.waitNamespace) {
-            clearTimeout(this.waitId);
-            this.waitId = null;
-            this.waitNamespace = null;
-        }
-    };
-    RenderQueue.prototype.canRunNext = function () {
-        if (!_super.prototype.canRunNext.call(this)) {
-            return false;
-        }
-        // waiting for a certain namespace to stop receiving tasks?
-        if (this.waitNamespace) {
-            var q = this.q;
-            // if there was a different namespace task in the meantime,
-            // that forces all previously-waiting tasks to suddenly execute.
-            // TODO: find a way to do this in constant time.
-            for (var i = 0; i < q.length; i++) {
-                if (q[i].namespace !== this.waitNamespace) {
-                    return true; // allow execution
-                }
-            }
-            return false;
-        }
-        return true;
-    };
-    RenderQueue.prototype.runTask = function (task) {
-        task.func();
-    };
-    RenderQueue.prototype.compoundTask = function (newTask) {
-        var q = this.q;
-        var shouldAppend = true;
-        var i;
-        var task;
-        if (newTask.namespace && newTask.type === 'destroy') {
-            // remove all init/add/remove ops with same namespace, regardless of order
-            for (i = q.length - 1; i >= 0; i--) {
-                task = q[i];
-                switch (task.type) {
-                    case 'init':
-                        shouldAppend = false;
-                    // the latest destroy is cancelled out by not doing the init
-                    /* falls through */
-                    case 'add':
-                    /* falls through */
-                    case 'remove':
-                        q.splice(i, 1); // remove task
-                }
-            }
-        }
-        if (shouldAppend) {
-            q.push(newTask);
-        }
-        return shouldAppend;
-    };
-    return RenderQueue;
-}(TaskQueue_1.default));
-exports.default = RenderQueue;
-
-
-/***/ }),
-/* 219 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var moment_ext_1 = __webpack_require__(10);
-var date_formatting_1 = __webpack_require__(47);
-var Component_1 = __webpack_require__(237);
-var util_2 = __webpack_require__(35);
-var DateComponent = /** @class */ (function (_super) {
-    tslib_1.__extends(DateComponent, _super);
-    function DateComponent(_view, _options) {
-        var _this = _super.call(this) || this;
-        _this.isRTL = false; // frequently accessed options
-        _this.hitsNeededDepth = 0; // necessary because multiple callers might need the same hits
-        _this.hasAllDayBusinessHours = false; // TODO: unify with largeUnit and isTimeScale?
-        _this.isDatesRendered = false;
-        // hack to set options prior to the this.opt calls
-        if (_view) {
-            _this['view'] = _view;
-        }
-        if (_options) {
-            _this['options'] = _options;
-        }
-        _this.uid = String(DateComponent.guid++);
-        _this.childrenByUid = {};
-        _this.nextDayThreshold = moment.duration(_this.opt('nextDayThreshold'));
-        _this.isRTL = _this.opt('isRTL');
-        if (_this.fillRendererClass) {
-            _this.fillRenderer = new _this.fillRendererClass(_this);
-        }
-        if (_this.eventRendererClass) {
-            _this.eventRenderer = new _this.eventRendererClass(_this, _this.fillRenderer);
-        }
-        if (_this.helperRendererClass && _this.eventRenderer) {
-            _this.helperRenderer = new _this.helperRendererClass(_this, _this.eventRenderer);
-        }
-        if (_this.businessHourRendererClass && _this.fillRenderer) {
-            _this.businessHourRenderer = new _this.businessHourRendererClass(_this, _this.fillRenderer);
-        }
-        return _this;
-    }
-    DateComponent.prototype.addChild = function (child) {
-        if (!this.childrenByUid[child.uid]) {
-            this.childrenByUid[child.uid] = child;
-            return true;
-        }
-        return false;
-    };
-    DateComponent.prototype.removeChild = function (child) {
-        if (this.childrenByUid[child.uid]) {
-            delete this.childrenByUid[child.uid];
-            return true;
-        }
-        return false;
-    };
-    // TODO: only do if isInDom?
-    // TODO: make part of Component, along with children/batch-render system?
-    DateComponent.prototype.updateSize = function (totalHeight, isAuto, isResize) {
-        this.callChildren('updateSize', arguments);
-    };
-    // Options
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.opt = function (name) {
-        return this._getView().opt(name); // default implementation
-    };
-    DateComponent.prototype.publiclyTrigger = function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var calendar = this._getCalendar();
-        return calendar.publiclyTrigger.apply(calendar, args);
-    };
-    DateComponent.prototype.hasPublicHandlers = function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var calendar = this._getCalendar();
-        return calendar.hasPublicHandlers.apply(calendar, args);
-    };
-    // Date
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.executeDateRender = function (dateProfile) {
-        this.dateProfile = dateProfile; // for rendering
-        this.renderDates(dateProfile);
-        this.isDatesRendered = true;
-        this.callChildren('executeDateRender', arguments);
-    };
-    DateComponent.prototype.executeDateUnrender = function () {
-        this.callChildren('executeDateUnrender', arguments);
-        this.dateProfile = null;
-        this.unrenderDates();
-        this.isDatesRendered = false;
-    };
-    // date-cell content only
-    DateComponent.prototype.renderDates = function (dateProfile) {
-        // subclasses should implement
-    };
-    // date-cell content only
-    DateComponent.prototype.unrenderDates = function () {
-        // subclasses should override
-    };
-    // Now-Indicator
-    // -----------------------------------------------------------------------------------------------------------------
-    // Returns a string unit, like 'second' or 'minute' that defined how often the current time indicator
-    // should be refreshed. If something falsy is returned, no time indicator is rendered at all.
-    DateComponent.prototype.getNowIndicatorUnit = function () {
-        // subclasses should implement
-    };
-    // Renders a current time indicator at the given datetime
-    DateComponent.prototype.renderNowIndicator = function (date) {
-        this.callChildren('renderNowIndicator', arguments);
-    };
-    // Undoes the rendering actions from renderNowIndicator
-    DateComponent.prototype.unrenderNowIndicator = function () {
-        this.callChildren('unrenderNowIndicator', arguments);
-    };
-    // Business Hours
-    // ---------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.renderBusinessHours = function (businessHourGenerator) {
-        if (this.businessHourRenderer) {
-            this.businessHourRenderer.render(businessHourGenerator);
-        }
-        this.callChildren('renderBusinessHours', arguments);
-    };
-    // Unrenders previously-rendered business-hours
-    DateComponent.prototype.unrenderBusinessHours = function () {
-        this.callChildren('unrenderBusinessHours', arguments);
-        if (this.businessHourRenderer) {
-            this.businessHourRenderer.unrender();
-        }
-    };
-    // Event Displaying
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.executeEventRender = function (eventsPayload) {
-        if (this.eventRenderer) {
-            this.eventRenderer.rangeUpdated(); // poorly named now
-            this.eventRenderer.render(eventsPayload);
-        }
-        else if (this['renderEvents']) {
-            this['renderEvents'](convertEventsPayloadToLegacyArray(eventsPayload));
-        }
-        this.callChildren('executeEventRender', arguments);
-    };
-    DateComponent.prototype.executeEventUnrender = function () {
-        this.callChildren('executeEventUnrender', arguments);
-        if (this.eventRenderer) {
-            this.eventRenderer.unrender();
-        }
-        else if (this['destroyEvents']) {
-            this['destroyEvents']();
-        }
-    };
-    DateComponent.prototype.getBusinessHourSegs = function () {
-        var segs = this.getOwnBusinessHourSegs();
-        this.iterChildren(function (child) {
-            segs.push.apply(segs, child.getBusinessHourSegs());
-        });
-        return segs;
-    };
-    DateComponent.prototype.getOwnBusinessHourSegs = function () {
-        if (this.businessHourRenderer) {
-            return this.businessHourRenderer.getSegs();
-        }
-        return [];
-    };
-    DateComponent.prototype.getEventSegs = function () {
-        var segs = this.getOwnEventSegs();
-        this.iterChildren(function (child) {
-            segs.push.apply(segs, child.getEventSegs());
-        });
-        return segs;
-    };
-    DateComponent.prototype.getOwnEventSegs = function () {
-        if (this.eventRenderer) {
-            return this.eventRenderer.getSegs();
-        }
-        return [];
-    };
-    // Event Rendering Triggering
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.triggerAfterEventsRendered = function () {
-        this.triggerAfterEventSegsRendered(this.getEventSegs());
-        this.publiclyTrigger('eventAfterAllRender', {
-            context: this,
-            args: [this]
-        });
-    };
-    DateComponent.prototype.triggerAfterEventSegsRendered = function (segs) {
-        var _this = this;
-        // an optimization, because getEventLegacy is expensive
-        if (this.hasPublicHandlers('eventAfterRender')) {
-            segs.forEach(function (seg) {
-                var legacy;
-                if (seg.el) {
-                    legacy = seg.footprint.getEventLegacy();
-                    _this.publiclyTrigger('eventAfterRender', {
-                        context: legacy,
-                        args: [legacy, seg.el, _this]
-                    });
-                }
-            });
-        }
-    };
-    DateComponent.prototype.triggerBeforeEventsDestroyed = function () {
-        this.triggerBeforeEventSegsDestroyed(this.getEventSegs());
-    };
-    DateComponent.prototype.triggerBeforeEventSegsDestroyed = function (segs) {
-        var _this = this;
-        if (this.hasPublicHandlers('eventDestroy')) {
-            segs.forEach(function (seg) {
-                var legacy;
-                if (seg.el) {
-                    legacy = seg.footprint.getEventLegacy();
-                    _this.publiclyTrigger('eventDestroy', {
-                        context: legacy,
-                        args: [legacy, seg.el, _this]
-                    });
-                }
-            });
-        }
-    };
-    // Event Rendering Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    // Hides all rendered event segments linked to the given event
-    // RECURSIVE with subcomponents
-    DateComponent.prototype.showEventsWithId = function (eventDefId) {
-        this.getEventSegs().forEach(function (seg) {
-            if (seg.footprint.eventDef.id === eventDefId &&
-                seg.el // necessary?
-            ) {
-                seg.el.css('visibility', '');
-            }
-        });
-        this.callChildren('showEventsWithId', arguments);
-    };
-    // Shows all rendered event segments linked to the given event
-    // RECURSIVE with subcomponents
-    DateComponent.prototype.hideEventsWithId = function (eventDefId) {
-        this.getEventSegs().forEach(function (seg) {
-            if (seg.footprint.eventDef.id === eventDefId &&
-                seg.el // necessary?
-            ) {
-                seg.el.css('visibility', 'hidden');
-            }
-        });
-        this.callChildren('hideEventsWithId', arguments);
-    };
-    // Drag-n-Drop Rendering (for both events and external elements)
-    // ---------------------------------------------------------------------------------------------------------------
-    // Renders a visual indication of a event or external-element drag over the given drop zone.
-    // If an external-element, seg will be `null`.
-    // Must return elements used for any mock events.
-    DateComponent.prototype.renderDrag = function (eventFootprints, seg, isTouch) {
-        var renderedHelper = false;
-        this.iterChildren(function (child) {
-            if (child.renderDrag(eventFootprints, seg, isTouch)) {
-                renderedHelper = true;
-            }
-        });
-        return renderedHelper;
-    };
-    // Unrenders a visual indication of an event or external-element being dragged.
-    DateComponent.prototype.unrenderDrag = function () {
-        this.callChildren('unrenderDrag', arguments);
-    };
-    // Event Resizing
-    // ---------------------------------------------------------------------------------------------------------------
-    // Renders a visual indication of an event being resized.
-    DateComponent.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {
-        this.callChildren('renderEventResize', arguments);
-    };
-    // Unrenders a visual indication of an event being resized.
-    DateComponent.prototype.unrenderEventResize = function () {
-        this.callChildren('unrenderEventResize', arguments);
-    };
-    // Selection
-    // ---------------------------------------------------------------------------------------------------------------
-    // Renders a visual indication of the selection
-    // TODO: rename to `renderSelection` after legacy is gone
-    DateComponent.prototype.renderSelectionFootprint = function (componentFootprint) {
-        this.renderHighlight(componentFootprint);
-        this.callChildren('renderSelectionFootprint', arguments);
-    };
-    // Unrenders a visual indication of selection
-    DateComponent.prototype.unrenderSelection = function () {
-        this.unrenderHighlight();
-        this.callChildren('unrenderSelection', arguments);
-    };
-    // Highlight
-    // ---------------------------------------------------------------------------------------------------------------
-    // Renders an emphasis on the given date range. Given a span (unzoned start/end and other misc data)
-    DateComponent.prototype.renderHighlight = function (componentFootprint) {
-        if (this.fillRenderer) {
-            this.fillRenderer.renderFootprint('highlight', componentFootprint, {
-                getClasses: function () {
-                    return ['fc-highlight'];
-                }
-            });
-        }
-        this.callChildren('renderHighlight', arguments);
-    };
-    // Unrenders the emphasis on a date range
-    DateComponent.prototype.unrenderHighlight = function () {
-        if (this.fillRenderer) {
-            this.fillRenderer.unrender('highlight');
-        }
-        this.callChildren('unrenderHighlight', arguments);
-    };
-    // Hit Areas
-    // ---------------------------------------------------------------------------------------------------------------
-    // just because all DateComponents support this interface
-    // doesn't mean they need to have their own internal coord system. they can defer to sub-components.
-    DateComponent.prototype.hitsNeeded = function () {
-        if (!(this.hitsNeededDepth++)) {
-            this.prepareHits();
-        }
-        this.callChildren('hitsNeeded', arguments);
-    };
-    DateComponent.prototype.hitsNotNeeded = function () {
-        if (this.hitsNeededDepth && !(--this.hitsNeededDepth)) {
-            this.releaseHits();
-        }
-        this.callChildren('hitsNotNeeded', arguments);
-    };
-    DateComponent.prototype.prepareHits = function () {
-        // subclasses can implement
-    };
-    DateComponent.prototype.releaseHits = function () {
-        // subclasses can implement
-    };
-    // Given coordinates from the topleft of the document, return data about the date-related area underneath.
-    // Can return an object with arbitrary properties (although top/right/left/bottom are encouraged).
-    // Must have a `grid` property, a reference to this current grid. TODO: avoid this
-    // The returned object will be processed by getHitFootprint and getHitEl.
-    DateComponent.prototype.queryHit = function (leftOffset, topOffset) {
-        var childrenByUid = this.childrenByUid;
-        var uid;
-        var hit;
-        for (uid in childrenByUid) {
-            hit = childrenByUid[uid].queryHit(leftOffset, topOffset);
-            if (hit) {
-                break;
-            }
-        }
-        return hit;
-    };
-    DateComponent.prototype.getSafeHitFootprint = function (hit) {
-        var footprint = this.getHitFootprint(hit);
-        if (!this.dateProfile.activeUnzonedRange.containsRange(footprint.unzonedRange)) {
-            return null;
-        }
-        return footprint;
-    };
-    DateComponent.prototype.getHitFootprint = function (hit) {
-        // what about being abstract!?
-    };
-    // Given position-level information about a date-related area within the grid,
-    // should return a jQuery element that best represents it. passed to dayClick callback.
-    DateComponent.prototype.getHitEl = function (hit) {
-        // what about being abstract!?
-    };
-    /* Converting eventRange -> eventFootprint
-    ------------------------------------------------------------------------------------------------------------------*/
-    DateComponent.prototype.eventRangesToEventFootprints = function (eventRanges) {
-        var eventFootprints = [];
-        var i;
-        for (i = 0; i < eventRanges.length; i++) {
-            eventFootprints.push.apply(// append
-            eventFootprints, this.eventRangeToEventFootprints(eventRanges[i]));
-        }
-        return eventFootprints;
-    };
-    DateComponent.prototype.eventRangeToEventFootprints = function (eventRange) {
-        return [util_2.eventRangeToEventFootprint(eventRange)];
-    };
-    /* Converting componentFootprint/eventFootprint -> segs
-    ------------------------------------------------------------------------------------------------------------------*/
-    DateComponent.prototype.eventFootprintsToSegs = function (eventFootprints) {
-        var segs = [];
-        var i;
-        for (i = 0; i < eventFootprints.length; i++) {
-            segs.push.apply(segs, this.eventFootprintToSegs(eventFootprints[i]));
-        }
-        return segs;
-    };
-    // Given an event's span (unzoned start/end and other misc data), and the event itself,
-    // slices into segments and attaches event-derived properties to them.
-    // eventSpan - { start, end, isStart, isEnd, otherthings... }
-    DateComponent.prototype.eventFootprintToSegs = function (eventFootprint) {
-        var unzonedRange = eventFootprint.componentFootprint.unzonedRange;
-        var segs;
-        var i;
-        var seg;
-        segs = this.componentFootprintToSegs(eventFootprint.componentFootprint);
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            if (!unzonedRange.isStart) {
-                seg.isStart = false;
-            }
-            if (!unzonedRange.isEnd) {
-                seg.isEnd = false;
-            }
-            seg.footprint = eventFootprint;
-            // TODO: rename to seg.eventFootprint
-        }
-        return segs;
-    };
-    DateComponent.prototype.componentFootprintToSegs = function (componentFootprint) {
-        return [];
-    };
-    // Utils
-    // ---------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.callChildren = function (methodName, args) {
-        this.iterChildren(function (child) {
-            child[methodName].apply(child, args);
-        });
-    };
-    DateComponent.prototype.iterChildren = function (func) {
-        var childrenByUid = this.childrenByUid;
-        var uid;
-        for (uid in childrenByUid) {
-            func(childrenByUid[uid]);
-        }
-    };
-    DateComponent.prototype._getCalendar = function () {
-        var t = this;
-        return t.calendar || t.view.calendar;
-    };
-    DateComponent.prototype._getView = function () {
-        return this.view;
-    };
-    DateComponent.prototype._getDateProfile = function () {
-        return this._getView().get('dateProfile');
-    };
-    // Generates HTML for an anchor to another view into the calendar.
-    // Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
-    // `gotoOptions` can either be a moment input, or an object with the form:
-    // { date, type, forceOff }
-    // `type` is a view-type like "day" or "week". default value is "day".
-    // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
-    DateComponent.prototype.buildGotoAnchorHtml = function (gotoOptions, attrs, innerHtml) {
-        var date;
-        var type;
-        var forceOff;
-        var finalOptions;
-        if ($.isPlainObject(gotoOptions)) {
-            date = gotoOptions.date;
-            type = gotoOptions.type;
-            forceOff = gotoOptions.forceOff;
-        }
-        else {
-            date = gotoOptions; // a single moment input
-        }
-        date = moment_ext_1.default(date); // if a string, parse it
-        finalOptions = {
-            date: date.format('YYYY-MM-DD'),
-            type: type || 'day'
-        };
-        if (typeof attrs === 'string') {
-            innerHtml = attrs;
-            attrs = null;
-        }
-        attrs = attrs ? ' ' + util_1.attrsToStr(attrs) : ''; // will have a leading space
-        innerHtml = innerHtml || '';
-        if (!forceOff && this.opt('navLinks')) {
-            return '<a' + attrs +
-                ' data-goto="' + util_1.htmlEscape(JSON.stringify(finalOptions)) + '">' +
-                innerHtml +
-                '</a>';
-        }
-        else {
-            return '<span' + attrs + '>' +
-                innerHtml +
-                '</span>';
-        }
-    };
-    DateComponent.prototype.getAllDayHtml = function () {
-        return this.opt('allDayHtml') || util_1.htmlEscape(this.opt('allDayText'));
-    };
-    // Computes HTML classNames for a single-day element
-    DateComponent.prototype.getDayClasses = function (date, noThemeHighlight) {
-        var view = this._getView();
-        var classes = [];
-        var today;
-        if (!this.dateProfile.activeUnzonedRange.containsDate(date)) {
-            classes.push('fc-disabled-day'); // TODO: jQuery UI theme?
-        }
-        else {
-            classes.push('fc-' + util_1.dayIDs[date.day()]);
-            if (view.isDateInOtherMonth(date, this.dateProfile)) {
-                classes.push('fc-other-month');
-            }
-            today = view.calendar.getNow();
-            if (date.isSame(today, 'day')) {
-                classes.push('fc-today');
-                if (noThemeHighlight !== true) {
-                    classes.push(view.calendar.theme.getClass('today'));
-                }
-            }
-            else if (date < today) {
-                classes.push('fc-past');
-            }
-            else {
-                classes.push('fc-future');
-            }
-        }
-        return classes;
-    };
-    // Utility for formatting a range. Accepts a range object, formatting string, and optional separator.
-    // Displays all-day ranges naturally, with an inclusive end. Takes the current isRTL into account.
-    // The timezones of the dates within `range` will be respected.
-    DateComponent.prototype.formatRange = function (range, isAllDay, formatStr, separator) {
-        var end = range.end;
-        if (isAllDay) {
-            end = end.clone().subtract(1); // convert to inclusive. last ms of previous day
-        }
-        return date_formatting_1.formatRange(range.start, end, formatStr, separator, this.isRTL);
-    };
-    // Compute the number of the give units in the "current" range.
-    // Will return a floating-point number. Won't round.
-    DateComponent.prototype.currentRangeAs = function (unit) {
-        return this._getDateProfile().currentUnzonedRange.as(unit);
-    };
-    // Returns the date range of the full days the given range visually appears to occupy.
-    // Returns a plain object with start/end, NOT an UnzonedRange!
-    DateComponent.prototype.computeDayRange = function (unzonedRange) {
-        var calendar = this._getCalendar();
-        var startDay = calendar.msToUtcMoment(unzonedRange.startMs, true); // the beginning of the day the range starts
-        var end = calendar.msToUtcMoment(unzonedRange.endMs);
-        var endTimeMS = +end.time(); // # of milliseconds into `endDay`
-        var endDay = end.clone().stripTime(); // the beginning of the day the range exclusively ends
-        // If the end time is actually inclusively part of the next day and is equal to or
-        // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
-        // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
-        if (endTimeMS && endTimeMS >= this.nextDayThreshold) {
-            endDay.add(1, 'days');
-        }
-        // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
-        if (endDay <= startDay) {
-            endDay = startDay.clone().add(1, 'days');
-        }
-        return { start: startDay, end: endDay };
-    };
-    // Does the given range visually appear to occupy more than one day?
-    DateComponent.prototype.isMultiDayRange = function (unzonedRange) {
-        var dayRange = this.computeDayRange(unzonedRange);
-        return dayRange.end.diff(dayRange.start, 'days') > 1;
-    };
-    DateComponent.guid = 0; // TODO: better system for this?
-    return DateComponent;
-}(Component_1.default));
-exports.default = DateComponent;
-// legacy
-function convertEventsPayloadToLegacyArray(eventsPayload) {
-    var eventDefId;
-    var eventInstances;
-    var legacyEvents = [];
-    var i;
-    for (eventDefId in eventsPayload) {
-        eventInstances = eventsPayload[eventDefId].eventInstances;
-        for (i = 0; i < eventInstances.length; i++) {
-            legacyEvents.push(eventInstances[i].toLegacy());
-        }
-    }
-    return legacyEvents;
-}
-
-
-/***/ }),
-/* 220 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var options_1 = __webpack_require__(32);
-var Iterator_1 = __webpack_require__(238);
-var GlobalEmitter_1 = __webpack_require__(21);
-var EmitterMixin_1 = __webpack_require__(11);
-var ListenerMixin_1 = __webpack_require__(7);
-var Toolbar_1 = __webpack_require__(239);
-var OptionsManager_1 = __webpack_require__(240);
-var ViewSpecManager_1 = __webpack_require__(241);
-var Constraints_1 = __webpack_require__(207);
-var locale_1 = __webpack_require__(31);
-var moment_ext_1 = __webpack_require__(10);
-var UnzonedRange_1 = __webpack_require__(5);
-var ComponentFootprint_1 = __webpack_require__(12);
-var EventDateProfile_1 = __webpack_require__(17);
-var EventManager_1 = __webpack_require__(242);
-var BusinessHourGenerator_1 = __webpack_require__(212);
-var EventSourceParser_1 = __webpack_require__(38);
-var EventDefParser_1 = __webpack_require__(49);
-var SingleEventDef_1 = __webpack_require__(13);
-var EventDefMutation_1 = __webpack_require__(37);
-var EventSource_1 = __webpack_require__(6);
-var ThemeRegistry_1 = __webpack_require__(51);
-var Calendar = /** @class */ (function () {
-    function Calendar(el, overrides) {
-        this.loadingLevel = 0; // number of simultaneous loading tasks
-        this.ignoreUpdateViewSize = 0;
-        this.freezeContentHeightDepth = 0;
-        // declare the current calendar instance relies on GlobalEmitter. needed for garbage collection.
-        // unneeded() is called in destroy.
-        GlobalEmitter_1.default.needed();
-        this.el = el;
-        this.viewsByType = {};
-        this.optionsManager = new OptionsManager_1.default(this, overrides);
-        this.viewSpecManager = new ViewSpecManager_1.default(this.optionsManager, this);
-        this.initMomentInternals(); // needs to happen after options hash initialized
-        this.initCurrentDate();
-        this.initEventManager();
-        this.constraints = new Constraints_1.default(this.eventManager, this);
-        this.constructed();
-    }
-    Calendar.prototype.constructed = function () {
-        // useful for monkeypatching. used?
-    };
-    Calendar.prototype.getView = function () {
-        return this.view;
-    };
-    Calendar.prototype.publiclyTrigger = function (name, triggerInfo) {
-        var optHandler = this.opt(name);
-        var context;
-        var args;
-        if ($.isPlainObject(triggerInfo)) {
-            context = triggerInfo.context;
-            args = triggerInfo.args;
-        }
-        else if ($.isArray(triggerInfo)) {
-            args = triggerInfo;
-        }
-        if (context == null) {
-            context = this.el[0]; // fallback context
-        }
-        if (!args) {
-            args = [];
-        }
-        this.triggerWith(name, context, args); // Emitter's method
-        if (optHandler) {
-            return optHandler.apply(context, args);
-        }
-    };
-    Calendar.prototype.hasPublicHandlers = function (name) {
-        return this.hasHandlers(name) ||
-            this.opt(name); // handler specified in options
-    };
-    // Options Public API
-    // -----------------------------------------------------------------------------------------------------------------
-    // public getter/setter
-    Calendar.prototype.option = function (name, value) {
-        var newOptionHash;
-        if (typeof name === 'string') {
-            if (value === undefined) {
-                return this.optionsManager.get(name);
-            }
-            else {
-                newOptionHash = {};
-                newOptionHash[name] = value;
-                this.optionsManager.add(newOptionHash);
-            }
-        }
-        else if (typeof name === 'object') {
-            this.optionsManager.add(name);
-        }
-    };
-    // private getter
-    Calendar.prototype.opt = function (name) {
-        return this.optionsManager.get(name);
-    };
-    // View
-    // -----------------------------------------------------------------------------------------------------------------
-    // Given a view name for a custom view or a standard view, creates a ready-to-go View object
-    Calendar.prototype.instantiateView = function (viewType) {
-        var spec = this.viewSpecManager.getViewSpec(viewType);
-        if (!spec) {
-            throw new Error("View type \"" + viewType + "\" is not valid");
-        }
-        return new spec['class'](this, spec);
-    };
-    // Returns a boolean about whether the view is okay to instantiate at some point
-    Calendar.prototype.isValidViewType = function (viewType) {
-        return Boolean(this.viewSpecManager.getViewSpec(viewType));
-    };
-    Calendar.prototype.changeView = function (viewName, dateOrRange) {
-        if (dateOrRange) {
-            if (dateOrRange.start && dateOrRange.end) {
-                this.optionsManager.recordOverrides({
-                    visibleRange: dateOrRange
-                });
-            }
-            else {
-                this.currentDate = this.moment(dateOrRange).stripZone(); // just like gotoDate
-            }
-        }
-        this.renderView(viewName);
-    };
-    // Forces navigation to a view for the given date.
-    // `viewType` can be a specific view name or a generic one like "week" or "day".
-    Calendar.prototype.zoomTo = function (newDate, viewType) {
-        var spec;
-        viewType = viewType || 'day'; // day is default zoom
-        spec = this.viewSpecManager.getViewSpec(viewType) ||
-            this.viewSpecManager.getUnitViewSpec(viewType);
-        this.currentDate = newDate.clone();
-        this.renderView(spec ? spec.type : null);
-    };
-    // Current Date
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.initCurrentDate = function () {
-        var defaultDateInput = this.opt('defaultDate');
-        // compute the initial ambig-timezone date
-        if (defaultDateInput != null) {
-            this.currentDate = this.moment(defaultDateInput).stripZone();
-        }
-        else {
-            this.currentDate = this.getNow(); // getNow already returns unzoned
-        }
-    };
-    Calendar.prototype.prev = function () {
-        var view = this.view;
-        var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));
-        if (prevInfo.isValid) {
-            this.currentDate = prevInfo.date;
-            this.renderView();
-        }
-    };
-    Calendar.prototype.next = function () {
-        var view = this.view;
-        var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));
-        if (nextInfo.isValid) {
-            this.currentDate = nextInfo.date;
-            this.renderView();
-        }
-    };
-    Calendar.prototype.prevYear = function () {
-        this.currentDate.add(-1, 'years');
-        this.renderView();
-    };
-    Calendar.prototype.nextYear = function () {
-        this.currentDate.add(1, 'years');
-        this.renderView();
-    };
-    Calendar.prototype.today = function () {
-        this.currentDate = this.getNow(); // should deny like prev/next?
-        this.renderView();
-    };
-    Calendar.prototype.gotoDate = function (zonedDateInput) {
-        this.currentDate = this.moment(zonedDateInput).stripZone();
-        this.renderView();
-    };
-    Calendar.prototype.incrementDate = function (delta) {
-        this.currentDate.add(moment.duration(delta));
-        this.renderView();
-    };
-    // for external API
-    Calendar.prototype.getDate = function () {
-        return this.applyTimezone(this.currentDate); // infuse the calendar's timezone
-    };
-    // Loading Triggering
-    // -----------------------------------------------------------------------------------------------------------------
-    // Should be called when any type of async data fetching begins
-    Calendar.prototype.pushLoading = function () {
-        if (!(this.loadingLevel++)) {
-            this.publiclyTrigger('loading', [true, this.view]);
-        }
-    };
-    // Should be called when any type of async data fetching completes
-    Calendar.prototype.popLoading = function () {
-        if (!(--this.loadingLevel)) {
-            this.publiclyTrigger('loading', [false, this.view]);
-        }
-    };
-    // High-level Rendering
-    // -----------------------------------------------------------------------------------
-    Calendar.prototype.render = function () {
-        if (!this.contentEl) {
-            this.initialRender();
-        }
-        else if (this.elementVisible()) {
-            // mainly for the public API
-            this.calcSize();
-            this.updateViewSize();
-        }
-    };
-    Calendar.prototype.initialRender = function () {
-        var _this = this;
-        var el = this.el;
-        el.addClass('fc');
-        // event delegation for nav links
-        el.on('click.fc', 'a[data-goto]', function (ev) {
-            var anchorEl = $(ev.currentTarget);
-            var gotoOptions = anchorEl.data('goto'); // will automatically parse JSON
-            var date = _this.moment(gotoOptions.date);
-            var viewType = gotoOptions.type;
-            // property like "navLinkDayClick". might be a string or a function
-            var customAction = _this.view.opt('navLink' + util_1.capitaliseFirstLetter(viewType) + 'Click');
-            if (typeof customAction === 'function') {
-                customAction(date, ev);
-            }
-            else {
-                if (typeof customAction === 'string') {
-                    viewType = customAction;
-                }
-                _this.zoomTo(date, viewType);
-            }
-        });
-        // called immediately, and upon option change
-        this.optionsManager.watch('settingTheme', ['?theme', '?themeSystem'], function (opts) {
-            var themeClass = ThemeRegistry_1.getThemeSystemClass(opts.themeSystem || opts.theme);
-            var theme = new themeClass(_this.optionsManager);
-            var widgetClass = theme.getClass('widget');
-            _this.theme = theme;
-            if (widgetClass) {
-                el.addClass(widgetClass);
-            }
-        }, function () {
-            var widgetClass = _this.theme.getClass('widget');
-            _this.theme = null;
-            if (widgetClass) {
-                el.removeClass(widgetClass);
-            }
-        });
-        this.optionsManager.watch('settingBusinessHourGenerator', ['?businessHours'], function (deps) {
-            _this.businessHourGenerator = new BusinessHourGenerator_1.default(deps.businessHours, _this);
-            if (_this.view) {
-                _this.view.set('businessHourGenerator', _this.businessHourGenerator);
-            }
-        }, function () {
-            _this.businessHourGenerator = null;
-        });
-        // called immediately, and upon option change.
-        // HACK: locale often affects isRTL, so we explicitly listen to that too.
-        this.optionsManager.watch('applyingDirClasses', ['?isRTL', '?locale'], function (opts) {
-            el.toggleClass('fc-ltr', !opts.isRTL);
-            el.toggleClass('fc-rtl', opts.isRTL);
-        });
-        this.contentEl = $("<div class='fc-view-container'/>").prependTo(el);
-        this.initToolbars();
-        this.renderHeader();
-        this.renderFooter();
-        this.renderView(this.opt('defaultView'));
-        if (this.opt('handleWindowResize')) {
-            $(window).resize(this.windowResizeProxy = util_1.debounce(// prevents rapid calls
-            this.windowResize.bind(this), this.opt('windowResizeDelay')));
-        }
-    };
-    Calendar.prototype.destroy = function () {
-        if (this.view) {
-            this.clearView();
-        }
-        this.toolbarsManager.proxyCall('removeElement');
-        this.contentEl.remove();
-        this.el.removeClass('fc fc-ltr fc-rtl');
-        // removes theme-related root className
-        this.optionsManager.unwatch('settingTheme');
-        this.optionsManager.unwatch('settingBusinessHourGenerator');
-        this.el.off('.fc'); // unbind nav link handlers
-        if (this.windowResizeProxy) {
-            $(window).unbind('resize', this.windowResizeProxy);
-            this.windowResizeProxy = null;
-        }
-        GlobalEmitter_1.default.unneeded();
-    };
-    Calendar.prototype.elementVisible = function () {
-        return this.el.is(':visible');
-    };
-    // Render Queue
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.bindViewHandlers = function (view) {
-        var _this = this;
-        view.watch('titleForCalendar', ['title'], function (deps) {
-            if (view === _this.view) {
-                _this.setToolbarsTitle(deps.title);
-            }
-        });
-        view.watch('dateProfileForCalendar', ['dateProfile'], function (deps) {
-            if (view === _this.view) {
-                _this.currentDate = deps.dateProfile.date; // might have been constrained by view dates
-                _this.updateToolbarButtons(deps.dateProfile);
-            }
-        });
-    };
-    Calendar.prototype.unbindViewHandlers = function (view) {
-        view.unwatch('titleForCalendar');
-        view.unwatch('dateProfileForCalendar');
-    };
-    // View Rendering
-    // -----------------------------------------------------------------------------------
-    // Renders a view because of a date change, view-type change, or for the first time.
-    // If not given a viewType, keep the current view but render different dates.
-    // Accepts an optional scroll state to restore to.
-    Calendar.prototype.renderView = function (viewType) {
-        var oldView = this.view;
-        var newView;
-        this.freezeContentHeight();
-        if (oldView && viewType && oldView.type !== viewType) {
-            this.clearView();
-        }
-        // if viewType changed, or the view was never created, create a fresh view
-        if (!this.view && viewType) {
-            newView = this.view =
-                this.viewsByType[viewType] ||
-                    (this.viewsByType[viewType] = this.instantiateView(viewType));
-            this.bindViewHandlers(newView);
-            newView.startBatchRender(); // so that setElement+setDate rendering are joined
-            newView.setElement($("<div class='fc-view fc-" + viewType + "-view' />").appendTo(this.contentEl));
-            this.toolbarsManager.proxyCall('activateButton', viewType);
-        }
-        if (this.view) {
-            // prevent unnecessary change firing
-            if (this.view.get('businessHourGenerator') !== this.businessHourGenerator) {
-                this.view.set('businessHourGenerator', this.businessHourGenerator);
-            }
-            this.view.setDate(this.currentDate);
-            if (newView) {
-                newView.stopBatchRender();
-            }
-        }
-        this.thawContentHeight();
-    };
-    // Unrenders the current view and reflects this change in the Header.
-    // Unregsiters the `view`, but does not remove from viewByType hash.
-    Calendar.prototype.clearView = function () {
-        var currentView = this.view;
-        this.toolbarsManager.proxyCall('deactivateButton', currentView.type);
-        this.unbindViewHandlers(currentView);
-        currentView.removeElement();
-        currentView.unsetDate(); // so bindViewHandlers doesn't fire with old values next time
-        this.view = null;
-    };
-    // Destroys the view, including the view object. Then, re-instantiates it and renders it.
-    // Maintains the same scroll state.
-    // TODO: maintain any other user-manipulated state.
-    Calendar.prototype.reinitView = function () {
-        var oldView = this.view;
-        var scroll = oldView.queryScroll(); // wouldn't be so complicated if Calendar owned the scroll
-        this.freezeContentHeight();
-        this.clearView();
-        this.calcSize();
-        this.renderView(oldView.type); // needs the type to freshly render
-        this.view.applyScroll(scroll);
-        this.thawContentHeight();
-    };
-    // Resizing
-    // -----------------------------------------------------------------------------------
-    Calendar.prototype.getSuggestedViewHeight = function () {
-        if (this.suggestedViewHeight == null) {
-            this.calcSize();
-        }
-        return this.suggestedViewHeight;
-    };
-    Calendar.prototype.isHeightAuto = function () {
-        return this.opt('contentHeight') === 'auto' || this.opt('height') === 'auto';
-    };
-    Calendar.prototype.updateViewSize = function (isResize) {
-        if (isResize === void 0) { isResize = false; }
-        var view = this.view;
-        var scroll;
-        if (!this.ignoreUpdateViewSize && view) {
-            if (isResize) {
-                this.calcSize();
-                scroll = view.queryScroll();
-            }
-            this.ignoreUpdateViewSize++;
-            view.updateSize(this.getSuggestedViewHeight(), this.isHeightAuto(), isResize);
-            this.ignoreUpdateViewSize--;
-            if (isResize) {
-                view.applyScroll(scroll);
-            }
-            return true; // signal success
-        }
-    };
-    Calendar.prototype.calcSize = function () {
-        if (this.elementVisible()) {
-            this._calcSize();
-        }
-    };
-    Calendar.prototype._calcSize = function () {
-        var contentHeightInput = this.opt('contentHeight');
-        var heightInput = this.opt('height');
-        if (typeof contentHeightInput === 'number') {
-            this.suggestedViewHeight = contentHeightInput;
-        }
-        else if (typeof contentHeightInput === 'function') {
-            this.suggestedViewHeight = contentHeightInput();
-        }
-        else if (typeof heightInput === 'number') {
-            this.suggestedViewHeight = heightInput - this.queryToolbarsHeight();
-        }
-        else if (typeof heightInput === 'function') {
-            this.suggestedViewHeight = heightInput() - this.queryToolbarsHeight();
-        }
-        else if (heightInput === 'parent') {
-            this.suggestedViewHeight = this.el.parent().height() - this.queryToolbarsHeight();
-        }
-        else {
-            this.suggestedViewHeight = Math.round(this.contentEl.width() /
-                Math.max(this.opt('aspectRatio'), .5));
-        }
-    };
-    Calendar.prototype.windowResize = function (ev) {
-        if (
-        // the purpose: so we don't process jqui "resize" events that have bubbled up
-        // cast to any because .target, which is Element, can't be compared to window for some reason.
-        ev.target === window &&
-            this.view &&
-            this.view.isDatesRendered) {
-            if (this.updateViewSize(true)) {
-                this.publiclyTrigger('windowResize', [this.view]);
-            }
-        }
-    };
-    /* Height "Freezing"
-    -----------------------------------------------------------------------------*/
-    Calendar.prototype.freezeContentHeight = function () {
-        if (!(this.freezeContentHeightDepth++)) {
-            this.forceFreezeContentHeight();
-        }
-    };
-    Calendar.prototype.forceFreezeContentHeight = function () {
-        this.contentEl.css({
-            width: '100%',
-            height: this.contentEl.height(),
-            overflow: 'hidden'
-        });
-    };
-    Calendar.prototype.thawContentHeight = function () {
-        this.freezeContentHeightDepth--;
-        // always bring back to natural height
-        this.contentEl.css({
-            width: '',
-            height: '',
-            overflow: ''
-        });
-        // but if there are future thaws, re-freeze
-        if (this.freezeContentHeightDepth) {
-            this.forceFreezeContentHeight();
-        }
-    };
-    // Toolbar
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.initToolbars = function () {
-        this.header = new Toolbar_1.default(this, this.computeHeaderOptions());
-        this.footer = new Toolbar_1.default(this, this.computeFooterOptions());
-        this.toolbarsManager = new Iterator_1.default([this.header, this.footer]);
-    };
-    Calendar.prototype.computeHeaderOptions = function () {
-        return {
-            extraClasses: 'fc-header-toolbar',
-            layout: this.opt('header')
-        };
-    };
-    Calendar.prototype.computeFooterOptions = function () {
-        return {
-            extraClasses: 'fc-footer-toolbar',
-            layout: this.opt('footer')
-        };
-    };
-    // can be called repeatedly and Header will rerender
-    Calendar.prototype.renderHeader = function () {
-        var header = this.header;
-        header.setToolbarOptions(this.computeHeaderOptions());
-        header.render();
-        if (header.el) {
-            this.el.prepend(header.el);
-        }
-    };
-    // can be called repeatedly and Footer will rerender
-    Calendar.prototype.renderFooter = function () {
-        var footer = this.footer;
-        footer.setToolbarOptions(this.computeFooterOptions());
-        footer.render();
-        if (footer.el) {
-            this.el.append(footer.el);
-        }
-    };
-    Calendar.prototype.setToolbarsTitle = function (title) {
-        this.toolbarsManager.proxyCall('updateTitle', title);
-    };
-    Calendar.prototype.updateToolbarButtons = function (dateProfile) {
-        var now = this.getNow();
-        var view = this.view;
-        var todayInfo = view.dateProfileGenerator.build(now);
-        var prevInfo = view.dateProfileGenerator.buildPrev(view.get('dateProfile'));
-        var nextInfo = view.dateProfileGenerator.buildNext(view.get('dateProfile'));
-        this.toolbarsManager.proxyCall((todayInfo.isValid && !dateProfile.currentUnzonedRange.containsDate(now)) ?
-            'enableButton' :
-            'disableButton', 'today');
-        this.toolbarsManager.proxyCall(prevInfo.isValid ?
-            'enableButton' :
-            'disableButton', 'prev');
-        this.toolbarsManager.proxyCall(nextInfo.isValid ?
-            'enableButton' :
-            'disableButton', 'next');
-    };
-    Calendar.prototype.queryToolbarsHeight = function () {
-        return this.toolbarsManager.items.reduce(function (accumulator, toolbar) {
-            var toolbarHeight = toolbar.el ? toolbar.el.outerHeight(true) : 0; // includes margin
-            return accumulator + toolbarHeight;
-        }, 0);
-    };
-    // Selection
-    // -----------------------------------------------------------------------------------------------------------------
-    // this public method receives start/end dates in any format, with any timezone
-    Calendar.prototype.select = function (zonedStartInput, zonedEndInput) {
-        this.view.select(this.buildSelectFootprint.apply(this, arguments));
-    };
-    Calendar.prototype.unselect = function () {
-        if (this.view) {
-            this.view.unselect();
-        }
-    };
-    // Given arguments to the select method in the API, returns a span (unzoned start/end and other info)
-    Calendar.prototype.buildSelectFootprint = function (zonedStartInput, zonedEndInput) {
-        var start = this.moment(zonedStartInput).stripZone();
-        var end;
-        if (zonedEndInput) {
-            end = this.moment(zonedEndInput).stripZone();
-        }
-        else if (start.hasTime()) {
-            end = start.clone().add(this.defaultTimedEventDuration);
-        }
-        else {
-            end = start.clone().add(this.defaultAllDayEventDuration);
-        }
-        return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), !start.hasTime());
-    };
-    // Date Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.initMomentInternals = function () {
-        var _this = this;
-        this.defaultAllDayEventDuration = moment.duration(this.opt('defaultAllDayEventDuration'));
-        this.defaultTimedEventDuration = moment.duration(this.opt('defaultTimedEventDuration'));
-        // Called immediately, and when any of the options change.
-        // Happens before any internal objects rebuild or rerender, because this is very core.
-        this.optionsManager.watch('buildingMomentLocale', [
-            '?locale', '?monthNames', '?monthNamesShort', '?dayNames', '?dayNamesShort',
-            '?firstDay', '?weekNumberCalculation'
-        ], function (opts) {
-            var weekNumberCalculation = opts.weekNumberCalculation;
-            var firstDay = opts.firstDay;
-            var _week;
-            // normalize
-            if (weekNumberCalculation === 'iso') {
-                weekNumberCalculation = 'ISO'; // normalize
-            }
-            var localeData = Object.create(// make a cheap copy
-            locale_1.getMomentLocaleData(opts.locale) // will fall back to en
-            );
-            if (opts.monthNames) {
-                localeData._months = opts.monthNames;
-            }
-            if (opts.monthNamesShort) {
-                localeData._monthsShort = opts.monthNamesShort;
-            }
-            if (opts.dayNames) {
-                localeData._weekdays = opts.dayNames;
-            }
-            if (opts.dayNamesShort) {
-                localeData._weekdaysShort = opts.dayNamesShort;
-            }
-            if (firstDay == null && weekNumberCalculation === 'ISO') {
-                firstDay = 1;
-            }
-            if (firstDay != null) {
-                _week = Object.create(localeData._week); // _week: { dow: # }
-                _week.dow = firstDay;
-                localeData._week = _week;
-            }
-            if (weekNumberCalculation === 'ISO' ||
-                weekNumberCalculation === 'local' ||
-                typeof weekNumberCalculation === 'function') {
-                localeData._fullCalendar_weekCalc = weekNumberCalculation; // moment-ext will know what to do with it
-            }
-            _this.localeData = localeData;
-            // If the internal current date object already exists, move to new locale.
-            // We do NOT need to do this technique for event dates, because this happens when converting to "segments".
-            if (_this.currentDate) {
-                _this.localizeMoment(_this.currentDate); // sets to localeData
-            }
-        });
-    };
-    // Builds a moment using the settings of the current calendar: timezone and locale.
-    // Accepts anything the vanilla moment() constructor accepts.
-    Calendar.prototype.moment = function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var mom;
-        if (this.opt('timezone') === 'local') {
-            mom = moment_ext_1.default.apply(null, args);
-            // Force the moment to be local, because momentExt doesn't guarantee it.
-            if (mom.hasTime()) {
-                mom.local();
-            }
-        }
-        else if (this.opt('timezone') === 'UTC') {
-            mom = moment_ext_1.default.utc.apply(null, args); // process as UTC
-        }
-        else {
-            mom = moment_ext_1.default.parseZone.apply(null, args); // let the input decide the zone
-        }
-        this.localizeMoment(mom); // TODO
-        return mom;
-    };
-    Calendar.prototype.msToMoment = function (ms, forceAllDay) {
-        var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC
-        if (forceAllDay) {
-            mom.stripTime();
-        }
-        else {
-            mom = this.applyTimezone(mom); // may or may not apply locale
-        }
-        this.localizeMoment(mom);
-        return mom;
-    };
-    Calendar.prototype.msToUtcMoment = function (ms, forceAllDay) {
-        var mom = moment_ext_1.default.utc(ms); // TODO: optimize by using Date.UTC
-        if (forceAllDay) {
-            mom.stripTime();
-        }
-        this.localizeMoment(mom);
-        return mom;
-    };
-    // Updates the given moment's locale settings to the current calendar locale settings.
-    Calendar.prototype.localizeMoment = function (mom) {
-        mom._locale = this.localeData;
-    };
-    // Returns a boolean about whether or not the calendar knows how to calculate
-    // the timezone offset of arbitrary dates in the current timezone.
-    Calendar.prototype.getIsAmbigTimezone = function () {
-        return this.opt('timezone') !== 'local' && this.opt('timezone') !== 'UTC';
-    };
-    // Returns a copy of the given date in the current timezone. Has no effect on dates without times.
-    Calendar.prototype.applyTimezone = function (date) {
-        if (!date.hasTime()) {
-            return date.clone();
-        }
-        var zonedDate = this.moment(date.toArray());
-        var timeAdjust = date.time().asMilliseconds() - zonedDate.time().asMilliseconds();
-        var adjustedZonedDate;
-        // Safari sometimes has problems with this coersion when near DST. Adjust if necessary. (bug #2396)
-        if (timeAdjust) {
-            adjustedZonedDate = zonedDate.clone().add(timeAdjust); // add milliseconds
-            if (date.time().asMilliseconds() - adjustedZonedDate.time().asMilliseconds() === 0) {
-                zonedDate = adjustedZonedDate;
-            }
-        }
-        return zonedDate;
-    };
-    /*
-    Assumes the footprint is non-open-ended.
-    */
-    Calendar.prototype.footprintToDateProfile = function (componentFootprint, ignoreEnd) {
-        if (ignoreEnd === void 0) { ignoreEnd = false; }
-        var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs);
-        var end;
-        if (!ignoreEnd) {
-            end = moment_ext_1.default.utc(componentFootprint.unzonedRange.endMs);
-        }
-        if (componentFootprint.isAllDay) {
-            start.stripTime();
-            if (end) {
-                end.stripTime();
-            }
-        }
-        else {
-            start = this.applyTimezone(start);
-            if (end) {
-                end = this.applyTimezone(end);
-            }
-        }
-        return new EventDateProfile_1.default(start, end, this);
-    };
-    // Returns a moment for the current date, as defined by the client's computer or from the `now` option.
-    // Will return an moment with an ambiguous timezone.
-    Calendar.prototype.getNow = function () {
-        var now = this.opt('now');
-        if (typeof now === 'function') {
-            now = now();
-        }
-        return this.moment(now).stripZone();
-    };
-    // Produces a human-readable string for the given duration.
-    // Side-effect: changes the locale of the given duration.
-    Calendar.prototype.humanizeDuration = function (duration) {
-        return duration.locale(this.opt('locale')).humanize();
-    };
-    // will return `null` if invalid range
-    Calendar.prototype.parseUnzonedRange = function (rangeInput) {
-        var start = null;
-        var end = null;
-        if (rangeInput.start) {
-            start = this.moment(rangeInput.start).stripZone();
-        }
-        if (rangeInput.end) {
-            end = this.moment(rangeInput.end).stripZone();
-        }
-        if (!start && !end) {
-            return null;
-        }
-        if (start && end && end.isBefore(start)) {
-            return null;
-        }
-        return new UnzonedRange_1.default(start, end);
-    };
-    // Event-Date Utilities
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.initEventManager = function () {
-        var _this = this;
-        var eventManager = new EventManager_1.default(this);
-        var rawSources = this.opt('eventSources') || [];
-        var singleRawSource = this.opt('events');
-        this.eventManager = eventManager;
-        if (singleRawSource) {
-            rawSources.unshift(singleRawSource);
-        }
-        eventManager.on('release', function (eventsPayload) {
-            _this.trigger('eventsReset', eventsPayload);
-        });
-        eventManager.freeze();
-        rawSources.forEach(function (rawSource) {
-            var source = EventSourceParser_1.default.parse(rawSource, _this);
-            if (source) {
-                eventManager.addSource(source);
-            }
-        });
-        eventManager.thaw();
-    };
-    Calendar.prototype.requestEvents = function (start, end) {
-        return this.eventManager.requestEvents(start, end, this.opt('timezone'), !this.opt('lazyFetching'));
-    };
-    // Get an event's normalized end date. If not present, calculate it from the defaults.
-    Calendar.prototype.getEventEnd = function (event) {
-        if (event.end) {
-            return event.end.clone();
-        }
-        else {
-            return this.getDefaultEventEnd(event.allDay, event.start);
-        }
-    };
-    // Given an event's allDay status and start date, return what its fallback end date should be.
-    // TODO: rename to computeDefaultEventEnd
-    Calendar.prototype.getDefaultEventEnd = function (allDay, zonedStart) {
-        var end = zonedStart.clone();
-        if (allDay) {
-            end.stripTime().add(this.defaultAllDayEventDuration);
-        }
-        else {
-            end.add(this.defaultTimedEventDuration);
-        }
-        if (this.getIsAmbigTimezone()) {
-            end.stripZone(); // we don't know what the tzo should be
-        }
-        return end;
-    };
-    // Public Events API
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.rerenderEvents = function () {
-        this.view.flash('displayingEvents');
-    };
-    Calendar.prototype.refetchEvents = function () {
-        this.eventManager.refetchAllSources();
-    };
-    Calendar.prototype.renderEvents = function (eventInputs, isSticky) {
-        this.eventManager.freeze();
-        for (var i = 0; i < eventInputs.length; i++) {
-            this.renderEvent(eventInputs[i], isSticky);
-        }
-        this.eventManager.thaw();
-    };
-    Calendar.prototype.renderEvent = function (eventInput, isSticky) {
-        if (isSticky === void 0) { isSticky = false; }
-        var eventManager = this.eventManager;
-        var eventDef = EventDefParser_1.default.parse(eventInput, eventInput.source || eventManager.stickySource);
-        if (eventDef) {
-            eventManager.addEventDef(eventDef, isSticky);
-        }
-    };
-    // legacyQuery operates on legacy event instance objects
-    Calendar.prototype.removeEvents = function (legacyQuery) {
-        var eventManager = this.eventManager;
-        var legacyInstances = [];
-        var idMap = {};
-        var eventDef;
-        var i;
-        if (legacyQuery == null) {
-            eventManager.removeAllEventDefs(); // persist=true
-        }
-        else {
-            eventManager.getEventInstances().forEach(function (eventInstance) {
-                legacyInstances.push(eventInstance.toLegacy());
-            });
-            legacyInstances = filterLegacyEventInstances(legacyInstances, legacyQuery);
-            // compute unique IDs
-            for (i = 0; i < legacyInstances.length; i++) {
-                eventDef = this.eventManager.getEventDefByUid(legacyInstances[i]._id);
-                idMap[eventDef.id] = true;
-            }
-            eventManager.freeze();
-            for (i in idMap) {
-                eventManager.removeEventDefsById(i); // persist=true
-            }
-            eventManager.thaw();
-        }
-    };
-    // legacyQuery operates on legacy event instance objects
-    Calendar.prototype.clientEvents = function (legacyQuery) {
-        var legacyEventInstances = [];
-        this.eventManager.getEventInstances().forEach(function (eventInstance) {
-            legacyEventInstances.push(eventInstance.toLegacy());
-        });
-        return filterLegacyEventInstances(legacyEventInstances, legacyQuery);
-    };
-    Calendar.prototype.updateEvents = function (eventPropsArray) {
-        this.eventManager.freeze();
-        for (var i = 0; i < eventPropsArray.length; i++) {
-            this.updateEvent(eventPropsArray[i]);
-        }
-        this.eventManager.thaw();
-    };
-    Calendar.prototype.updateEvent = function (eventProps) {
-        var eventDef = this.eventManager.getEventDefByUid(eventProps._id);
-        var eventInstance;
-        var eventDefMutation;
-        if (eventDef instanceof SingleEventDef_1.default) {
-            eventInstance = eventDef.buildInstance();
-            eventDefMutation = EventDefMutation_1.default.createFromRawProps(eventInstance, eventProps, // raw props
-            null // largeUnit -- who uses it?
-            );
-            this.eventManager.mutateEventsWithId(eventDef.id, eventDefMutation); // will release
-        }
-    };
-    // Public Event Sources API
-    // ------------------------------------------------------------------------------------
-    Calendar.prototype.getEventSources = function () {
-        return this.eventManager.otherSources.slice(); // clone
-    };
-    Calendar.prototype.getEventSourceById = function (id) {
-        return this.eventManager.getSourceById(EventSource_1.default.normalizeId(id));
-    };
-    Calendar.prototype.addEventSource = function (sourceInput) {
-        var source = EventSourceParser_1.default.parse(sourceInput, this);
-        if (source) {
-            this.eventManager.addSource(source);
-        }
-    };
-    Calendar.prototype.removeEventSources = function (sourceMultiQuery) {
-        var eventManager = this.eventManager;
-        var sources;
-        var i;
-        if (sourceMultiQuery == null) {
-            this.eventManager.removeAllSources();
-        }
-        else {
-            sources = eventManager.multiQuerySources(sourceMultiQuery);
-            eventManager.freeze();
-            for (i = 0; i < sources.length; i++) {
-                eventManager.removeSource(sources[i]);
-            }
-            eventManager.thaw();
-        }
-    };
-    Calendar.prototype.removeEventSource = function (sourceQuery) {
-        var eventManager = this.eventManager;
-        var sources = eventManager.querySources(sourceQuery);
-        var i;
-        eventManager.freeze();
-        for (i = 0; i < sources.length; i++) {
-            eventManager.removeSource(sources[i]);
-        }
-        eventManager.thaw();
-    };
-    Calendar.prototype.refetchEventSources = function (sourceMultiQuery) {
-        var eventManager = this.eventManager;
-        var sources = eventManager.multiQuerySources(sourceMultiQuery);
-        var i;
-        eventManager.freeze();
-        for (i = 0; i < sources.length; i++) {
-            eventManager.refetchSource(sources[i]);
-        }
-        eventManager.thaw();
-    };
-    // not for internal use. use options module directly instead.
-    Calendar.defaults = options_1.globalDefaults;
-    Calendar.englishDefaults = options_1.englishDefaults;
-    Calendar.rtlDefaults = options_1.rtlDefaults;
-    return Calendar;
-}());
-exports.default = Calendar;
-EmitterMixin_1.default.mixInto(Calendar);
-ListenerMixin_1.default.mixInto(Calendar);
-function filterLegacyEventInstances(legacyEventInstances, legacyQuery) {
-    if (legacyQuery == null) {
-        return legacyEventInstances;
-    }
-    else if ($.isFunction(legacyQuery)) {
-        return legacyEventInstances.filter(legacyQuery);
-    }
-    else {
-        legacyQuery += ''; // normalize to string
-        return legacyEventInstances.filter(function (legacyEventInstance) {
-            // soft comparison because id not be normalized to string
-            // tslint:disable-next-line
-            return legacyEventInstance.id == legacyQuery ||
-                legacyEventInstance._id === legacyQuery; // can specify internal id, but must exactly match
-        });
-    }
-}
-
-
-/***/ }),
-/* 221 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var UnzonedRange_1 = __webpack_require__(5);
-var DateProfileGenerator = /** @class */ (function () {
-    function DateProfileGenerator(_view) {
-        this._view = _view;
-    }
-    DateProfileGenerator.prototype.opt = function (name) {
-        return this._view.opt(name);
-    };
-    DateProfileGenerator.prototype.trimHiddenDays = function (unzonedRange) {
-        return this._view.trimHiddenDays(unzonedRange);
-    };
-    DateProfileGenerator.prototype.msToUtcMoment = function (ms, forceAllDay) {
-        return this._view.calendar.msToUtcMoment(ms, forceAllDay);
-    };
-    /* Date Range Computation
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Builds a structure with info about what the dates/ranges will be for the "prev" view.
-    DateProfileGenerator.prototype.buildPrev = function (currentDateProfile) {
-        var prevDate = currentDateProfile.date.clone()
-            .startOf(currentDateProfile.currentRangeUnit)
-            .subtract(currentDateProfile.dateIncrement);
-        return this.build(prevDate, -1);
-    };
-    // Builds a structure with info about what the dates/ranges will be for the "next" view.
-    DateProfileGenerator.prototype.buildNext = function (currentDateProfile) {
-        var nextDate = currentDateProfile.date.clone()
-            .startOf(currentDateProfile.currentRangeUnit)
-            .add(currentDateProfile.dateIncrement);
-        return this.build(nextDate, 1);
-    };
-    // Builds a structure holding dates/ranges for rendering around the given date.
-    // Optional direction param indicates whether the date is being incremented/decremented
-    // from its previous value. decremented = -1, incremented = 1 (default).
-    DateProfileGenerator.prototype.build = function (date, direction, forceToValid) {
-        if (forceToValid === void 0) { forceToValid = false; }
-        var isDateAllDay = !date.hasTime();
-        var validUnzonedRange;
-        var minTime = null;
-        var maxTime = null;
-        var currentInfo;
-        var isRangeAllDay;
-        var renderUnzonedRange;
-        var activeUnzonedRange;
-        var isValid;
-        validUnzonedRange = this.buildValidRange();
-        validUnzonedRange = this.trimHiddenDays(validUnzonedRange);
-        if (forceToValid) {
-            date = this.msToUtcMoment(validUnzonedRange.constrainDate(date), // returns MS
-            isDateAllDay);
-        }
-        currentInfo = this.buildCurrentRangeInfo(date, direction);
-        isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
-        renderUnzonedRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.unzonedRange), currentInfo.unit, isRangeAllDay);
-        renderUnzonedRange = this.trimHiddenDays(renderUnzonedRange);
-        activeUnzonedRange = renderUnzonedRange.clone();
-        if (!this.opt('showNonCurrentDates')) {
-            activeUnzonedRange = activeUnzonedRange.intersect(currentInfo.unzonedRange);
-        }
-        minTime = moment.duration(this.opt('minTime'));
-        maxTime = moment.duration(this.opt('maxTime'));
-        activeUnzonedRange = this.adjustActiveRange(activeUnzonedRange, minTime, maxTime);
-        activeUnzonedRange = activeUnzonedRange.intersect(validUnzonedRange); // might return null
-        if (activeUnzonedRange) {
-            date = this.msToUtcMoment(activeUnzonedRange.constrainDate(date), // returns MS
-            isDateAllDay);
-        }
-        // it's invalid if the originally requested date is not contained,
-        // or if the range is completely outside of the valid range.
-        isValid = currentInfo.unzonedRange.intersectsWith(validUnzonedRange);
-        return {
-            // constraint for where prev/next operations can go and where events can be dragged/resized to.
-            // an object with optional start and end properties.
-            validUnzonedRange: validUnzonedRange,
-            // range the view is formally responsible for.
-            // for example, a month view might have 1st-31st, excluding padded dates
-            currentUnzonedRange: currentInfo.unzonedRange,
-            // name of largest unit being displayed, like "month" or "week"
-            currentRangeUnit: currentInfo.unit,
-            isRangeAllDay: isRangeAllDay,
-            // dates that display events and accept drag-n-drop
-            // will be `null` if no dates accept events
-            activeUnzonedRange: activeUnzonedRange,
-            // date range with a rendered skeleton
-            // includes not-active days that need some sort of DOM
-            renderUnzonedRange: renderUnzonedRange,
-            // Duration object that denotes the first visible time of any given day
-            minTime: minTime,
-            // Duration object that denotes the exclusive visible end time of any given day
-            maxTime: maxTime,
-            isValid: isValid,
-            date: date,
-            // how far the current date will move for a prev/next operation
-            dateIncrement: this.buildDateIncrement(currentInfo.duration)
-            // pass a fallback (might be null) ^
-        };
-    };
-    // Builds an object with optional start/end properties.
-    // Indicates the minimum/maximum dates to display.
-    // not responsible for trimming hidden days.
-    DateProfileGenerator.prototype.buildValidRange = function () {
-        return this._view.getUnzonedRangeOption('validRange', this._view.calendar.getNow()) ||
-            new UnzonedRange_1.default(); // completely open-ended
-    };
-    // Builds a structure with info about the "current" range, the range that is
-    // highlighted as being the current month for example.
-    // See build() for a description of `direction`.
-    // Guaranteed to have `range` and `unit` properties. `duration` is optional.
-    // TODO: accept a MS-time instead of a moment `date`?
-    DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
-        var viewSpec = this._view.viewSpec;
-        var duration = null;
-        var unit = null;
-        var unzonedRange = null;
-        var dayCount;
-        if (viewSpec.duration) {
-            duration = viewSpec.duration;
-            unit = viewSpec.durationUnit;
-            unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);
-        }
-        else if ((dayCount = this.opt('dayCount'))) {
-            unit = 'day';
-            unzonedRange = this.buildRangeFromDayCount(date, direction, dayCount);
-        }
-        else if ((unzonedRange = this.buildCustomVisibleRange(date))) {
-            unit = util_1.computeGreatestUnit(unzonedRange.getStart(), unzonedRange.getEnd());
-        }
-        else {
-            duration = this.getFallbackDuration();
-            unit = util_1.computeGreatestUnit(duration);
-            unzonedRange = this.buildRangeFromDuration(date, direction, duration, unit);
-        }
-        return { duration: duration, unit: unit, unzonedRange: unzonedRange };
-    };
-    DateProfileGenerator.prototype.getFallbackDuration = function () {
-        return moment.duration({ days: 1 });
-    };
-    // Returns a new activeUnzonedRange to have time values (un-ambiguate)
-    // minTime or maxTime causes the range to expand.
-    DateProfileGenerator.prototype.adjustActiveRange = function (unzonedRange, minTime, maxTime) {
-        var start = unzonedRange.getStart();
-        var end = unzonedRange.getEnd();
-        if (this._view.usesMinMaxTime) {
-            if (minTime < 0) {
-                start.time(0).add(minTime);
-            }
-            if (maxTime > 24 * 60 * 60 * 1000) {
-                end.time(maxTime - (24 * 60 * 60 * 1000));
-            }
-        }
-        return new UnzonedRange_1.default(start, end);
-    };
-    // Builds the "current" range when it is specified as an explicit duration.
-    // `unit` is the already-computed computeGreatestUnit value of duration.
-    // TODO: accept a MS-time instead of a moment `date`?
-    DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
-        var alignment = this.opt('dateAlignment');
-        var dateIncrementInput;
-        var dateIncrementDuration;
-        var start;
-        var end;
-        var res;
-        // compute what the alignment should be
-        if (!alignment) {
-            dateIncrementInput = this.opt('dateIncrement');
-            if (dateIncrementInput) {
-                dateIncrementDuration = moment.duration(dateIncrementInput);
-                // use the smaller of the two units
-                if (dateIncrementDuration < duration) {
-                    alignment = util_1.computeDurationGreatestUnit(dateIncrementDuration, dateIncrementInput);
-                }
-                else {
-                    alignment = unit;
-                }
-            }
-            else {
-                alignment = unit;
-            }
-        }
-        // if the view displays a single day or smaller
-        if (duration.as('days') <= 1) {
-            if (this._view.isHiddenDay(start)) {
-                start = this._view.skipHiddenDays(start, direction);
-                start.startOf('day');
-            }
-        }
-        function computeRes() {
-            start = date.clone().startOf(alignment);
-            end = start.clone().add(duration);
-            res = new UnzonedRange_1.default(start, end);
-        }
-        computeRes();
-        // if range is completely enveloped by hidden days, go past the hidden days
-        if (!this.trimHiddenDays(res)) {
-            date = this._view.skipHiddenDays(date, direction);
-            computeRes();
-        }
-        return res;
-    };
-    // Builds the "current" range when a dayCount is specified.
-    // TODO: accept a MS-time instead of a moment `date`?
-    DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
-        var customAlignment = this.opt('dateAlignment');
-        var runningCount = 0;
-        var start = date.clone();
-        var end;
-        if (customAlignment) {
-            start.startOf(customAlignment);
-        }
-        start.startOf('day');
-        start = this._view.skipHiddenDays(start, direction);
-        end = start.clone();
-        do {
-            end.add(1, 'day');
-            if (!this._view.isHiddenDay(end)) {
-                runningCount++;
-            }
-        } while (runningCount < dayCount);
-        return new UnzonedRange_1.default(start, end);
-    };
-    // Builds a normalized range object for the "visible" range,
-    // which is a way to define the currentUnzonedRange and activeUnzonedRange at the same time.
-    // TODO: accept a MS-time instead of a moment `date`?
-    DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
-        var visibleUnzonedRange = this._view.getUnzonedRangeOption('visibleRange', this._view.calendar.applyTimezone(date) // correct zone. also generates new obj that avoids mutations
-        );
-        if (visibleUnzonedRange && (visibleUnzonedRange.startMs == null || visibleUnzonedRange.endMs == null)) {
-            return null;
-        }
-        return visibleUnzonedRange;
-    };
-    // Computes the range that will represent the element/cells for *rendering*,
-    // but which may have voided days/times.
-    // not responsible for trimming hidden days.
-    DateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {
-        return currentUnzonedRange.clone();
-    };
-    // Compute the duration value that should be added/substracted to the current date
-    // when a prev/next operation happens.
-    DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
-        var dateIncrementInput = this.opt('dateIncrement');
-        var customAlignment;
-        if (dateIncrementInput) {
-            return moment.duration(dateIncrementInput);
-        }
-        else if ((customAlignment = this.opt('dateAlignment'))) {
-            return moment.duration(1, customAlignment);
-        }
-        else if (fallback) {
-            return fallback;
-        }
-        else {
-            return moment.duration({ days: 1 });
-        }
-    };
-    return DateProfileGenerator;
-}());
-exports.default = DateProfileGenerator;
-
-
-/***/ }),
-/* 222 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var exportHooks = __webpack_require__(16);
-var util_1 = __webpack_require__(4);
-var moment_ext_1 = __webpack_require__(10);
-var ListenerMixin_1 = __webpack_require__(7);
-var HitDragListener_1 = __webpack_require__(23);
-var SingleEventDef_1 = __webpack_require__(13);
-var EventInstanceGroup_1 = __webpack_require__(18);
-var EventSource_1 = __webpack_require__(6);
-var Interaction_1 = __webpack_require__(15);
-var ExternalDropping = /** @class */ (function (_super) {
-    tslib_1.__extends(ExternalDropping, _super);
-    function ExternalDropping() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.isDragging = false; // jqui-dragging an external element? boolean
-        return _this;
-    }
-    /*
-    component impements:
-      - eventRangesToEventFootprints
-      - isEventInstanceGroupAllowed
-      - isExternalInstanceGroupAllowed
-      - renderDrag
-      - unrenderDrag
-    */
-    ExternalDropping.prototype.end = function () {
-        if (this.dragListener) {
-            this.dragListener.endInteraction();
-        }
-    };
-    ExternalDropping.prototype.bindToDocument = function () {
-        this.listenTo($(document), {
-            dragstart: this.handleDragStart,
-            sortstart: this.handleDragStart // jqui
-        });
-    };
-    ExternalDropping.prototype.unbindFromDocument = function () {
-        this.stopListeningTo($(document));
-    };
-    // Called when a jQuery UI drag is initiated anywhere in the DOM
-    ExternalDropping.prototype.handleDragStart = function (ev, ui) {
-        var el;
-        var accept;
-        if (this.opt('droppable')) {
-            el = $((ui ? ui.item : null) || ev.target);
-            // Test that the dragged element passes the dropAccept selector or filter function.
-            // FYI, the default is "*" (matches all)
-            accept = this.opt('dropAccept');
-            if ($.isFunction(accept) ? accept.call(el[0], el) : el.is(accept)) {
-                if (!this.isDragging) {
-                    this.listenToExternalDrag(el, ev, ui);
-                }
-            }
-        }
-    };
-    // Called when a jQuery UI drag starts and it needs to be monitored for dropping
-    ExternalDropping.prototype.listenToExternalDrag = function (el, ev, ui) {
-        var _this = this;
-        var component = this.component;
-        var view = this.view;
-        var meta = getDraggedElMeta(el); // extra data about event drop, including possible event to create
-        var singleEventDef; // a null value signals an unsuccessful drag
-        // listener that tracks mouse movement over date-associated pixel regions
-        var dragListener = this.dragListener = new HitDragListener_1.default(component, {
-            interactionStart: function () {
-                _this.isDragging = true;
-            },
-            hitOver: function (hit) {
-                var isAllowed = true;
-                var hitFootprint = hit.component.getSafeHitFootprint(hit); // hit might not belong to this grid
-                var mutatedEventInstanceGroup;
-                if (hitFootprint) {
-                    singleEventDef = _this.computeExternalDrop(hitFootprint, meta);
-                    if (singleEventDef) {
-                        mutatedEventInstanceGroup = new EventInstanceGroup_1.default(singleEventDef.buildInstances());
-                        isAllowed = meta.eventProps ? // isEvent?
-                            component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup) :
-                            component.isExternalInstanceGroupAllowed(mutatedEventInstanceGroup);
-                    }
-                    else {
-                        isAllowed = false;
-                    }
-                }
-                else {
-                    isAllowed = false;
-                }
-                if (!isAllowed) {
-                    singleEventDef = null;
-                    util_1.disableCursor();
-                }
-                if (singleEventDef) {
-                    component.renderDrag(// called without a seg parameter
-                    component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, view.calendar)));
-                }
-            },
-            hitOut: function () {
-                singleEventDef = null; // signal unsuccessful
-            },
-            hitDone: function () {
-                util_1.enableCursor();
-                component.unrenderDrag();
-            },
-            interactionEnd: function (ev) {
-                if (singleEventDef) {
-                    view.reportExternalDrop(singleEventDef, Boolean(meta.eventProps), // isEvent
-                    Boolean(meta.stick), // isSticky
-                    el, ev, ui);
-                }
-                _this.isDragging = false;
-                _this.dragListener = null;
-            }
-        });
-        dragListener.startDrag(ev); // start listening immediately
-    };
-    // Given a hit to be dropped upon, and misc data associated with the jqui drag (guaranteed to be a plain object),
-    // returns the zoned start/end dates for the event that would result from the hypothetical drop. end might be null.
-    // Returning a null value signals an invalid drop hit.
-    // DOES NOT consider overlap/constraint.
-    // Assumes both footprints are non-open-ended.
-    ExternalDropping.prototype.computeExternalDrop = function (componentFootprint, meta) {
-        var calendar = this.view.calendar;
-        var start = moment_ext_1.default.utc(componentFootprint.unzonedRange.startMs).stripZone();
-        var end;
-        var eventDef;
-        if (componentFootprint.isAllDay) {
-            // if dropped on an all-day span, and element's metadata specified a time, set it
-            if (meta.startTime) {
-                start.time(meta.startTime);
-            }
-            else {
-                start.stripTime();
-            }
-        }
-        if (meta.duration) {
-            end = start.clone().add(meta.duration);
-        }
-        start = calendar.applyTimezone(start);
-        if (end) {
-            end = calendar.applyTimezone(end);
-        }
-        eventDef = SingleEventDef_1.default.parse($.extend({}, meta.eventProps, {
-            start: start,
-            end: end
-        }), new EventSource_1.default(calendar));
-        return eventDef;
-    };
-    return ExternalDropping;
-}(Interaction_1.default));
-exports.default = ExternalDropping;
-ListenerMixin_1.default.mixInto(ExternalDropping);
-/* External-Dragging-Element Data
-----------------------------------------------------------------------------------------------------------------------*/
-// Require all HTML5 data-* attributes used by FullCalendar to have this prefix.
-// A value of '' will query attributes like data-event. A value of 'fc' will query attributes like data-fc-event.
-exportHooks.dataAttrPrefix = '';
-// Given a jQuery element that might represent a dragged FullCalendar event, returns an intermediate data structure
-// to be used for Event Object creation.
-// A defined `.eventProps`, even when empty, indicates that an event should be created.
-function getDraggedElMeta(el) {
-    var prefix = exportHooks.dataAttrPrefix;
-    var eventProps; // properties for creating the event, not related to date/time
-    var startTime; // a Duration
-    var duration;
-    var stick;
-    if (prefix) {
-        prefix += '-';
-    }
-    eventProps = el.data(prefix + 'event') || null;
-    if (eventProps) {
-        if (typeof eventProps === 'object') {
-            eventProps = $.extend({}, eventProps); // make a copy
-        }
-        else {
-            eventProps = {};
-        }
-        // pluck special-cased date/time properties
-        startTime = eventProps.start;
-        if (startTime == null) {
-            startTime = eventProps.time;
-        } // accept 'time' as well
-        duration = eventProps.duration;
-        stick = eventProps.stick;
-        delete eventProps.start;
-        delete eventProps.time;
-        delete eventProps.duration;
-        delete eventProps.stick;
-    }
-    // fallback to standalone attribute values for each of the date/time properties
-    if (startTime == null) {
-        startTime = el.data(prefix + 'start');
-    }
-    if (startTime == null) {
-        startTime = el.data(prefix + 'time');
-    } // accept 'time' as well
-    if (duration == null) {
-        duration = el.data(prefix + 'duration');
-    }
-    if (stick == null) {
-        stick = el.data(prefix + 'stick');
-    }
-    // massage into correct data types
-    startTime = startTime != null ? moment.duration(startTime) : null;
-    duration = duration != null ? moment.duration(duration) : null;
-    stick = Boolean(stick);
-    return { eventProps: eventProps, startTime: startTime, duration: duration, stick: stick };
-}
-
-
-/***/ }),
-/* 223 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var EventDefMutation_1 = __webpack_require__(37);
-var EventDefDateMutation_1 = __webpack_require__(50);
-var HitDragListener_1 = __webpack_require__(23);
-var Interaction_1 = __webpack_require__(15);
-var EventResizing = /** @class */ (function (_super) {
-    tslib_1.__extends(EventResizing, _super);
-    /*
-    component impements:
-      - bindSegHandlerToEl
-      - publiclyTrigger
-      - diffDates
-      - eventRangesToEventFootprints
-      - isEventInstanceGroupAllowed
-      - getSafeHitFootprint
-    */
-    function EventResizing(component, eventPointing) {
-        var _this = _super.call(this, component) || this;
-        _this.isResizing = false;
-        _this.eventPointing = eventPointing;
-        return _this;
-    }
-    EventResizing.prototype.end = function () {
-        if (this.dragListener) {
-            this.dragListener.endInteraction();
-        }
-    };
-    EventResizing.prototype.bindToEl = function (el) {
-        var component = this.component;
-        component.bindSegHandlerToEl(el, 'mousedown', this.handleMouseDown.bind(this));
-        component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));
-    };
-    EventResizing.prototype.handleMouseDown = function (seg, ev) {
-        if (this.component.canStartResize(seg, ev)) {
-            this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))
-                .startInteraction(ev, { distance: 5 });
-        }
-    };
-    EventResizing.prototype.handleTouchStart = function (seg, ev) {
-        if (this.component.canStartResize(seg, ev)) {
-            this.buildDragListener(seg, $(ev.target).is('.fc-start-resizer'))
-                .startInteraction(ev);
-        }
-    };
-    // Creates a listener that tracks the user as they resize an event segment.
-    // Generic enough to work with any type of Grid.
-    EventResizing.prototype.buildDragListener = function (seg, isStart) {
-        var _this = this;
-        var component = this.component;
-        var view = this.view;
-        var calendar = view.calendar;
-        var eventManager = calendar.eventManager;
-        var el = seg.el;
-        var eventDef = seg.footprint.eventDef;
-        var eventInstance = seg.footprint.eventInstance;
-        var isDragging;
-        var resizeMutation; // zoned event date properties. falsy if invalid resize
-        // Tracks mouse movement over the *grid's* coordinate map
-        var dragListener = this.dragListener = new HitDragListener_1.default(component, {
-            scroll: this.opt('dragScroll'),
-            subjectEl: el,
-            interactionStart: function () {
-                isDragging = false;
-            },
-            dragStart: function (ev) {
-                isDragging = true;
-                // ensure a mouseout on the manipulated event has been reported
-                _this.eventPointing.handleMouseout(seg, ev);
-                _this.segResizeStart(seg, ev);
-            },
-            hitOver: function (hit, isOrig, origHit) {
-                var isAllowed = true;
-                var origHitFootprint = component.getSafeHitFootprint(origHit);
-                var hitFootprint = component.getSafeHitFootprint(hit);
-                var mutatedEventInstanceGroup;
-                if (origHitFootprint && hitFootprint) {
-                    resizeMutation = isStart ?
-                        _this.computeEventStartResizeMutation(origHitFootprint, hitFootprint, seg.footprint) :
-                        _this.computeEventEndResizeMutation(origHitFootprint, hitFootprint, seg.footprint);
-                    if (resizeMutation) {
-                        mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, resizeMutation);
-                        isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);
-                    }
-                    else {
-                        isAllowed = false;
-                    }
-                }
-                else {
-                    isAllowed = false;
-                }
-                if (!isAllowed) {
-                    resizeMutation = null;
-                    util_1.disableCursor();
-                }
-                else if (resizeMutation.isEmpty()) {
-                    // no change. (FYI, event dates might have zones)
-                    resizeMutation = null;
-                }
-                if (resizeMutation) {
-                    view.hideEventsWithId(seg.footprint.eventDef.id);
-                    view.renderEventResize(component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg);
-                }
-            },
-            hitOut: function () {
-                resizeMutation = null;
-            },
-            hitDone: function () {
-                view.unrenderEventResize(seg);
-                view.showEventsWithId(seg.footprint.eventDef.id);
-                util_1.enableCursor();
-            },
-            interactionEnd: function (ev) {
-                if (isDragging) {
-                    _this.segResizeStop(seg, ev);
-                }
-                if (resizeMutation) {
-                    // no need to re-show original, will rerender all anyways. esp important if eventRenderWait
-                    view.reportEventResize(eventInstance, resizeMutation, el, ev);
-                }
-                _this.dragListener = null;
-            }
-        });
-        return dragListener;
-    };
-    // Called before event segment resizing starts
-    EventResizing.prototype.segResizeStart = function (seg, ev) {
-        this.isResizing = true;
-        this.component.publiclyTrigger('eventResizeStart', {
-            context: seg.el[0],
-            args: [
-                seg.footprint.getEventLegacy(),
-                ev,
-                {},
-                this.view
-            ]
-        });
-    };
-    // Called after event segment resizing stops
-    EventResizing.prototype.segResizeStop = function (seg, ev) {
-        this.isResizing = false;
-        this.component.publiclyTrigger('eventResizeStop', {
-            context: seg.el[0],
-            args: [
-                seg.footprint.getEventLegacy(),
-                ev,
-                {},
-                this.view
-            ]
-        });
-    };
-    // Returns new date-information for an event segment being resized from its start
-    EventResizing.prototype.computeEventStartResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {
-        var origRange = origEventFootprint.componentFootprint.unzonedRange;
-        var startDelta = this.component.diffDates(endFootprint.unzonedRange.getStart(), startFootprint.unzonedRange.getStart());
-        var dateMutation;
-        var eventDefMutation;
-        if (origRange.getStart().add(startDelta) < origRange.getEnd()) {
-            dateMutation = new EventDefDateMutation_1.default();
-            dateMutation.setStartDelta(startDelta);
-            eventDefMutation = new EventDefMutation_1.default();
-            eventDefMutation.setDateMutation(dateMutation);
-            return eventDefMutation;
-        }
-        return false;
-    };
-    // Returns new date-information for an event segment being resized from its end
-    EventResizing.prototype.computeEventEndResizeMutation = function (startFootprint, endFootprint, origEventFootprint) {
-        var origRange = origEventFootprint.componentFootprint.unzonedRange;
-        var endDelta = this.component.diffDates(endFootprint.unzonedRange.getEnd(), startFootprint.unzonedRange.getEnd());
-        var dateMutation;
-        var eventDefMutation;
-        if (origRange.getEnd().add(endDelta) > origRange.getStart()) {
-            dateMutation = new EventDefDateMutation_1.default();
-            dateMutation.setEndDelta(endDelta);
-            eventDefMutation = new EventDefMutation_1.default();
-            eventDefMutation.setDateMutation(dateMutation);
-            return eventDefMutation;
-        }
-        return false;
-    };
-    return EventResizing;
-}(Interaction_1.default));
-exports.default = EventResizing;
-
-
-/***/ }),
-/* 224 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var EventDefMutation_1 = __webpack_require__(37);
-var EventDefDateMutation_1 = __webpack_require__(50);
-var DragListener_1 = __webpack_require__(54);
-var HitDragListener_1 = __webpack_require__(23);
-var MouseFollower_1 = __webpack_require__(244);
-var Interaction_1 = __webpack_require__(15);
-var EventDragging = /** @class */ (function (_super) {
-    tslib_1.__extends(EventDragging, _super);
-    /*
-    component implements:
-      - bindSegHandlerToEl
-      - publiclyTrigger
-      - diffDates
-      - eventRangesToEventFootprints
-      - isEventInstanceGroupAllowed
-    */
-    function EventDragging(component, eventPointing) {
-        var _this = _super.call(this, component) || this;
-        _this.isDragging = false;
-        _this.eventPointing = eventPointing;
-        return _this;
-    }
-    EventDragging.prototype.end = function () {
-        if (this.dragListener) {
-            this.dragListener.endInteraction();
-        }
-    };
-    EventDragging.prototype.getSelectionDelay = function () {
-        var delay = this.opt('eventLongPressDelay');
-        if (delay == null) {
-            delay = this.opt('longPressDelay'); // fallback
-        }
-        return delay;
-    };
-    EventDragging.prototype.bindToEl = function (el) {
-        var component = this.component;
-        component.bindSegHandlerToEl(el, 'mousedown', this.handleMousedown.bind(this));
-        component.bindSegHandlerToEl(el, 'touchstart', this.handleTouchStart.bind(this));
-    };
-    EventDragging.prototype.handleMousedown = function (seg, ev) {
-        if (!this.component.shouldIgnoreMouse() &&
-            this.component.canStartDrag(seg, ev)) {
-            this.buildDragListener(seg).startInteraction(ev, { distance: 5 });
-        }
-    };
-    EventDragging.prototype.handleTouchStart = function (seg, ev) {
-        var component = this.component;
-        var settings = {
-            delay: this.view.isEventDefSelected(seg.footprint.eventDef) ? // already selected?
-                0 : this.getSelectionDelay()
-        };
-        if (component.canStartDrag(seg, ev)) {
-            this.buildDragListener(seg).startInteraction(ev, settings);
-        }
-        else if (component.canStartSelection(seg, ev)) {
-            this.buildSelectListener(seg).startInteraction(ev, settings);
-        }
-    };
-    // seg isn't draggable, but let's use a generic DragListener
-    // simply for the delay, so it can be selected.
-    // Has side effect of setting/unsetting `dragListener`
-    EventDragging.prototype.buildSelectListener = function (seg) {
-        var _this = this;
-        var view = this.view;
-        var eventDef = seg.footprint.eventDef;
-        var eventInstance = seg.footprint.eventInstance; // null for inverse-background events
-        if (this.dragListener) {
-            return this.dragListener;
-        }
-        var dragListener = this.dragListener = new DragListener_1.default({
-            dragStart: function (ev) {
-                if (dragListener.isTouch &&
-                    !view.isEventDefSelected(eventDef) &&
-                    eventInstance) {
-                    // if not previously selected, will fire after a delay. then, select the event
-                    view.selectEventInstance(eventInstance);
-                }
-            },
-            interactionEnd: function (ev) {
-                _this.dragListener = null;
-            }
-        });
-        return dragListener;
-    };
-    // Builds a listener that will track user-dragging on an event segment.
-    // Generic enough to work with any type of Grid.
-    // Has side effect of setting/unsetting `dragListener`
-    EventDragging.prototype.buildDragListener = function (seg) {
-        var _this = this;
-        var component = this.component;
-        var view = this.view;
-        var calendar = view.calendar;
-        var eventManager = calendar.eventManager;
-        var el = seg.el;
-        var eventDef = seg.footprint.eventDef;
-        var eventInstance = seg.footprint.eventInstance; // null for inverse-background events
-        var isDragging;
-        var mouseFollower; // A clone of the original element that will move with the mouse
-        var eventDefMutation;
-        if (this.dragListener) {
-            return this.dragListener;
-        }
-        // Tracks mouse movement over the *view's* coordinate map. Allows dragging and dropping between subcomponents
-        // of the view.
-        var dragListener = this.dragListener = new HitDragListener_1.default(view, {
-            scroll: this.opt('dragScroll'),
-            subjectEl: el,
-            subjectCenter: true,
-            interactionStart: function (ev) {
-                seg.component = component; // for renderDrag
-                isDragging = false;
-                mouseFollower = new MouseFollower_1.default(seg.el, {
-                    additionalClass: 'fc-dragging',
-                    parentEl: view.el,
-                    opacity: dragListener.isTouch ? null : _this.opt('dragOpacity'),
-                    revertDuration: _this.opt('dragRevertDuration'),
-                    zIndex: 2 // one above the .fc-view
-                });
-                mouseFollower.hide(); // don't show until we know this is a real drag
-                mouseFollower.start(ev);
-            },
-            dragStart: function (ev) {
-                if (dragListener.isTouch &&
-                    !view.isEventDefSelected(eventDef) &&
-                    eventInstance) {
-                    // if not previously selected, will fire after a delay. then, select the event
-                    view.selectEventInstance(eventInstance);
-                }
-                isDragging = true;
-                // ensure a mouseout on the manipulated event has been reported
-                _this.eventPointing.handleMouseout(seg, ev);
-                _this.segDragStart(seg, ev);
-                view.hideEventsWithId(seg.footprint.eventDef.id);
-            },
-            hitOver: function (hit, isOrig, origHit) {
-                var isAllowed = true;
-                var origFootprint;
-                var footprint;
-                var mutatedEventInstanceGroup;
-                // starting hit could be forced (DayGrid.limit)
-                if (seg.hit) {
-                    origHit = seg.hit;
-                }
-                // hit might not belong to this grid, so query origin grid
-                origFootprint = origHit.component.getSafeHitFootprint(origHit);
-                footprint = hit.component.getSafeHitFootprint(hit);
-                if (origFootprint && footprint) {
-                    eventDefMutation = _this.computeEventDropMutation(origFootprint, footprint, eventDef);
-                    if (eventDefMutation) {
-                        mutatedEventInstanceGroup = eventManager.buildMutatedEventInstanceGroup(eventDef.id, eventDefMutation);
-                        isAllowed = component.isEventInstanceGroupAllowed(mutatedEventInstanceGroup);
-                    }
-                    else {
-                        isAllowed = false;
-                    }
-                }
-                else {
-                    isAllowed = false;
-                }
-                if (!isAllowed) {
-                    eventDefMutation = null;
-                    util_1.disableCursor();
-                }
-                // if a valid drop location, have the subclass render a visual indication
-                if (eventDefMutation &&
-                    view.renderDrag(// truthy if rendered something
-                    component.eventRangesToEventFootprints(mutatedEventInstanceGroup.sliceRenderRanges(component.dateProfile.renderUnzonedRange, calendar)), seg, dragListener.isTouch)) {
-                    mouseFollower.hide(); // if the subclass is already using a mock event "helper", hide our own
-                }
-                else {
-                    mouseFollower.show(); // otherwise, have the helper follow the mouse (no snapping)
-                }
-                if (isOrig) {
-                    // needs to have moved hits to be a valid drop
-                    eventDefMutation = null;
-                }
-            },
-            hitOut: function () {
-                view.unrenderDrag(seg); // unrender whatever was done in renderDrag
-                mouseFollower.show(); // show in case we are moving out of all hits
-                eventDefMutation = null;
-            },
-            hitDone: function () {
-                util_1.enableCursor();
-            },
-            interactionEnd: function (ev) {
-                delete seg.component; // prevent side effects
-                // do revert animation if hasn't changed. calls a callback when finished (whether animation or not)
-                mouseFollower.stop(!eventDefMutation, function () {
-                    if (isDragging) {
-                        view.unrenderDrag(seg);
-                        _this.segDragStop(seg, ev);
-                    }
-                    view.showEventsWithId(seg.footprint.eventDef.id);
-                    if (eventDefMutation) {
-                        // no need to re-show original, will rerender all anyways. esp important if eventRenderWait
-                        view.reportEventDrop(eventInstance, eventDefMutation, el, ev);
-                    }
-                });
-                _this.dragListener = null;
-            }
-        });
-        return dragListener;
-    };
-    // Called before event segment dragging starts
-    EventDragging.prototype.segDragStart = function (seg, ev) {
-        this.isDragging = true;
-        this.component.publiclyTrigger('eventDragStart', {
-            context: seg.el[0],
-            args: [
-                seg.footprint.getEventLegacy(),
-                ev,
-                {},
-                this.view
-            ]
-        });
-    };
-    // Called after event segment dragging stops
-    EventDragging.prototype.segDragStop = function (seg, ev) {
-        this.isDragging = false;
-        this.component.publiclyTrigger('eventDragStop', {
-            context: seg.el[0],
-            args: [
-                seg.footprint.getEventLegacy(),
-                ev,
-                {},
-                this.view
-            ]
-        });
-    };
-    // DOES NOT consider overlap/constraint
-    EventDragging.prototype.computeEventDropMutation = function (startFootprint, endFootprint, eventDef) {
-        var eventDefMutation = new EventDefMutation_1.default();
-        eventDefMutation.setDateMutation(this.computeEventDateMutation(startFootprint, endFootprint));
-        return eventDefMutation;
-    };
-    EventDragging.prototype.computeEventDateMutation = function (startFootprint, endFootprint) {
-        var date0 = startFootprint.unzonedRange.getStart();
-        var date1 = endFootprint.unzonedRange.getStart();
-        var clearEnd = false;
-        var forceTimed = false;
-        var forceAllDay = false;
-        var dateDelta;
-        var dateMutation;
-        if (startFootprint.isAllDay !== endFootprint.isAllDay) {
-            clearEnd = true;
-            if (endFootprint.isAllDay) {
-                forceAllDay = true;
-                date0.stripTime();
-            }
-            else {
-                forceTimed = true;
-            }
-        }
-        dateDelta = this.component.diffDates(date1, date0);
-        dateMutation = new EventDefDateMutation_1.default();
-        dateMutation.clearEnd = clearEnd;
-        dateMutation.forceTimed = forceTimed;
-        dateMutation.forceAllDay = forceAllDay;
-        dateMutation.setDateDelta(dateDelta);
-        return dateMutation;
-    };
-    return EventDragging;
-}(Interaction_1.default));
-exports.default = EventDragging;
-
-
-/***/ }),
-/* 225 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var HitDragListener_1 = __webpack_require__(23);
-var ComponentFootprint_1 = __webpack_require__(12);
-var UnzonedRange_1 = __webpack_require__(5);
-var Interaction_1 = __webpack_require__(15);
-var DateSelecting = /** @class */ (function (_super) {
-    tslib_1.__extends(DateSelecting, _super);
-    /*
-    component must implement:
-      - bindDateHandlerToEl
-      - getSafeHitFootprint
-      - renderHighlight
-      - unrenderHighlight
-    */
-    function DateSelecting(component) {
-        var _this = _super.call(this, component) || this;
-        _this.dragListener = _this.buildDragListener();
-        return _this;
-    }
-    DateSelecting.prototype.end = function () {
-        this.dragListener.endInteraction();
-    };
-    DateSelecting.prototype.getDelay = function () {
-        var delay = this.opt('selectLongPressDelay');
-        if (delay == null) {
-            delay = this.opt('longPressDelay'); // fallback
-        }
-        return delay;
-    };
-    DateSelecting.prototype.bindToEl = function (el) {
-        var _this = this;
-        var component = this.component;
-        var dragListener = this.dragListener;
-        component.bindDateHandlerToEl(el, 'mousedown', function (ev) {
-            if (_this.opt('selectable') && !component.shouldIgnoreMouse()) {
-                dragListener.startInteraction(ev, {
-                    distance: _this.opt('selectMinDistance')
-                });
-            }
-        });
-        component.bindDateHandlerToEl(el, 'touchstart', function (ev) {
-            if (_this.opt('selectable') && !component.shouldIgnoreTouch()) {
-                dragListener.startInteraction(ev, {
-                    delay: _this.getDelay()
-                });
-            }
-        });
-        util_1.preventSelection(el);
-    };
-    // Creates a listener that tracks the user's drag across day elements, for day selecting.
-    DateSelecting.prototype.buildDragListener = function () {
-        var _this = this;
-        var component = this.component;
-        var selectionFootprint; // null if invalid selection
-        var dragListener = new HitDragListener_1.default(component, {
-            scroll: this.opt('dragScroll'),
-            interactionStart: function () {
-                selectionFootprint = null;
-            },
-            dragStart: function (ev) {
-                _this.view.unselect(ev); // since we could be rendering a new selection, we want to clear any old one
-            },
-            hitOver: function (hit, isOrig, origHit) {
-                var origHitFootprint;
-                var hitFootprint;
-                if (origHit) {
-                    origHitFootprint = component.getSafeHitFootprint(origHit);
-                    hitFootprint = component.getSafeHitFootprint(hit);
-                    if (origHitFootprint && hitFootprint) {
-                        selectionFootprint = _this.computeSelection(origHitFootprint, hitFootprint);
-                    }
-                    else {
-                        selectionFootprint = null;
-                    }
-                    if (selectionFootprint) {
-                        component.renderSelectionFootprint(selectionFootprint);
-                    }
-                    else if (selectionFootprint === false) {
-                        util_1.disableCursor();
-                    }
-                }
-            },
-            hitOut: function () {
-                selectionFootprint = null;
-                component.unrenderSelection();
-            },
-            hitDone: function () {
-                util_1.enableCursor();
-            },
-            interactionEnd: function (ev, isCancelled) {
-                if (!isCancelled && selectionFootprint) {
-                    // the selection will already have been rendered. just report it
-                    _this.view.reportSelection(selectionFootprint, ev);
-                }
-            }
-        });
-        return dragListener;
-    };
-    // Given the first and last date-spans of a selection, returns another date-span object.
-    // Subclasses can override and provide additional data in the span object. Will be passed to renderSelectionFootprint().
-    // Will return false if the selection is invalid and this should be indicated to the user.
-    // Will return null/undefined if a selection invalid but no error should be reported.
-    DateSelecting.prototype.computeSelection = function (footprint0, footprint1) {
-        var wholeFootprint = this.computeSelectionFootprint(footprint0, footprint1);
-        if (wholeFootprint && !this.isSelectionFootprintAllowed(wholeFootprint)) {
-            return false;
-        }
-        return wholeFootprint;
-    };
-    // Given two spans, must return the combination of the two.
-    // TODO: do this separation of concerns (combining VS validation) for event dnd/resize too.
-    // Assumes both footprints are non-open-ended.
-    DateSelecting.prototype.computeSelectionFootprint = function (footprint0, footprint1) {
-        var ms = [
-            footprint0.unzonedRange.startMs,
-            footprint0.unzonedRange.endMs,
-            footprint1.unzonedRange.startMs,
-            footprint1.unzonedRange.endMs
-        ];
-        ms.sort(util_1.compareNumbers);
-        return new ComponentFootprint_1.default(new UnzonedRange_1.default(ms[0], ms[3]), footprint0.isAllDay);
-    };
-    DateSelecting.prototype.isSelectionFootprintAllowed = function (componentFootprint) {
-        return this.component.dateProfile.validUnzonedRange.containsRange(componentFootprint.unzonedRange) &&
-            this.view.calendar.constraints.isSelectionFootprintAllowed(componentFootprint);
-    };
-    return DateSelecting;
-}(Interaction_1.default));
-exports.default = DateSelecting;
-
-
-/***/ }),
-/* 226 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var moment = __webpack_require__(0);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var Scroller_1 = __webpack_require__(39);
-var View_1 = __webpack_require__(41);
-var TimeGrid_1 = __webpack_require__(227);
-var DayGrid_1 = __webpack_require__(61);
-var AGENDA_ALL_DAY_EVENT_LIMIT = 5;
-var agendaTimeGridMethods;
-var agendaDayGridMethods;
-/* An abstract class for all agenda-related views. Displays one more columns with time slots running vertically.
-----------------------------------------------------------------------------------------------------------------------*/
-// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
-// Responsible for managing width/height.
-var AgendaView = /** @class */ (function (_super) {
-    tslib_1.__extends(AgendaView, _super);
-    function AgendaView(calendar, viewSpec) {
-        var _this = _super.call(this, calendar, viewSpec) || this;
-        _this.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
-        _this.timeGrid = _this.instantiateTimeGrid();
-        _this.addChild(_this.timeGrid);
-        if (_this.opt('allDaySlot')) {
-            _this.dayGrid = _this.instantiateDayGrid(); // the all-day subcomponent of this view
-            _this.addChild(_this.dayGrid);
-        }
-        _this.scroller = new Scroller_1.default({
-            overflowX: 'hidden',
-            overflowY: 'auto'
-        });
-        return _this;
-    }
-    // Instantiates the TimeGrid object this view needs. Draws from this.timeGridClass
-    AgendaView.prototype.instantiateTimeGrid = function () {
-        var timeGrid = new this.timeGridClass(this);
-        util_1.copyOwnProps(agendaTimeGridMethods, timeGrid);
-        return timeGrid;
-    };
-    // Instantiates the DayGrid object this view might need. Draws from this.dayGridClass
-    AgendaView.prototype.instantiateDayGrid = function () {
-        var dayGrid = new this.dayGridClass(this);
-        util_1.copyOwnProps(agendaDayGridMethods, dayGrid);
-        return dayGrid;
-    };
-    /* Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    AgendaView.prototype.renderSkeleton = function () {
-        var timeGridWrapEl;
-        var timeGridEl;
-        this.el.addClass('fc-agenda-view').html(this.renderSkeletonHtml());
-        this.scroller.render();
-        timeGridWrapEl = this.scroller.el.addClass('fc-time-grid-container');
-        timeGridEl = $('<div class="fc-time-grid" />').appendTo(timeGridWrapEl);
-        this.el.find('.fc-body > tr > td').append(timeGridWrapEl);
-        this.timeGrid.headContainerEl = this.el.find('.fc-head-container');
-        this.timeGrid.setElement(timeGridEl);
-        if (this.dayGrid) {
-            this.dayGrid.setElement(this.el.find('.fc-day-grid'));
-            // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
-            this.dayGrid.bottomCoordPadding = this.dayGrid.el.next('hr').outerHeight();
-        }
-    };
-    AgendaView.prototype.unrenderSkeleton = function () {
-        this.timeGrid.removeElement();
-        if (this.dayGrid) {
-            this.dayGrid.removeElement();
-        }
-        this.scroller.destroy();
-    };
-    // Builds the HTML skeleton for the view.
-    // The day-grid and time-grid components will render inside containers defined by this HTML.
-    AgendaView.prototype.renderSkeletonHtml = function () {
-        var theme = this.calendar.theme;
-        return '' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            (this.opt('columnHeader') ?
-                '<thead class="fc-head">' +
-                    '<tr>' +
-                    '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
-                    '</tr>' +
-                    '</thead>' :
-                '') +
-            '<tbody class="fc-body">' +
-            '<tr>' +
-            '<td class="' + theme.getClass('widgetContent') + '">' +
-            (this.dayGrid ?
-                '<div class="fc-day-grid"/>' +
-                    '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '"/>' :
-                '') +
-            '</td>' +
-            '</tr>' +
-            '</tbody>' +
-            '</table>';
-    };
-    // Generates an HTML attribute string for setting the width of the axis, if it is known
-    AgendaView.prototype.axisStyleAttr = function () {
-        if (this.axisWidth != null) {
-            return 'style="width:' + this.axisWidth + 'px"';
-        }
-        return '';
-    };
-    /* Now Indicator
-    ------------------------------------------------------------------------------------------------------------------*/
-    AgendaView.prototype.getNowIndicatorUnit = function () {
-        return this.timeGrid.getNowIndicatorUnit();
-    };
-    /* Dimensions
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Adjusts the vertical dimensions of the view to the specified values
-    AgendaView.prototype.updateSize = function (totalHeight, isAuto, isResize) {
-        var eventLimit;
-        var scrollerHeight;
-        var scrollbarWidths;
-        _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);
-        // make all axis cells line up, and record the width so newly created axis cells will have it
-        this.axisWidth = util_1.matchCellWidths(this.el.find('.fc-axis'));
-        // hack to give the view some height prior to timeGrid's columns being rendered
-        // TODO: separate setting height from scroller VS timeGrid.
-        if (!this.timeGrid.colEls) {
-            if (!isAuto) {
-                scrollerHeight = this.computeScrollerHeight(totalHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            return;
-        }
-        // set of fake row elements that must compensate when scroller has scrollbars
-        var noScrollRowEls = this.el.find('.fc-row:not(.fc-scroller *)');
-        // reset all dimensions back to the original state
-        this.timeGrid.bottomRuleEl.hide(); // .show() will be called later if this <hr> is necessary
-        this.scroller.clear(); // sets height to 'auto' and clears overflow
-        util_1.uncompensateScroll(noScrollRowEls);
-        // limit number of events in the all-day area
-        if (this.dayGrid) {
-            this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
-            eventLimit = this.opt('eventLimit');
-            if (eventLimit && typeof eventLimit !== 'number') {
-                eventLimit = AGENDA_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
-            }
-            if (eventLimit) {
-                this.dayGrid.limitRows(eventLimit);
-            }
-        }
-        if (!isAuto) {
-            scrollerHeight = this.computeScrollerHeight(totalHeight);
-            this.scroller.setHeight(scrollerHeight);
-            scrollbarWidths = this.scroller.getScrollbarWidths();
-            if (scrollbarWidths.left || scrollbarWidths.right) {
-                // make the all-day and header rows lines up
-                util_1.compensateScroll(noScrollRowEls, scrollbarWidths);
-                // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
-                // and reapply the desired height to the scroller.
-                scrollerHeight = this.computeScrollerHeight(totalHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            // guarantees the same scrollbar widths
-            this.scroller.lockOverflow(scrollbarWidths);
-            // if there's any space below the slats, show the horizontal rule.
-            // this won't cause any new overflow, because lockOverflow already called.
-            if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
-                this.timeGrid.bottomRuleEl.show();
-            }
-        }
-    };
-    // given a desired total height of the view, returns what the height of the scroller should be
-    AgendaView.prototype.computeScrollerHeight = function (totalHeight) {
-        return totalHeight -
-            util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-    };
-    /* Scroll
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Computes the initial pre-configured scroll state prior to allowing the user to change it
-    AgendaView.prototype.computeInitialDateScroll = function () {
-        var scrollTime = moment.duration(this.opt('scrollTime'));
-        var top = this.timeGrid.computeTimeTop(scrollTime);
-        // zoom can give weird floating-point values. rather scroll a little bit further
-        top = Math.ceil(top);
-        if (top) {
-            top++; // to overcome top border that slots beyond the first have. looks better
-        }
-        return { top: top };
-    };
-    AgendaView.prototype.queryDateScroll = function () {
-        return { top: this.scroller.getScrollTop() };
-    };
-    AgendaView.prototype.applyDateScroll = function (scroll) {
-        if (scroll.top !== undefined) {
-            this.scroller.setScrollTop(scroll.top);
-        }
-    };
-    /* Hit Areas
-    ------------------------------------------------------------------------------------------------------------------*/
-    // forward all hit-related method calls to the grids (dayGrid might not be defined)
-    AgendaView.prototype.getHitFootprint = function (hit) {
-        // TODO: hit.component is set as a hack to identify where the hit came from
-        return hit.component.getHitFootprint(hit);
-    };
-    AgendaView.prototype.getHitEl = function (hit) {
-        // TODO: hit.component is set as a hack to identify where the hit came from
-        return hit.component.getHitEl(hit);
-    };
-    /* Event Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    AgendaView.prototype.executeEventRender = function (eventsPayload) {
-        var dayEventsPayload = {};
-        var timedEventsPayload = {};
-        var id;
-        var eventInstanceGroup;
-        // separate the events into all-day and timed
-        for (id in eventsPayload) {
-            eventInstanceGroup = eventsPayload[id];
-            if (eventInstanceGroup.getEventDef().isAllDay()) {
-                dayEventsPayload[id] = eventInstanceGroup;
-            }
-            else {
-                timedEventsPayload[id] = eventInstanceGroup;
-            }
-        }
-        this.timeGrid.executeEventRender(timedEventsPayload);
-        if (this.dayGrid) {
-            this.dayGrid.executeEventRender(dayEventsPayload);
-        }
-    };
-    /* Dragging/Resizing Routing
-    ------------------------------------------------------------------------------------------------------------------*/
-    // A returned value of `true` signals that a mock "helper" event has been rendered.
-    AgendaView.prototype.renderDrag = function (eventFootprints, seg, isTouch) {
-        var groups = groupEventFootprintsByAllDay(eventFootprints);
-        var renderedHelper = false;
-        renderedHelper = this.timeGrid.renderDrag(groups.timed, seg, isTouch);
-        if (this.dayGrid) {
-            renderedHelper = this.dayGrid.renderDrag(groups.allDay, seg, isTouch) || renderedHelper;
-        }
-        return renderedHelper;
-    };
-    AgendaView.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {
-        var groups = groupEventFootprintsByAllDay(eventFootprints);
-        this.timeGrid.renderEventResize(groups.timed, seg, isTouch);
-        if (this.dayGrid) {
-            this.dayGrid.renderEventResize(groups.allDay, seg, isTouch);
-        }
-    };
-    /* Selection
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of a selection
-    AgendaView.prototype.renderSelectionFootprint = function (componentFootprint) {
-        if (!componentFootprint.isAllDay) {
-            this.timeGrid.renderSelectionFootprint(componentFootprint);
-        }
-        else if (this.dayGrid) {
-            this.dayGrid.renderSelectionFootprint(componentFootprint);
-        }
-    };
-    return AgendaView;
-}(View_1.default));
-exports.default = AgendaView;
-AgendaView.prototype.timeGridClass = TimeGrid_1.default;
-AgendaView.prototype.dayGridClass = DayGrid_1.default;
-// Will customize the rendering behavior of the AgendaView's timeGrid
-agendaTimeGridMethods = {
-    // Generates the HTML that will go before the day-of week header cells
-    renderHeadIntroHtml: function () {
-        var view = this.view;
-        var calendar = view.calendar;
-        var weekStart = calendar.msToUtcMoment(this.dateProfile.renderUnzonedRange.startMs, true);
-        var weekText;
-        if (this.opt('weekNumbers')) {
-            weekText = weekStart.format(this.opt('smallWeekFormat'));
-            return '' +
-                '<th class="fc-axis fc-week-number ' + calendar.theme.getClass('widgetHeader') + '" ' + view.axisStyleAttr() + '>' +
-                view.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
-                { date: weekStart, type: 'week', forceOff: this.colCnt > 1 }, util_1.htmlEscape(weekText) // inner HTML
-                ) +
-                '</th>';
-        }
-        else {
-            return '<th class="fc-axis ' + calendar.theme.getClass('widgetHeader') + '" ' + view.axisStyleAttr() + '></th>';
-        }
-    },
-    // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
-    renderBgIntroHtml: function () {
-        var view = this.view;
-        return '<td class="fc-axis ' + view.calendar.theme.getClass('widgetContent') + '" ' + view.axisStyleAttr() + '></td>';
-    },
-    // Generates the HTML that goes before all other types of cells.
-    // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.
-    renderIntroHtml: function () {
-        var view = this.view;
-        return '<td class="fc-axis" ' + view.axisStyleAttr() + '></td>';
-    }
-};
-// Will customize the rendering behavior of the AgendaView's dayGrid
-agendaDayGridMethods = {
-    // Generates the HTML that goes before the all-day cells
-    renderBgIntroHtml: function () {
-        var view = this.view;
-        return '' +
-            '<td class="fc-axis ' + view.calendar.theme.getClass('widgetContent') + '" ' + view.axisStyleAttr() + '>' +
-            '<span>' + // needed for matchCellWidths
-            view.getAllDayHtml() +
-            '</span>' +
-            '</td>';
-    },
-    // Generates the HTML that goes before all other types of cells.
-    // Affects content-skeleton, helper-skeleton, highlight-skeleton for both the time-grid and day-grid.
-    renderIntroHtml: function () {
-        var view = this.view;
-        return '<td class="fc-axis" ' + view.axisStyleAttr() + '></td>';
-    }
-};
-function groupEventFootprintsByAllDay(eventFootprints) {
-    var allDay = [];
-    var timed = [];
-    var i;
-    for (i = 0; i < eventFootprints.length; i++) {
-        if (eventFootprints[i].componentFootprint.isAllDay) {
-            allDay.push(eventFootprints[i]);
-        }
-        else {
-            timed.push(eventFootprints[i]);
-        }
-    }
-    return { allDay: allDay, timed: timed };
-}
-
-
-/***/ }),
-/* 227 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var InteractiveDateComponent_1 = __webpack_require__(40);
-var BusinessHourRenderer_1 = __webpack_require__(56);
-var StandardInteractionsMixin_1 = __webpack_require__(60);
-var DayTableMixin_1 = __webpack_require__(55);
-var CoordCache_1 = __webpack_require__(53);
-var UnzonedRange_1 = __webpack_require__(5);
-var ComponentFootprint_1 = __webpack_require__(12);
-var TimeGridEventRenderer_1 = __webpack_require__(246);
-var TimeGridHelperRenderer_1 = __webpack_require__(247);
-var TimeGridFillRenderer_1 = __webpack_require__(248);
-/* A component that renders one or more columns of vertical time slots
-----------------------------------------------------------------------------------------------------------------------*/
-// We mixin DayTable, even though there is only a single row of days
-// potential nice values for the slot-duration and interval-duration
-// from largest to smallest
-var AGENDA_STOCK_SUB_DURATIONS = [
-    { hours: 1 },
-    { minutes: 30 },
-    { minutes: 15 },
-    { seconds: 30 },
-    { seconds: 15 }
-];
-var TimeGrid = /** @class */ (function (_super) {
-    tslib_1.__extends(TimeGrid, _super);
-    function TimeGrid(view) {
-        var _this = _super.call(this, view) || this;
-        _this.processOptions();
-        return _this;
-    }
-    // Slices up the given span (unzoned start/end with other misc data) into an array of segments
-    TimeGrid.prototype.componentFootprintToSegs = function (componentFootprint) {
-        var segs = this.sliceRangeByTimes(componentFootprint.unzonedRange);
-        var i;
-        for (i = 0; i < segs.length; i++) {
-            if (this.isRTL) {
-                segs[i].col = this.daysPerRow - 1 - segs[i].dayIndex;
-            }
-            else {
-                segs[i].col = segs[i].dayIndex;
-            }
-        }
-        return segs;
-    };
-    /* Date Handling
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.sliceRangeByTimes = function (unzonedRange) {
-        var segs = [];
-        var segRange;
-        var dayIndex;
-        for (dayIndex = 0; dayIndex < this.daysPerRow; dayIndex++) {
-            segRange = unzonedRange.intersect(this.dayRanges[dayIndex]);
-            if (segRange) {
-                segs.push({
-                    startMs: segRange.startMs,
-                    endMs: segRange.endMs,
-                    isStart: segRange.isStart,
-                    isEnd: segRange.isEnd,
-                    dayIndex: dayIndex
-                });
-            }
-        }
-        return segs;
-    };
-    /* Options
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Parses various options into properties of this object
-    TimeGrid.prototype.processOptions = function () {
-        var slotDuration = this.opt('slotDuration');
-        var snapDuration = this.opt('snapDuration');
-        var input;
-        slotDuration = moment.duration(slotDuration);
-        snapDuration = snapDuration ? moment.duration(snapDuration) : slotDuration;
-        this.slotDuration = slotDuration;
-        this.snapDuration = snapDuration;
-        this.snapsPerSlot = slotDuration / snapDuration; // TODO: ensure an integer multiple?
-        // might be an array value (for TimelineView).
-        // if so, getting the most granular entry (the last one probably).
-        input = this.opt('slotLabelFormat');
-        if ($.isArray(input)) {
-            input = input[input.length - 1];
-        }
-        this.labelFormat = input ||
-            this.opt('smallTimeFormat'); // the computed default
-        input = this.opt('slotLabelInterval');
-        this.labelInterval = input ?
-            moment.duration(input) :
-            this.computeLabelInterval(slotDuration);
-    };
-    // Computes an automatic value for slotLabelInterval
-    TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
-        var i;
-        var labelInterval;
-        var slotsPerLabel;
-        // find the smallest stock label interval that results in more than one slots-per-label
-        for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
-            labelInterval = moment.duration(AGENDA_STOCK_SUB_DURATIONS[i]);
-            slotsPerLabel = util_1.divideDurationByDuration(labelInterval, slotDuration);
-            if (util_1.isInt(slotsPerLabel) && slotsPerLabel > 1) {
-                return labelInterval;
-            }
-        }
-        return moment.duration(slotDuration); // fall back. clone
-    };
-    /* Date Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.renderDates = function (dateProfile) {
-        this.dateProfile = dateProfile;
-        this.updateDayTable();
-        this.renderSlats();
-        this.renderColumns();
-    };
-    TimeGrid.prototype.unrenderDates = function () {
-        // this.unrenderSlats(); // don't need this because repeated .html() calls clear
-        this.unrenderColumns();
-    };
-    TimeGrid.prototype.renderSkeleton = function () {
-        var theme = this.view.calendar.theme;
-        this.el.html('<div class="fc-bg"></div>' +
-            '<div class="fc-slats"></div>' +
-            '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" style="display:none" />');
-        this.bottomRuleEl = this.el.find('hr');
-    };
-    TimeGrid.prototype.renderSlats = function () {
-        var theme = this.view.calendar.theme;
-        this.slatContainerEl = this.el.find('> .fc-slats')
-            .html(// avoids needing ::unrenderSlats()
-        '<table class="' + theme.getClass('tableGrid') + '">' +
-            this.renderSlatRowHtml() +
-            '</table>');
-        this.slatEls = this.slatContainerEl.find('tr');
-        this.slatCoordCache = new CoordCache_1.default({
-            els: this.slatEls,
-            isVertical: true
-        });
-    };
-    // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
-    TimeGrid.prototype.renderSlatRowHtml = function () {
-        var view = this.view;
-        var calendar = view.calendar;
-        var theme = calendar.theme;
-        var isRTL = this.isRTL;
-        var dateProfile = this.dateProfile;
-        var html = '';
-        var slotTime = moment.duration(+dateProfile.minTime); // wish there was .clone() for durations
-        var slotIterator = moment.duration(0);
-        var slotDate; // will be on the view's first day, but we only care about its time
-        var isLabeled;
-        var axisHtml;
-        // Calculate the time for each slot
-        while (slotTime < dateProfile.maxTime) {
-            slotDate = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs).time(slotTime);
-            isLabeled = util_1.isInt(util_1.divideDurationByDuration(slotIterator, this.labelInterval));
-            axisHtml =
-                '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '" ' + view.axisStyleAttr() + '>' +
-                    (isLabeled ?
-                        '<span>' + // for matchCellWidths
-                            util_1.htmlEscape(slotDate.format(this.labelFormat)) +
-                            '</span>' :
-                        '') +
-                    '</td>';
-            html +=
-                '<tr data-time="' + slotDate.format('HH:mm:ss') + '"' +
-                    (isLabeled ? '' : ' class="fc-minor"') +
-                    '>' +
-                    (!isRTL ? axisHtml : '') +
-                    '<td class="' + theme.getClass('widgetContent') + '"/>' +
-                    (isRTL ? axisHtml : '') +
-                    '</tr>';
-            slotTime.add(this.slotDuration);
-            slotIterator.add(this.slotDuration);
-        }
-        return html;
-    };
-    TimeGrid.prototype.renderColumns = function () {
-        var dateProfile = this.dateProfile;
-        var theme = this.view.calendar.theme;
-        this.dayRanges = this.dayDates.map(function (dayDate) {
-            return new UnzonedRange_1.default(dayDate.clone().add(dateProfile.minTime), dayDate.clone().add(dateProfile.maxTime));
-        });
-        if (this.headContainerEl) {
-            this.headContainerEl.html(this.renderHeadHtml());
-        }
-        this.el.find('> .fc-bg').html('<table class="' + theme.getClass('tableGrid') + '">' +
-            this.renderBgTrHtml(0) + // row=0
-            '</table>');
-        this.colEls = this.el.find('.fc-day, .fc-disabled-day');
-        this.colCoordCache = new CoordCache_1.default({
-            els: this.colEls,
-            isHorizontal: true
-        });
-        this.renderContentSkeleton();
-    };
-    TimeGrid.prototype.unrenderColumns = function () {
-        this.unrenderContentSkeleton();
-    };
-    /* Content Skeleton
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders the DOM that the view's content will live in
-    TimeGrid.prototype.renderContentSkeleton = function () {
-        var cellHtml = '';
-        var i;
-        var skeletonEl;
-        for (i = 0; i < this.colCnt; i++) {
-            cellHtml +=
-                '<td>' +
-                    '<div class="fc-content-col">' +
-                    '<div class="fc-event-container fc-helper-container"></div>' +
-                    '<div class="fc-event-container"></div>' +
-                    '<div class="fc-highlight-container"></div>' +
-                    '<div class="fc-bgevent-container"></div>' +
-                    '<div class="fc-business-container"></div>' +
-                    '</div>' +
-                    '</td>';
-        }
-        skeletonEl = this.contentSkeletonEl = $('<div class="fc-content-skeleton">' +
-            '<table>' +
-            '<tr>' + cellHtml + '</tr>' +
-            '</table>' +
-            '</div>');
-        this.colContainerEls = skeletonEl.find('.fc-content-col');
-        this.helperContainerEls = skeletonEl.find('.fc-helper-container');
-        this.fgContainerEls = skeletonEl.find('.fc-event-container:not(.fc-helper-container)');
-        this.bgContainerEls = skeletonEl.find('.fc-bgevent-container');
-        this.highlightContainerEls = skeletonEl.find('.fc-highlight-container');
-        this.businessContainerEls = skeletonEl.find('.fc-business-container');
-        this.bookendCells(skeletonEl.find('tr')); // TODO: do this on string level
-        this.el.append(skeletonEl);
-    };
-    TimeGrid.prototype.unrenderContentSkeleton = function () {
-        if (this.contentSkeletonEl) {
-            this.contentSkeletonEl.remove();
-            this.contentSkeletonEl = null;
-            this.colContainerEls = null;
-            this.helperContainerEls = null;
-            this.fgContainerEls = null;
-            this.bgContainerEls = null;
-            this.highlightContainerEls = null;
-            this.businessContainerEls = null;
-        }
-    };
-    // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
-    TimeGrid.prototype.groupSegsByCol = function (segs) {
-        var segsByCol = [];
-        var i;
-        for (i = 0; i < this.colCnt; i++) {
-            segsByCol.push([]);
-        }
-        for (i = 0; i < segs.length; i++) {
-            segsByCol[segs[i].col].push(segs[i]);
-        }
-        return segsByCol;
-    };
-    // Given segments grouped by column, insert the segments' elements into a parallel array of container
-    // elements, each living within a column.
-    TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
-        var col;
-        var segs;
-        var i;
-        for (col = 0; col < this.colCnt; col++) {
-            segs = segsByCol[col];
-            for (i = 0; i < segs.length; i++) {
-                containerEls.eq(col).append(segs[i].el);
-            }
-        }
-    };
-    /* Now Indicator
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.getNowIndicatorUnit = function () {
-        return 'minute'; // will refresh on the minute
-    };
-    TimeGrid.prototype.renderNowIndicator = function (date) {
-        // HACK: if date columns not ready for some reason (scheduler)
-        if (!this.colContainerEls) {
-            return;
-        }
-        // seg system might be overkill, but it handles scenario where line needs to be rendered
-        //  more than once because of columns with the same date (resources columns for example)
-        var segs = this.componentFootprintToSegs(new ComponentFootprint_1.default(new UnzonedRange_1.default(date, date.valueOf() + 1), // protect against null range
-        false // all-day
-        ));
-        var top = this.computeDateTop(date, date);
-        var nodes = [];
-        var i;
-        // render lines within the columns
-        for (i = 0; i < segs.length; i++) {
-            nodes.push($('<div class="fc-now-indicator fc-now-indicator-line"></div>')
-                .css('top', top)
-                .appendTo(this.colContainerEls.eq(segs[i].col))[0]);
-        }
-        // render an arrow over the axis
-        if (segs.length > 0) {
-            nodes.push($('<div class="fc-now-indicator fc-now-indicator-arrow"></div>')
-                .css('top', top)
-                .appendTo(this.el.find('.fc-content-skeleton'))[0]);
-        }
-        this.nowIndicatorEls = $(nodes);
-    };
-    TimeGrid.prototype.unrenderNowIndicator = function () {
-        if (this.nowIndicatorEls) {
-            this.nowIndicatorEls.remove();
-            this.nowIndicatorEls = null;
-        }
-    };
-    /* Coordinates
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.updateSize = function (totalHeight, isAuto, isResize) {
-        _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);
-        this.slatCoordCache.build();
-        if (isResize) {
-            this.updateSegVerticals([].concat(this.eventRenderer.getSegs(), this.businessSegs || []));
-        }
-    };
-    TimeGrid.prototype.getTotalSlatHeight = function () {
-        return this.slatContainerEl.outerHeight();
-    };
-    // Computes the top coordinate, relative to the bounds of the grid, of the given date.
-    // `ms` can be a millisecond UTC time OR a UTC moment.
-    // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
-    TimeGrid.prototype.computeDateTop = function (ms, startOfDayDate) {
-        return this.computeTimeTop(moment.duration(ms - startOfDayDate.clone().stripTime()));
-    };
-    // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
-    TimeGrid.prototype.computeTimeTop = function (time) {
-        var len = this.slatEls.length;
-        var dateProfile = this.dateProfile;
-        var slatCoverage = (time - dateProfile.minTime) / this.slotDuration; // floating-point value of # of slots covered
-        var slatIndex;
-        var slatRemainder;
-        // compute a floating-point number for how many slats should be progressed through.
-        // from 0 to number of slats (inclusive)
-        // constrained because minTime/maxTime might be customized.
-        slatCoverage = Math.max(0, slatCoverage);
-        slatCoverage = Math.min(len, slatCoverage);
-        // an integer index of the furthest whole slat
-        // from 0 to number slats (*exclusive*, so len-1)
-        slatIndex = Math.floor(slatCoverage);
-        slatIndex = Math.min(slatIndex, len - 1);
-        // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
-        // could be 1.0 if slatCoverage is covering *all* the slots
-        slatRemainder = slatCoverage - slatIndex;
-        return this.slatCoordCache.getTopPosition(slatIndex) +
-            this.slatCoordCache.getHeight(slatIndex) * slatRemainder;
-    };
-    // Refreshes the CSS top/bottom coordinates for each segment element.
-    // Works when called after initial render, after a window resize/zoom for example.
-    TimeGrid.prototype.updateSegVerticals = function (segs) {
-        this.computeSegVerticals(segs);
-        this.assignSegVerticals(segs);
-    };
-    // For each segment in an array, computes and assigns its top and bottom properties
-    TimeGrid.prototype.computeSegVerticals = function (segs) {
-        var eventMinHeight = this.opt('agendaEventMinHeight');
-        var i;
-        var seg;
-        var dayDate;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            dayDate = this.dayDates[seg.dayIndex];
-            seg.top = this.computeDateTop(seg.startMs, dayDate);
-            seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.endMs, dayDate));
-        }
-    };
-    // Given segments that already have their top/bottom properties computed, applies those values to
-    // the segments' elements.
-    TimeGrid.prototype.assignSegVerticals = function (segs) {
-        var i;
-        var seg;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            seg.el.css(this.generateSegVerticalCss(seg));
-        }
-    };
-    // Generates an object with CSS properties for the top/bottom coordinates of a segment element
-    TimeGrid.prototype.generateSegVerticalCss = function (seg) {
-        return {
-            top: seg.top,
-            bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
-        };
-    };
-    /* Hit System
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.prepareHits = function () {
-        this.colCoordCache.build();
-        this.slatCoordCache.build();
-    };
-    TimeGrid.prototype.releaseHits = function () {
-        this.colCoordCache.clear();
-        // NOTE: don't clear slatCoordCache because we rely on it for computeTimeTop
-    };
-    TimeGrid.prototype.queryHit = function (leftOffset, topOffset) {
-        var snapsPerSlot = this.snapsPerSlot;
-        var colCoordCache = this.colCoordCache;
-        var slatCoordCache = this.slatCoordCache;
-        if (colCoordCache.isLeftInBounds(leftOffset) && slatCoordCache.isTopInBounds(topOffset)) {
-            var colIndex = colCoordCache.getHorizontalIndex(leftOffset);
-            var slatIndex = slatCoordCache.getVerticalIndex(topOffset);
-            if (colIndex != null && slatIndex != null) {
-                var slatTop = slatCoordCache.getTopOffset(slatIndex);
-                var slatHeight = slatCoordCache.getHeight(slatIndex);
-                var partial = (topOffset - slatTop) / slatHeight; // floating point number between 0 and 1
-                var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
-                var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
-                var snapTop = slatTop + (localSnapIndex / snapsPerSlot) * slatHeight;
-                var snapBottom = slatTop + ((localSnapIndex + 1) / snapsPerSlot) * slatHeight;
-                return {
-                    col: colIndex,
-                    snap: snapIndex,
-                    component: this,
-                    left: colCoordCache.getLeftOffset(colIndex),
-                    right: colCoordCache.getRightOffset(colIndex),
-                    top: snapTop,
-                    bottom: snapBottom
-                };
-            }
-        }
-    };
-    TimeGrid.prototype.getHitFootprint = function (hit) {
-        var start = this.getCellDate(0, hit.col); // row=0
-        var time = this.computeSnapTime(hit.snap); // pass in the snap-index
-        var end;
-        start.time(time);
-        end = start.clone().add(this.snapDuration);
-        return new ComponentFootprint_1.default(new UnzonedRange_1.default(start, end), false // all-day?
-        );
-    };
-    // Given a row number of the grid, representing a "snap", returns a time (Duration) from its start-of-day
-    TimeGrid.prototype.computeSnapTime = function (snapIndex) {
-        return moment.duration(this.dateProfile.minTime + this.snapDuration * snapIndex);
-    };
-    TimeGrid.prototype.getHitEl = function (hit) {
-        return this.colEls.eq(hit.col);
-    };
-    /* Event Drag Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of an event being dragged over the specified date(s).
-    // A returned value of `true` signals that a mock "helper" event has been rendered.
-    TimeGrid.prototype.renderDrag = function (eventFootprints, seg, isTouch) {
-        var i;
-        if (seg) {
-            if (eventFootprints.length) {
-                this.helperRenderer.renderEventDraggingFootprints(eventFootprints, seg, isTouch);
-                // signal that a helper has been rendered
-                return true;
-            }
-        }
-        else {
-            for (i = 0; i < eventFootprints.length; i++) {
-                this.renderHighlight(eventFootprints[i].componentFootprint);
-            }
-        }
-    };
-    // Unrenders any visual indication of an event being dragged
-    TimeGrid.prototype.unrenderDrag = function () {
-        this.unrenderHighlight();
-        this.helperRenderer.unrender();
-    };
-    /* Event Resize Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of an event being resized
-    TimeGrid.prototype.renderEventResize = function (eventFootprints, seg, isTouch) {
-        this.helperRenderer.renderEventResizingFootprints(eventFootprints, seg, isTouch);
-    };
-    // Unrenders any visual indication of an event being resized
-    TimeGrid.prototype.unrenderEventResize = function () {
-        this.helperRenderer.unrender();
-    };
-    /* Selection
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
-    TimeGrid.prototype.renderSelectionFootprint = function (componentFootprint) {
-        if (this.opt('selectHelper')) {
-            this.helperRenderer.renderComponentFootprint(componentFootprint);
-        }
-        else {
-            this.renderHighlight(componentFootprint);
-        }
-    };
-    // Unrenders any visual indication of a selection
-    TimeGrid.prototype.unrenderSelection = function () {
-        this.helperRenderer.unrender();
-        this.unrenderHighlight();
-    };
-    return TimeGrid;
-}(InteractiveDateComponent_1.default));
-exports.default = TimeGrid;
-TimeGrid.prototype.eventRendererClass = TimeGridEventRenderer_1.default;
-TimeGrid.prototype.businessHourRendererClass = BusinessHourRenderer_1.default;
-TimeGrid.prototype.helperRendererClass = TimeGridHelperRenderer_1.default;
-TimeGrid.prototype.fillRendererClass = TimeGridFillRenderer_1.default;
-StandardInteractionsMixin_1.default.mixInto(TimeGrid);
-DayTableMixin_1.default.mixInto(TimeGrid);
-
-
-/***/ }),
-/* 228 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var UnzonedRange_1 = __webpack_require__(5);
-var DateProfileGenerator_1 = __webpack_require__(221);
-var BasicViewDateProfileGenerator = /** @class */ (function (_super) {
-    tslib_1.__extends(BasicViewDateProfileGenerator, _super);
-    function BasicViewDateProfileGenerator() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Computes the date range that will be rendered.
-    BasicViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {
-        var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay); // an UnzonedRange
-        var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);
-        var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);
-        // year and month views should be aligned with weeks. this is already done for week
-        if (/^(year|month)$/.test(currentRangeUnit)) {
-            start.startOf('week');
-            // make end-of-week if not already
-            if (end.weekday()) {
-                end.add(1, 'week').startOf('week'); // exclusively move backwards
-            }
-        }
-        return new UnzonedRange_1.default(start, end);
-    };
-    return BasicViewDateProfileGenerator;
-}(DateProfileGenerator_1.default));
-exports.default = BasicViewDateProfileGenerator;
-
-
-/***/ }),
-/* 229 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var moment = __webpack_require__(0);
-var util_1 = __webpack_require__(4);
-var BasicView_1 = __webpack_require__(62);
-var MonthViewDateProfileGenerator_1 = __webpack_require__(253);
-/* A month view with day cells running in rows (one-per-week) and columns
-----------------------------------------------------------------------------------------------------------------------*/
-var MonthView = /** @class */ (function (_super) {
-    tslib_1.__extends(MonthView, _super);
-    function MonthView() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Overrides the default BasicView behavior to have special multi-week auto-height logic
-    MonthView.prototype.setGridHeight = function (height, isAuto) {
-        // if auto, make the height of each row the height that it would be if there were 6 weeks
-        if (isAuto) {
-            height *= this.dayGrid.rowCnt / 6;
-        }
-        util_1.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
-    };
-    MonthView.prototype.isDateInOtherMonth = function (date, dateProfile) {
-        return date.month() !== moment.utc(dateProfile.currentUnzonedRange.startMs).month(); // TODO: optimize
-    };
-    return MonthView;
-}(BasicView_1.default));
-exports.default = MonthView;
-MonthView.prototype.dateProfileGeneratorClass = MonthViewDateProfileGenerator_1.default;
-
-
-/***/ }),
-/* 230 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var UnzonedRange_1 = __webpack_require__(5);
-var View_1 = __webpack_require__(41);
-var Scroller_1 = __webpack_require__(39);
-var ListEventRenderer_1 = __webpack_require__(254);
-var ListEventPointing_1 = __webpack_require__(255);
-/*
-Responsible for the scroller, and forwarding event-related actions into the "grid".
-*/
-var ListView = /** @class */ (function (_super) {
-    tslib_1.__extends(ListView, _super);
-    function ListView(calendar, viewSpec) {
-        var _this = _super.call(this, calendar, viewSpec) || this;
-        _this.segSelector = '.fc-list-item'; // which elements accept event actions
-        _this.scroller = new Scroller_1.default({
-            overflowX: 'hidden',
-            overflowY: 'auto'
-        });
-        return _this;
-    }
-    ListView.prototype.renderSkeleton = function () {
-        this.el.addClass('fc-list-view ' +
-            this.calendar.theme.getClass('listView'));
-        this.scroller.render();
-        this.scroller.el.appendTo(this.el);
-        this.contentEl = this.scroller.scrollEl; // shortcut
-    };
-    ListView.prototype.unrenderSkeleton = function () {
-        this.scroller.destroy(); // will remove the Grid too
-    };
-    ListView.prototype.updateSize = function (totalHeight, isAuto, isResize) {
-        _super.prototype.updateSize.call(this, totalHeight, isAuto, isResize);
-        this.scroller.clear(); // sets height to 'auto' and clears overflow
-        if (!isAuto) {
-            this.scroller.setHeight(this.computeScrollerHeight(totalHeight));
-        }
-    };
-    ListView.prototype.computeScrollerHeight = function (totalHeight) {
-        return totalHeight -
-            util_1.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-    };
-    ListView.prototype.renderDates = function (dateProfile) {
-        var calendar = this.calendar;
-        var dayStart = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.startMs, true);
-        var viewEnd = calendar.msToUtcMoment(dateProfile.renderUnzonedRange.endMs, true);
-        var dayDates = [];
-        var dayRanges = [];
-        while (dayStart < viewEnd) {
-            dayDates.push(dayStart.clone());
-            dayRanges.push(new UnzonedRange_1.default(dayStart, dayStart.clone().add(1, 'day')));
-            dayStart.add(1, 'day');
-        }
-        this.dayDates = dayDates;
-        this.dayRanges = dayRanges;
-        // all real rendering happens in EventRenderer
-    };
-    // slices by day
-    ListView.prototype.componentFootprintToSegs = function (footprint) {
-        var dayRanges = this.dayRanges;
-        var dayIndex;
-        var segRange;
-        var seg;
-        var segs = [];
-        for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
-            segRange = footprint.unzonedRange.intersect(dayRanges[dayIndex]);
-            if (segRange) {
-                seg = {
-                    startMs: segRange.startMs,
-                    endMs: segRange.endMs,
-                    isStart: segRange.isStart,
-                    isEnd: segRange.isEnd,
-                    dayIndex: dayIndex
-                };
-                segs.push(seg);
-                // detect when footprint won't go fully into the next day,
-                // and mutate the latest seg to the be the end.
-                if (!seg.isEnd && !footprint.isAllDay &&
-                    dayIndex + 1 < dayRanges.length &&
-                    footprint.unzonedRange.endMs < dayRanges[dayIndex + 1].startMs + this.nextDayThreshold) {
-                    seg.endMs = footprint.unzonedRange.endMs;
-                    seg.isEnd = true;
-                    break;
-                }
-            }
-        }
-        return segs;
-    };
-    ListView.prototype.renderEmptyMessage = function () {
-        this.contentEl.html('<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
-            '<div class="fc-list-empty-wrap1">' +
-            '<div class="fc-list-empty">' +
-            util_1.htmlEscape(this.opt('noEventsMessage')) +
-            '</div>' +
-            '</div>' +
-            '</div>');
-    };
-    // render the event segments in the view
-    ListView.prototype.renderSegList = function (allSegs) {
-        var segsByDay = this.groupSegsByDay(allSegs); // sparse array
-        var dayIndex;
-        var daySegs;
-        var i;
-        var tableEl = $('<table class="fc-list-table ' + this.calendar.theme.getClass('tableList') + '"><tbody/></table>');
-        var tbodyEl = tableEl.find('tbody');
-        for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
-            daySegs = segsByDay[dayIndex];
-            if (daySegs) {
-                // append a day header
-                tbodyEl.append(this.dayHeaderHtml(this.dayDates[dayIndex]));
-                this.eventRenderer.sortEventSegs(daySegs);
-                for (i = 0; i < daySegs.length; i++) {
-                    tbodyEl.append(daySegs[i].el); // append event row
-                }
-            }
-        }
-        this.contentEl.empty().append(tableEl);
-    };
-    // Returns a sparse array of arrays, segs grouped by their dayIndex
-    ListView.prototype.groupSegsByDay = function (segs) {
-        var segsByDay = []; // sparse array
-        var i;
-        var seg;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
-                .push(seg);
-        }
-        return segsByDay;
-    };
-    // generates the HTML for the day headers that live amongst the event rows
-    ListView.prototype.dayHeaderHtml = function (dayDate) {
-        var mainFormat = this.opt('listDayFormat');
-        var altFormat = this.opt('listDayAltFormat');
-        return '<tr class="fc-list-heading" data-date="' + dayDate.format('YYYY-MM-DD') + '">' +
-            '<td class="' + (this.calendar.theme.getClass('tableListHeading') ||
-            this.calendar.theme.getClass('widgetHeader')) + '" colspan="3">' +
-            (mainFormat ?
-                this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-main' }, util_1.htmlEscape(dayDate.format(mainFormat)) // inner HTML
-                ) :
-                '') +
-            (altFormat ?
-                this.buildGotoAnchorHtml(dayDate, { 'class': 'fc-list-heading-alt' }, util_1.htmlEscape(dayDate.format(altFormat)) // inner HTML
-                ) :
-                '') +
-            '</td>' +
-            '</tr>';
-    };
-    return ListView;
-}(View_1.default));
-exports.default = ListView;
-ListView.prototype.eventRendererClass = ListEventRenderer_1.default;
-ListView.prototype.eventPointingClass = ListEventPointing_1.default;
-
-
-/***/ }),
-/* 231 */,
-/* 232 */,
-/* 233 */,
-/* 234 */,
-/* 235 */,
-/* 236 */
-/***/ (function(module, exports, __webpack_require__) {
-
-var $ = __webpack_require__(3);
-var exportHooks = __webpack_require__(16);
-var util_1 = __webpack_require__(4);
-var Calendar_1 = __webpack_require__(220);
-// for intentional side-effects
-__webpack_require__(10);
-__webpack_require__(47);
-__webpack_require__(256);
-__webpack_require__(257);
-__webpack_require__(260);
-__webpack_require__(261);
-__webpack_require__(262);
-__webpack_require__(263);
-$.fullCalendar = exportHooks;
-$.fn.fullCalendar = function (options) {
-    var args = Array.prototype.slice.call(arguments, 1); // for a possible method call
-    var res = this; // what this function will return (this jQuery object by default)
-    this.each(function (i, _element) {
-        var element = $(_element);
-        var calendar = element.data('fullCalendar'); // get the existing calendar object (if any)
-        var singleRes; // the returned value of this single method call
-        // a method call
-        if (typeof options === 'string') {
-            if (options === 'getCalendar') {
-                if (!i) {
-                    res = calendar;
-                }
-            }
-            else if (options === 'destroy') {
-                if (calendar) {
-                    calendar.destroy();
-                    element.removeData('fullCalendar');
-                }
-            }
-            else if (!calendar) {
-                util_1.warn('Attempting to call a FullCalendar method on an element with no calendar.');
-            }
-            else if ($.isFunction(calendar[options])) {
-                singleRes = calendar[options].apply(calendar, args);
-                if (!i) {
-                    res = singleRes; // record the first method call result
-                }
-                if (options === 'destroy') {
-                    element.removeData('fullCalendar');
-                }
-            }
-            else {
-                util_1.warn("'" + options + "' is an unknown FullCalendar method.");
-            }
-        }
-        else if (!calendar) {
-            calendar = new Calendar_1.default(element, options);
-            element.data('fullCalendar', calendar);
-            calendar.render();
-        }
-    });
-    return res;
-};
-module.exports = exportHooks;
-
-
-/***/ }),
-/* 237 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Model_1 = __webpack_require__(48);
-var Component = /** @class */ (function (_super) {
-    tslib_1.__extends(Component, _super);
-    function Component() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    Component.prototype.setElement = function (el) {
-        this.el = el;
-        this.bindGlobalHandlers();
-        this.renderSkeleton();
-        this.set('isInDom', true);
-    };
-    Component.prototype.removeElement = function () {
-        this.unset('isInDom');
-        this.unrenderSkeleton();
-        this.unbindGlobalHandlers();
-        this.el.remove();
-        // NOTE: don't null-out this.el in case the View was destroyed within an API callback.
-        // We don't null-out the View's other jQuery element references upon destroy,
-        //  so we shouldn't kill this.el either.
-    };
-    Component.prototype.bindGlobalHandlers = function () {
-        // subclasses can override
-    };
-    Component.prototype.unbindGlobalHandlers = function () {
-        // subclasses can override
-    };
-    /*
-    NOTE: Can't have a `render` method. Read the deprecation notice in View::executeDateRender
-    */
-    // Renders the basic structure of the view before any content is rendered
-    Component.prototype.renderSkeleton = function () {
-        // subclasses should implement
-    };
-    // Unrenders the basic structure of the view
-    Component.prototype.unrenderSkeleton = function () {
-        // subclasses should implement
-    };
-    return Component;
-}(Model_1.default));
-exports.default = Component;
-
-
-/***/ }),
-/* 238 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var Iterator = /** @class */ (function () {
-    function Iterator(items) {
-        this.items = items || [];
-    }
-    /* Calls a method on every item passing the arguments through */
-    Iterator.prototype.proxyCall = function (methodName) {
-        var args = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            args[_i - 1] = arguments[_i];
-        }
-        var results = [];
-        this.items.forEach(function (item) {
-            results.push(item[methodName].apply(item, args));
-        });
-        return results;
-    };
-    return Iterator;
-}());
-exports.default = Iterator;
-
-
-/***/ }),
-/* 239 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-/* Toolbar with buttons and title
-----------------------------------------------------------------------------------------------------------------------*/
-var Toolbar = /** @class */ (function () {
-    function Toolbar(calendar, toolbarOptions) {
-        this.el = null; // mirrors local `el`
-        this.viewsWithButtons = [];
-        this.calendar = calendar;
-        this.toolbarOptions = toolbarOptions;
-    }
-    // method to update toolbar-specific options, not calendar-wide options
-    Toolbar.prototype.setToolbarOptions = function (newToolbarOptions) {
-        this.toolbarOptions = newToolbarOptions;
-    };
-    // can be called repeatedly and will rerender
-    Toolbar.prototype.render = function () {
-        var sections = this.toolbarOptions.layout;
-        var el = this.el;
-        if (sections) {
-            if (!el) {
-                el = this.el = $("<div class='fc-toolbar " + this.toolbarOptions.extraClasses + "'/>");
-            }
-            else {
-                el.empty();
-            }
-            el.append(this.renderSection('left'))
-                .append(this.renderSection('right'))
-                .append(this.renderSection('center'))
-                .append('<div class="fc-clear"/>');
-        }
-        else {
-            this.removeElement();
-        }
-    };
-    Toolbar.prototype.removeElement = function () {
-        if (this.el) {
-            this.el.remove();
-            this.el = null;
-        }
-    };
-    Toolbar.prototype.renderSection = function (position) {
-        var _this = this;
-        var calendar = this.calendar;
-        var theme = calendar.theme;
-        var optionsManager = calendar.optionsManager;
-        var viewSpecManager = calendar.viewSpecManager;
-        var sectionEl = $('<div class="fc-' + position + '"/>');
-        var buttonStr = this.toolbarOptions.layout[position];
-        var calendarCustomButtons = optionsManager.get('customButtons') || {};
-        var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
-        var calendarButtonText = optionsManager.get('buttonText') || {};
-        if (buttonStr) {
-            $.each(buttonStr.split(' '), function (i, buttonGroupStr) {
-                var groupChildren = $();
-                var isOnlyButtons = true;
-                var groupEl;
-                $.each(buttonGroupStr.split(','), function (j, buttonName) {
-                    var customButtonProps;
-                    var viewSpec;
-                    var buttonClick;
-                    var buttonIcon; // only one of these will be set
-                    var buttonText; // "
-                    var buttonInnerHtml;
-                    var buttonClasses;
-                    var buttonEl;
-                    var buttonAriaAttr;
-                    if (buttonName === 'title') {
-                        groupChildren = groupChildren.add($('<h2>&nbsp;</h2>')); // we always want it to take up height
-                        isOnlyButtons = false;
-                    }
-                    else {
-                        if ((customButtonProps = calendarCustomButtons[buttonName])) {
-                            buttonClick = function (ev) {
-                                if (customButtonProps.click) {
-                                    customButtonProps.click.call(buttonEl[0], ev);
-                                }
-                            };
-                            (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
-                                (buttonIcon = theme.getIconClass(buttonName)) ||
-                                (buttonText = customButtonProps.text);
-                        }
-                        else if ((viewSpec = viewSpecManager.getViewSpec(buttonName))) {
-                            _this.viewsWithButtons.push(buttonName);
-                            buttonClick = function () {
-                                calendar.changeView(buttonName);
-                            };
-                            (buttonText = viewSpec.buttonTextOverride) ||
-                                (buttonIcon = theme.getIconClass(buttonName)) ||
-                                (buttonText = viewSpec.buttonTextDefault);
-                        }
-                        else if (calendar[buttonName]) {
-                            buttonClick = function () {
-                                calendar[buttonName]();
-                            };
-                            (buttonText = calendarButtonTextOverrides[buttonName]) ||
-                                (buttonIcon = theme.getIconClass(buttonName)) ||
-                                (buttonText = calendarButtonText[buttonName]);
-                            //            ^ everything else is considered default
-                        }
-                        if (buttonClick) {
-                            buttonClasses = [
-                                'fc-' + buttonName + '-button',
-                                theme.getClass('button'),
-                                theme.getClass('stateDefault')
-                            ];
-                            if (buttonText) {
-                                buttonInnerHtml = util_1.htmlEscape(buttonText);
-                                buttonAriaAttr = '';
-                            }
-                            else if (buttonIcon) {
-                                buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
-                                buttonAriaAttr = ' aria-label="' + buttonName + '"';
-                            }
-                            buttonEl = $(// type="button" so that it doesn't submit a form
-                            '<button type="button" class="' + buttonClasses.join(' ') + '"' +
-                                buttonAriaAttr +
-                                '>' + buttonInnerHtml + '</button>')
-                                .click(function (ev) {
-                                // don't process clicks for disabled buttons
-                                if (!buttonEl.hasClass(theme.getClass('stateDisabled'))) {
-                                    buttonClick(ev);
-                                    // after the click action, if the button becomes the "active" tab, or disabled,
-                                    // it should never have a hover class, so remove it now.
-                                    if (buttonEl.hasClass(theme.getClass('stateActive')) ||
-                                        buttonEl.hasClass(theme.getClass('stateDisabled'))) {
-                                        buttonEl.removeClass(theme.getClass('stateHover'));
-                                    }
-                                }
-                            })
-                                .mousedown(function () {
-                                // the *down* effect (mouse pressed in).
-                                // only on buttons that are not the "active" tab, or disabled
-                                buttonEl
-                                    .not('.' + theme.getClass('stateActive'))
-                                    .not('.' + theme.getClass('stateDisabled'))
-                                    .addClass(theme.getClass('stateDown'));
-                            })
-                                .mouseup(function () {
-                                // undo the *down* effect
-                                buttonEl.removeClass(theme.getClass('stateDown'));
-                            })
-                                .hover(function () {
-                                // the *hover* effect.
-                                // only on buttons that are not the "active" tab, or disabled
-                                buttonEl
-                                    .not('.' + theme.getClass('stateActive'))
-                                    .not('.' + theme.getClass('stateDisabled'))
-                                    .addClass(theme.getClass('stateHover'));
-                            }, function () {
-                                // undo the *hover* effect
-                                buttonEl
-                                    .removeClass(theme.getClass('stateHover'))
-                                    .removeClass(theme.getClass('stateDown')); // if mouseleave happens before mouseup
-                            });
-                            groupChildren = groupChildren.add(buttonEl);
-                        }
-                    }
-                });
-                if (isOnlyButtons) {
-                    groupChildren
-                        .first().addClass(theme.getClass('cornerLeft')).end()
-                        .last().addClass(theme.getClass('cornerRight')).end();
-                }
-                if (groupChildren.length > 1) {
-                    groupEl = $('<div/>');
-                    if (isOnlyButtons) {
-                        groupEl.addClass(theme.getClass('buttonGroup'));
-                    }
-                    groupEl.append(groupChildren);
-                    sectionEl.append(groupEl);
-                }
-                else {
-                    sectionEl.append(groupChildren); // 1 or 0 children
-                }
-            });
-        }
-        return sectionEl;
-    };
-    Toolbar.prototype.updateTitle = function (text) {
-        if (this.el) {
-            this.el.find('h2').text(text);
-        }
-    };
-    Toolbar.prototype.activateButton = function (buttonName) {
-        if (this.el) {
-            this.el.find('.fc-' + buttonName + '-button')
-                .addClass(this.calendar.theme.getClass('stateActive'));
-        }
-    };
-    Toolbar.prototype.deactivateButton = function (buttonName) {
-        if (this.el) {
-            this.el.find('.fc-' + buttonName + '-button')
-                .removeClass(this.calendar.theme.getClass('stateActive'));
-        }
-    };
-    Toolbar.prototype.disableButton = function (buttonName) {
-        if (this.el) {
-            this.el.find('.fc-' + buttonName + '-button')
-                .prop('disabled', true)
-                .addClass(this.calendar.theme.getClass('stateDisabled'));
-        }
-    };
-    Toolbar.prototype.enableButton = function (buttonName) {
-        if (this.el) {
-            this.el.find('.fc-' + buttonName + '-button')
-                .prop('disabled', false)
-                .removeClass(this.calendar.theme.getClass('stateDisabled'));
-        }
-    };
-    Toolbar.prototype.getViewsWithButtons = function () {
-        return this.viewsWithButtons;
-    };
-    return Toolbar;
-}());
-exports.default = Toolbar;
-
-
-/***/ }),
-/* 240 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var options_1 = __webpack_require__(32);
-var locale_1 = __webpack_require__(31);
-var Model_1 = __webpack_require__(48);
-var OptionsManager = /** @class */ (function (_super) {
-    tslib_1.__extends(OptionsManager, _super);
-    function OptionsManager(_calendar, overrides) {
-        var _this = _super.call(this) || this;
-        _this._calendar = _calendar;
-        _this.overrides = $.extend({}, overrides); // make a copy
-        _this.dynamicOverrides = {};
-        _this.compute();
-        return _this;
-    }
-    OptionsManager.prototype.add = function (newOptionHash) {
-        var optionCnt = 0;
-        var optionName;
-        this.recordOverrides(newOptionHash); // will trigger this model's watchers
-        for (optionName in newOptionHash) {
-            optionCnt++;
-        }
-        // special-case handling of single option change.
-        // if only one option change, `optionName` will be its name.
-        if (optionCnt === 1) {
-            if (optionName === 'height' || optionName === 'contentHeight' || optionName === 'aspectRatio') {
-                this._calendar.updateViewSize(true); // isResize=true
-                return;
-            }
-            else if (optionName === 'defaultDate') {
-                return; // can't change date this way. use gotoDate instead
-            }
-            else if (optionName === 'businessHours') {
-                return; // this model already reacts to this
-            }
-            else if (/^(event|select)(Overlap|Constraint|Allow)$/.test(optionName)) {
-                return; // doesn't affect rendering. only interactions.
-            }
-            else if (optionName === 'timezone') {
-                this._calendar.view.flash('initialEvents');
-                return;
-            }
-        }
-        // catch-all. rerender the header and footer and rebuild/rerender the current view
-        this._calendar.renderHeader();
-        this._calendar.renderFooter();
-        // even non-current views will be affected by this option change. do before rerender
-        // TODO: detangle
-        this._calendar.viewsByType = {};
-        this._calendar.reinitView();
-    };
-    // Computes the flattened options hash for the calendar and assigns to `this.options`.
-    // Assumes this.overrides and this.dynamicOverrides have already been initialized.
-    OptionsManager.prototype.compute = function () {
-        var locale;
-        var localeDefaults;
-        var isRTL;
-        var dirDefaults;
-        var rawOptions;
-        locale = util_1.firstDefined(// explicit locale option given?
-        this.dynamicOverrides.locale, this.overrides.locale);
-        localeDefaults = locale_1.localeOptionHash[locale];
-        if (!localeDefaults) {
-            locale = options_1.globalDefaults.locale;
-            localeDefaults = locale_1.localeOptionHash[locale] || {};
-        }
-        isRTL = util_1.firstDefined(// based on options computed so far, is direction RTL?
-        this.dynamicOverrides.isRTL, this.overrides.isRTL, localeDefaults.isRTL, options_1.globalDefaults.isRTL);
-        dirDefaults = isRTL ? options_1.rtlDefaults : {};
-        this.dirDefaults = dirDefaults;
-        this.localeDefaults = localeDefaults;
-        rawOptions = options_1.mergeOptions([
-            options_1.globalDefaults,
-            dirDefaults,
-            localeDefaults,
-            this.overrides,
-            this.dynamicOverrides
-        ]);
-        locale_1.populateInstanceComputableOptions(rawOptions); // fill in gaps with computed options
-        this.reset(rawOptions);
-    };
-    // stores the new options internally, but does not rerender anything.
-    OptionsManager.prototype.recordOverrides = function (newOptionHash) {
-        var optionName;
-        for (optionName in newOptionHash) {
-            this.dynamicOverrides[optionName] = newOptionHash[optionName];
-        }
-        this._calendar.viewSpecManager.clearCache(); // the dynamic override invalidates the options in this cache, so just clear it
-        this.compute(); // this.options needs to be recomputed after the dynamic override
-    };
-    return OptionsManager;
-}(Model_1.default));
-exports.default = OptionsManager;
-
-
-/***/ }),
-/* 241 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var moment = __webpack_require__(0);
-var $ = __webpack_require__(3);
-var ViewRegistry_1 = __webpack_require__(22);
-var util_1 = __webpack_require__(4);
-var options_1 = __webpack_require__(32);
-var locale_1 = __webpack_require__(31);
-var ViewSpecManager = /** @class */ (function () {
-    function ViewSpecManager(optionsManager, _calendar) {
-        this.optionsManager = optionsManager;
-        this._calendar = _calendar;
-        this.clearCache();
-    }
-    ViewSpecManager.prototype.clearCache = function () {
-        this.viewSpecCache = {};
-    };
-    // Gets information about how to create a view. Will use a cache.
-    ViewSpecManager.prototype.getViewSpec = function (viewType) {
-        var cache = this.viewSpecCache;
-        return cache[viewType] || (cache[viewType] = this.buildViewSpec(viewType));
-    };
-    // Given a duration singular unit, like "week" or "day", finds a matching view spec.
-    // Preference is given to views that have corresponding buttons.
-    ViewSpecManager.prototype.getUnitViewSpec = function (unit) {
-        var viewTypes;
-        var i;
-        var spec;
-        if ($.inArray(unit, util_1.unitsDesc) !== -1) {
-            // put views that have buttons first. there will be duplicates, but oh well
-            viewTypes = this._calendar.header.getViewsWithButtons(); // TODO: include footer as well?
-            $.each(ViewRegistry_1.viewHash, function (viewType) {
-                viewTypes.push(viewType);
-            });
-            for (i = 0; i < viewTypes.length; i++) {
-                spec = this.getViewSpec(viewTypes[i]);
-                if (spec) {
-                    if (spec.singleUnit === unit) {
-                        return spec;
-                    }
-                }
-            }
-        }
-    };
-    // Builds an object with information on how to create a given view
-    ViewSpecManager.prototype.buildViewSpec = function (requestedViewType) {
-        var viewOverrides = this.optionsManager.overrides.views || {};
-        var specChain = []; // for the view. lowest to highest priority
-        var defaultsChain = []; // for the view. lowest to highest priority
-        var overridesChain = []; // for the view. lowest to highest priority
-        var viewType = requestedViewType;
-        var spec; // for the view
-        var overrides; // for the view
-        var durationInput;
-        var duration;
-        var unit;
-        // iterate from the specific view definition to a more general one until we hit an actual View class
-        while (viewType) {
-            spec = ViewRegistry_1.viewHash[viewType];
-            overrides = viewOverrides[viewType];
-            viewType = null; // clear. might repopulate for another iteration
-            if (typeof spec === 'function') {
-                spec = { 'class': spec };
-            }
-            if (spec) {
-                specChain.unshift(spec);
-                defaultsChain.unshift(spec.defaults || {});
-                durationInput = durationInput || spec.duration;
-                viewType = viewType || spec.type;
-            }
-            if (overrides) {
-                overridesChain.unshift(overrides); // view-specific option hashes have options at zero-level
-                durationInput = durationInput || overrides.duration;
-                viewType = viewType || overrides.type;
-            }
-        }
-        spec = util_1.mergeProps(specChain);
-        spec.type = requestedViewType;
-        if (!spec['class']) {
-            return false;
-        }
-        // fall back to top-level `duration` option
-        durationInput = durationInput ||
-            this.optionsManager.dynamicOverrides.duration ||
-            this.optionsManager.overrides.duration;
-        if (durationInput) {
-            duration = moment.duration(durationInput);
-            if (duration.valueOf()) {
-                unit = util_1.computeDurationGreatestUnit(duration, durationInput);
-                spec.duration = duration;
-                spec.durationUnit = unit;
-                // view is a single-unit duration, like "week" or "day"
-                // incorporate options for this. lowest priority
-                if (duration.as(unit) === 1) {
-                    spec.singleUnit = unit;
-                    overridesChain.unshift(viewOverrides[unit] || {});
-                }
-            }
-        }
-        spec.defaults = options_1.mergeOptions(defaultsChain);
-        spec.overrides = options_1.mergeOptions(overridesChain);
-        this.buildViewSpecOptions(spec);
-        this.buildViewSpecButtonText(spec, requestedViewType);
-        return spec;
-    };
-    // Builds and assigns a view spec's options object from its already-assigned defaults and overrides
-    ViewSpecManager.prototype.buildViewSpecOptions = function (spec) {
-        var optionsManager = this.optionsManager;
-        spec.options = options_1.mergeOptions([
-            options_1.globalDefaults,
-            spec.defaults,
-            optionsManager.dirDefaults,
-            optionsManager.localeDefaults,
-            optionsManager.overrides,
-            spec.overrides,
-            optionsManager.dynamicOverrides // dynamically set via setter. highest precedence
-        ]);
-        locale_1.populateInstanceComputableOptions(spec.options);
-    };
-    // Computes and assigns a view spec's buttonText-related options
-    ViewSpecManager.prototype.buildViewSpecButtonText = function (spec, requestedViewType) {
-        var optionsManager = this.optionsManager;
-        // given an options object with a possible `buttonText` hash, lookup the buttonText for the
-        // requested view, falling back to a generic unit entry like "week" or "day"
-        function queryButtonText(options) {
-            var buttonText = options.buttonText || {};
-            return buttonText[requestedViewType] ||
-                // view can decide to look up a certain key
-                (spec.buttonTextKey ? buttonText[spec.buttonTextKey] : null) ||
-                // a key like "month"
-                (spec.singleUnit ? buttonText[spec.singleUnit] : null);
-        }
-        // highest to lowest priority
-        spec.buttonTextOverride =
-            queryButtonText(optionsManager.dynamicOverrides) ||
-                queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
-                spec.overrides.buttonText; // `buttonText` for view-specific options is a string
-        // highest to lowest priority. mirrors buildViewSpecOptions
-        spec.buttonTextDefault =
-            queryButtonText(optionsManager.localeDefaults) ||
-                queryButtonText(optionsManager.dirDefaults) ||
-                spec.defaults.buttonText || // a single string. from ViewSubclass.defaults
-                queryButtonText(options_1.globalDefaults) ||
-                (spec.duration ? this._calendar.humanizeDuration(spec.duration) : null) || // like "3 days"
-                requestedViewType; // fall back to given view name
-    };
-    return ViewSpecManager;
-}());
-exports.default = ViewSpecManager;
-
-
-/***/ }),
-/* 242 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var EventPeriod_1 = __webpack_require__(243);
-var ArrayEventSource_1 = __webpack_require__(52);
-var EventSource_1 = __webpack_require__(6);
-var EventSourceParser_1 = __webpack_require__(38);
-var SingleEventDef_1 = __webpack_require__(13);
-var EventInstanceGroup_1 = __webpack_require__(18);
-var EmitterMixin_1 = __webpack_require__(11);
-var ListenerMixin_1 = __webpack_require__(7);
-var EventManager = /** @class */ (function () {
-    function EventManager(calendar) {
-        this.calendar = calendar;
-        this.stickySource = new ArrayEventSource_1.default(calendar);
-        this.otherSources = [];
-    }
-    EventManager.prototype.requestEvents = function (start, end, timezone, force) {
-        if (force ||
-            !this.currentPeriod ||
-            !this.currentPeriod.isWithinRange(start, end) ||
-            timezone !== this.currentPeriod.timezone) {
-            this.setPeriod(// will change this.currentPeriod
-            new EventPeriod_1.default(start, end, timezone));
-        }
-        return this.currentPeriod.whenReleased();
-    };
-    // Source Adding/Removing
-    // -----------------------------------------------------------------------------------------------------------------
-    EventManager.prototype.addSource = function (eventSource) {
-        this.otherSources.push(eventSource);
-        if (this.currentPeriod) {
-            this.currentPeriod.requestSource(eventSource); // might release
-        }
-    };
-    EventManager.prototype.removeSource = function (doomedSource) {
-        util_1.removeExact(this.otherSources, doomedSource);
-        if (this.currentPeriod) {
-            this.currentPeriod.purgeSource(doomedSource); // might release
-        }
-    };
-    EventManager.prototype.removeAllSources = function () {
-        this.otherSources = [];
-        if (this.currentPeriod) {
-            this.currentPeriod.purgeAllSources(); // might release
-        }
-    };
-    // Source Refetching
-    // -----------------------------------------------------------------------------------------------------------------
-    EventManager.prototype.refetchSource = function (eventSource) {
-        var currentPeriod = this.currentPeriod;
-        if (currentPeriod) {
-            currentPeriod.freeze();
-            currentPeriod.purgeSource(eventSource);
-            currentPeriod.requestSource(eventSource);
-            currentPeriod.thaw();
-        }
-    };
-    EventManager.prototype.refetchAllSources = function () {
-        var currentPeriod = this.currentPeriod;
-        if (currentPeriod) {
-            currentPeriod.freeze();
-            currentPeriod.purgeAllSources();
-            currentPeriod.requestSources(this.getSources());
-            currentPeriod.thaw();
-        }
-    };
-    // Source Querying
-    // -----------------------------------------------------------------------------------------------------------------
-    EventManager.prototype.getSources = function () {
-        return [this.stickySource].concat(this.otherSources);
-    };
-    // like querySources, but accepts multple match criteria (like multiple IDs)
-    EventManager.prototype.multiQuerySources = function (matchInputs) {
-        // coerce into an array
-        if (!matchInputs) {
-            matchInputs = [];
-        }
-        else if (!$.isArray(matchInputs)) {
-            matchInputs = [matchInputs];
-        }
-        var matchingSources = [];
-        var i;
-        // resolve raw inputs to real event source objects
-        for (i = 0; i < matchInputs.length; i++) {
-            matchingSources.push.apply(// append
-            matchingSources, this.querySources(matchInputs[i]));
-        }
-        return matchingSources;
-    };
-    // matchInput can either by a real event source object, an ID, or the function/URL for the source.
-    // returns an array of matching source objects.
-    EventManager.prototype.querySources = function (matchInput) {
-        var sources = this.otherSources;
-        var i;
-        var source;
-        // given a proper event source object
-        for (i = 0; i < sources.length; i++) {
-            source = sources[i];
-            if (source === matchInput) {
-                return [source];
-            }
-        }
-        // an ID match
-        source = this.getSourceById(EventSource_1.default.normalizeId(matchInput));
-        if (source) {
-            return [source];
-        }
-        // parse as an event source
-        matchInput = EventSourceParser_1.default.parse(matchInput, this.calendar);
-        if (matchInput) {
-            return $.grep(sources, function (source) {
-                return isSourcesEquivalent(matchInput, source);
-            });
-        }
-    };
-    /*
-    ID assumed to already be normalized
-    */
-    EventManager.prototype.getSourceById = function (id) {
-        return $.grep(this.otherSources, function (source) {
-            return source.id && source.id === id;
-        })[0];
-    };
-    // Event-Period
-    // -----------------------------------------------------------------------------------------------------------------
-    EventManager.prototype.setPeriod = function (eventPeriod) {
-        if (this.currentPeriod) {
-            this.unbindPeriod(this.currentPeriod);
-            this.currentPeriod = null;
-        }
-        this.currentPeriod = eventPeriod;
-        this.bindPeriod(eventPeriod);
-        eventPeriod.requestSources(this.getSources());
-    };
-    EventManager.prototype.bindPeriod = function (eventPeriod) {
-        this.listenTo(eventPeriod, 'release', function (eventsPayload) {
-            this.trigger('release', eventsPayload);
-        });
-    };
-    EventManager.prototype.unbindPeriod = function (eventPeriod) {
-        this.stopListeningTo(eventPeriod);
-    };
-    // Event Getting/Adding/Removing
-    // -----------------------------------------------------------------------------------------------------------------
-    EventManager.prototype.getEventDefByUid = function (uid) {
-        if (this.currentPeriod) {
-            return this.currentPeriod.getEventDefByUid(uid);
-        }
-    };
-    EventManager.prototype.addEventDef = function (eventDef, isSticky) {
-        if (isSticky) {
-            this.stickySource.addEventDef(eventDef);
-        }
-        if (this.currentPeriod) {
-            this.currentPeriod.addEventDef(eventDef); // might release
-        }
-    };
-    EventManager.prototype.removeEventDefsById = function (eventId) {
-        this.getSources().forEach(function (eventSource) {
-            eventSource.removeEventDefsById(eventId);
-        });
-        if (this.currentPeriod) {
-            this.currentPeriod.removeEventDefsById(eventId); // might release
-        }
-    };
-    EventManager.prototype.removeAllEventDefs = function () {
-        this.getSources().forEach(function (eventSource) {
-            eventSource.removeAllEventDefs();
-        });
-        if (this.currentPeriod) {
-            this.currentPeriod.removeAllEventDefs();
-        }
-    };
-    // Event Mutating
-    // -----------------------------------------------------------------------------------------------------------------
-    /*
-    Returns an undo function.
-    */
-    EventManager.prototype.mutateEventsWithId = function (eventDefId, eventDefMutation) {
-        var currentPeriod = this.currentPeriod;
-        var eventDefs;
-        var undoFuncs = [];
-        if (currentPeriod) {
-            currentPeriod.freeze();
-            eventDefs = currentPeriod.getEventDefsById(eventDefId);
-            eventDefs.forEach(function (eventDef) {
-                // add/remove esp because id might change
-                currentPeriod.removeEventDef(eventDef);
-                undoFuncs.push(eventDefMutation.mutateSingle(eventDef));
-                currentPeriod.addEventDef(eventDef);
-            });
-            currentPeriod.thaw();
-            return function () {
-                currentPeriod.freeze();
-                for (var i = 0; i < eventDefs.length; i++) {
-                    currentPeriod.removeEventDef(eventDefs[i]);
-                    undoFuncs[i]();
-                    currentPeriod.addEventDef(eventDefs[i]);
-                }
-                currentPeriod.thaw();
-            };
-        }
-        return function () { };
-    };
-    /*
-    copies and then mutates
-    */
-    EventManager.prototype.buildMutatedEventInstanceGroup = function (eventDefId, eventDefMutation) {
-        var eventDefs = this.getEventDefsById(eventDefId);
-        var i;
-        var defCopy;
-        var allInstances = [];
-        for (i = 0; i < eventDefs.length; i++) {
-            defCopy = eventDefs[i].clone();
-            if (defCopy instanceof SingleEventDef_1.default) {
-                eventDefMutation.mutateSingle(defCopy);
-                allInstances.push.apply(allInstances, // append
-                defCopy.buildInstances());
-            }
-        }
-        return new EventInstanceGroup_1.default(allInstances);
-    };
-    // Freezing
-    // -----------------------------------------------------------------------------------------------------------------
-    EventManager.prototype.freeze = function () {
-        if (this.currentPeriod) {
-            this.currentPeriod.freeze();
-        }
-    };
-    EventManager.prototype.thaw = function () {
-        if (this.currentPeriod) {
-            this.currentPeriod.thaw();
-        }
-    };
-    // methods that simply forward to EventPeriod
-    EventManager.prototype.getEventDefsById = function (eventDefId) {
-        return this.currentPeriod.getEventDefsById(eventDefId);
-    };
-    EventManager.prototype.getEventInstances = function () {
-        return this.currentPeriod.getEventInstances();
-    };
-    EventManager.prototype.getEventInstancesWithId = function (eventDefId) {
-        return this.currentPeriod.getEventInstancesWithId(eventDefId);
-    };
-    EventManager.prototype.getEventInstancesWithoutId = function (eventDefId) {
-        return this.currentPeriod.getEventInstancesWithoutId(eventDefId);
-    };
-    return EventManager;
-}());
-exports.default = EventManager;
-EmitterMixin_1.default.mixInto(EventManager);
-ListenerMixin_1.default.mixInto(EventManager);
-function isSourcesEquivalent(source0, source1) {
-    return source0.getPrimitive() === source1.getPrimitive();
-}
-
-
-/***/ }),
-/* 243 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var Promise_1 = __webpack_require__(20);
-var EmitterMixin_1 = __webpack_require__(11);
-var UnzonedRange_1 = __webpack_require__(5);
-var EventInstanceGroup_1 = __webpack_require__(18);
-var EventPeriod = /** @class */ (function () {
-    function EventPeriod(start, end, timezone) {
-        this.pendingCnt = 0;
-        this.freezeDepth = 0;
-        this.stuntedReleaseCnt = 0;
-        this.releaseCnt = 0;
-        this.start = start;
-        this.end = end;
-        this.timezone = timezone;
-        this.unzonedRange = new UnzonedRange_1.default(start.clone().stripZone(), end.clone().stripZone());
-        this.requestsByUid = {};
-        this.eventDefsByUid = {};
-        this.eventDefsById = {};
-        this.eventInstanceGroupsById = {};
-    }
-    EventPeriod.prototype.isWithinRange = function (start, end) {
-        // TODO: use a range util function?
-        return !start.isBefore(this.start) && !end.isAfter(this.end);
-    };
-    // Requesting and Purging
-    // -----------------------------------------------------------------------------------------------------------------
-    EventPeriod.prototype.requestSources = function (sources) {
-        this.freeze();
-        for (var i = 0; i < sources.length; i++) {
-            this.requestSource(sources[i]);
-        }
-        this.thaw();
-    };
-    EventPeriod.prototype.requestSource = function (source) {
-        var _this = this;
-        var request = { source: source, status: 'pending', eventDefs: null };
-        this.requestsByUid[source.uid] = request;
-        this.pendingCnt += 1;
-        source.fetch(this.start, this.end, this.timezone).then(function (eventDefs) {
-            if (request.status !== 'cancelled') {
-                request.status = 'completed';
-                request.eventDefs = eventDefs;
-                _this.addEventDefs(eventDefs);
-                _this.pendingCnt--;
-                _this.tryRelease();
-            }
-        }, function () {
-            if (request.status !== 'cancelled') {
-                request.status = 'failed';
-                _this.pendingCnt--;
-                _this.tryRelease();
-            }
-        });
-    };
-    EventPeriod.prototype.purgeSource = function (source) {
-        var request = this.requestsByUid[source.uid];
-        if (request) {
-            delete this.requestsByUid[source.uid];
-            if (request.status === 'pending') {
-                request.status = 'cancelled';
-                this.pendingCnt--;
-                this.tryRelease();
-            }
-            else if (request.status === 'completed') {
-                request.eventDefs.forEach(this.removeEventDef.bind(this));
-            }
-        }
-    };
-    EventPeriod.prototype.purgeAllSources = function () {
-        var requestsByUid = this.requestsByUid;
-        var uid;
-        var request;
-        var completedCnt = 0;
-        for (uid in requestsByUid) {
-            request = requestsByUid[uid];
-            if (request.status === 'pending') {
-                request.status = 'cancelled';
-            }
-            else if (request.status === 'completed') {
-                completedCnt++;
-            }
-        }
-        this.requestsByUid = {};
-        this.pendingCnt = 0;
-        if (completedCnt) {
-            this.removeAllEventDefs(); // might release
-        }
-    };
-    // Event Definitions
-    // -----------------------------------------------------------------------------------------------------------------
-    EventPeriod.prototype.getEventDefByUid = function (eventDefUid) {
-        return this.eventDefsByUid[eventDefUid];
-    };
-    EventPeriod.prototype.getEventDefsById = function (eventDefId) {
-        var a = this.eventDefsById[eventDefId];
-        if (a) {
-            return a.slice(); // clone
-        }
-        return [];
-    };
-    EventPeriod.prototype.addEventDefs = function (eventDefs) {
-        for (var i = 0; i < eventDefs.length; i++) {
-            this.addEventDef(eventDefs[i]);
-        }
-    };
-    EventPeriod.prototype.addEventDef = function (eventDef) {
-        var eventDefsById = this.eventDefsById;
-        var eventDefId = eventDef.id;
-        var eventDefs = eventDefsById[eventDefId] || (eventDefsById[eventDefId] = []);
-        var eventInstances = eventDef.buildInstances(this.unzonedRange);
-        var i;
-        eventDefs.push(eventDef);
-        this.eventDefsByUid[eventDef.uid] = eventDef;
-        for (i = 0; i < eventInstances.length; i++) {
-            this.addEventInstance(eventInstances[i], eventDefId);
-        }
-    };
-    EventPeriod.prototype.removeEventDefsById = function (eventDefId) {
-        var _this = this;
-        this.getEventDefsById(eventDefId).forEach(function (eventDef) {
-            _this.removeEventDef(eventDef);
-        });
-    };
-    EventPeriod.prototype.removeAllEventDefs = function () {
-        var isEmpty = $.isEmptyObject(this.eventDefsByUid);
-        this.eventDefsByUid = {};
-        this.eventDefsById = {};
-        this.eventInstanceGroupsById = {};
-        if (!isEmpty) {
-            this.tryRelease();
-        }
-    };
-    EventPeriod.prototype.removeEventDef = function (eventDef) {
-        var eventDefsById = this.eventDefsById;
-        var eventDefs = eventDefsById[eventDef.id];
-        delete this.eventDefsByUid[eventDef.uid];
-        if (eventDefs) {
-            util_1.removeExact(eventDefs, eventDef);
-            if (!eventDefs.length) {
-                delete eventDefsById[eventDef.id];
-            }
-            this.removeEventInstancesForDef(eventDef);
-        }
-    };
-    // Event Instances
-    // -----------------------------------------------------------------------------------------------------------------
-    EventPeriod.prototype.getEventInstances = function () {
-        var eventInstanceGroupsById = this.eventInstanceGroupsById;
-        var eventInstances = [];
-        var id;
-        for (id in eventInstanceGroupsById) {
-            eventInstances.push.apply(eventInstances, // append
-            eventInstanceGroupsById[id].eventInstances);
-        }
-        return eventInstances;
-    };
-    EventPeriod.prototype.getEventInstancesWithId = function (eventDefId) {
-        var eventInstanceGroup = this.eventInstanceGroupsById[eventDefId];
-        if (eventInstanceGroup) {
-            return eventInstanceGroup.eventInstances.slice(); // clone
-        }
-        return [];
-    };
-    EventPeriod.prototype.getEventInstancesWithoutId = function (eventDefId) {
-        var eventInstanceGroupsById = this.eventInstanceGroupsById;
-        var matchingInstances = [];
-        var id;
-        for (id in eventInstanceGroupsById) {
-            if (id !== eventDefId) {
-                matchingInstances.push.apply(matchingInstances, // append
-                eventInstanceGroupsById[id].eventInstances);
-            }
-        }
-        return matchingInstances;
-    };
-    EventPeriod.prototype.addEventInstance = function (eventInstance, eventDefId) {
-        var eventInstanceGroupsById = this.eventInstanceGroupsById;
-        var eventInstanceGroup = eventInstanceGroupsById[eventDefId] ||
-            (eventInstanceGroupsById[eventDefId] = new EventInstanceGroup_1.default());
-        eventInstanceGroup.eventInstances.push(eventInstance);
-        this.tryRelease();
-    };
-    EventPeriod.prototype.removeEventInstancesForDef = function (eventDef) {
-        var eventInstanceGroupsById = this.eventInstanceGroupsById;
-        var eventInstanceGroup = eventInstanceGroupsById[eventDef.id];
-        var removeCnt;
-        if (eventInstanceGroup) {
-            removeCnt = util_1.removeMatching(eventInstanceGroup.eventInstances, function (currentEventInstance) {
-                return currentEventInstance.def === eventDef;
-            });
-            if (!eventInstanceGroup.eventInstances.length) {
-                delete eventInstanceGroupsById[eventDef.id];
-            }
-            if (removeCnt) {
-                this.tryRelease();
-            }
-        }
-    };
-    // Releasing and Freezing
-    // -----------------------------------------------------------------------------------------------------------------
-    EventPeriod.prototype.tryRelease = function () {
-        if (!this.pendingCnt) {
-            if (!this.freezeDepth) {
-                this.release();
-            }
-            else {
-                this.stuntedReleaseCnt++;
-            }
-        }
-    };
-    EventPeriod.prototype.release = function () {
-        this.releaseCnt++;
-        this.trigger('release', this.eventInstanceGroupsById);
-    };
-    EventPeriod.prototype.whenReleased = function () {
-        var _this = this;
-        if (this.releaseCnt) {
-            return Promise_1.default.resolve(this.eventInstanceGroupsById);
-        }
-        else {
-            return Promise_1.default.construct(function (onResolve) {
-                _this.one('release', onResolve);
-            });
-        }
-    };
-    EventPeriod.prototype.freeze = function () {
-        if (!(this.freezeDepth++)) {
-            this.stuntedReleaseCnt = 0;
-        }
-    };
-    EventPeriod.prototype.thaw = function () {
-        if (!(--this.freezeDepth) && this.stuntedReleaseCnt && !this.pendingCnt) {
-            this.release();
-        }
-    };
-    return EventPeriod;
-}());
-exports.default = EventPeriod;
-EmitterMixin_1.default.mixInto(EventPeriod);
-
-
-/***/ }),
-/* 244 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var ListenerMixin_1 = __webpack_require__(7);
-/* Creates a clone of an element and lets it track the mouse as it moves
-----------------------------------------------------------------------------------------------------------------------*/
-var MouseFollower = /** @class */ (function () {
-    function MouseFollower(sourceEl, options) {
-        this.isFollowing = false;
-        this.isHidden = false;
-        this.isAnimating = false; // doing the revert animation?
-        this.options = options = options || {};
-        this.sourceEl = sourceEl;
-        this.parentEl = options.parentEl ? $(options.parentEl) : sourceEl.parent(); // default to sourceEl's parent
-    }
-    // Causes the element to start following the mouse
-    MouseFollower.prototype.start = function (ev) {
-        if (!this.isFollowing) {
-            this.isFollowing = true;
-            this.y0 = util_1.getEvY(ev);
-            this.x0 = util_1.getEvX(ev);
-            this.topDelta = 0;
-            this.leftDelta = 0;
-            if (!this.isHidden) {
-                this.updatePosition();
-            }
-            if (util_1.getEvIsTouch(ev)) {
-                this.listenTo($(document), 'touchmove', this.handleMove);
-            }
-            else {
-                this.listenTo($(document), 'mousemove', this.handleMove);
-            }
-        }
-    };
-    // Causes the element to stop following the mouse. If shouldRevert is true, will animate back to original position.
-    // `callback` gets invoked when the animation is complete. If no animation, it is invoked immediately.
-    MouseFollower.prototype.stop = function (shouldRevert, callback) {
-        var _this = this;
-        var revertDuration = this.options.revertDuration;
-        var complete = function () {
-            _this.isAnimating = false;
-            _this.removeElement();
-            _this.top0 = _this.left0 = null; // reset state for future updatePosition calls
-            if (callback) {
-                callback();
-            }
-        };
-        if (this.isFollowing && !this.isAnimating) {
-            this.isFollowing = false;
-            this.stopListeningTo($(document));
-            if (shouldRevert && revertDuration && !this.isHidden) {
-                this.isAnimating = true;
-                this.el.animate({
-                    top: this.top0,
-                    left: this.left0
-                }, {
-                    duration: revertDuration,
-                    complete: complete
-                });
-            }
-            else {
-                complete();
-            }
-        }
-    };
-    // Gets the tracking element. Create it if necessary
-    MouseFollower.prototype.getEl = function () {
-        var el = this.el;
-        if (!el) {
-            el = this.el = this.sourceEl.clone()
-                .addClass(this.options.additionalClass || '')
-                .css({
-                position: 'absolute',
-                visibility: '',
-                display: this.isHidden ? 'none' : '',
-                margin: 0,
-                right: 'auto',
-                bottom: 'auto',
-                width: this.sourceEl.width(),
-                height: this.sourceEl.height(),
-                opacity: this.options.opacity || '',
-                zIndex: this.options.zIndex
-            });
-            // we don't want long taps or any mouse interaction causing selection/menus.
-            // would use preventSelection(), but that prevents selectstart, causing problems.
-            el.addClass('fc-unselectable');
-            el.appendTo(this.parentEl);
-        }
-        return el;
-    };
-    // Removes the tracking element if it has already been created
-    MouseFollower.prototype.removeElement = function () {
-        if (this.el) {
-            this.el.remove();
-            this.el = null;
-        }
-    };
-    // Update the CSS position of the tracking element
-    MouseFollower.prototype.updatePosition = function () {
-        var sourceOffset;
-        var origin;
-        this.getEl(); // ensure this.el
-        // make sure origin info was computed
-        if (this.top0 == null) {
-            sourceOffset = this.sourceEl.offset();
-            origin = this.el.offsetParent().offset();
-            this.top0 = sourceOffset.top - origin.top;
-            this.left0 = sourceOffset.left - origin.left;
-        }
-        this.el.css({
-            top: this.top0 + this.topDelta,
-            left: this.left0 + this.leftDelta
-        });
-    };
-    // Gets called when the user moves the mouse
-    MouseFollower.prototype.handleMove = function (ev) {
-        this.topDelta = util_1.getEvY(ev) - this.y0;
-        this.leftDelta = util_1.getEvX(ev) - this.x0;
-        if (!this.isHidden) {
-            this.updatePosition();
-        }
-    };
-    // Temporarily makes the tracking element invisible. Can be called before following starts
-    MouseFollower.prototype.hide = function () {
-        if (!this.isHidden) {
-            this.isHidden = true;
-            if (this.el) {
-                this.el.hide();
-            }
-        }
-    };
-    // Show the tracking element after it has been temporarily hidden
-    MouseFollower.prototype.show = function () {
-        if (this.isHidden) {
-            this.isHidden = false;
-            this.updatePosition();
-            this.getEl().show();
-        }
-    };
-    return MouseFollower;
-}());
-exports.default = MouseFollower;
-ListenerMixin_1.default.mixInto(MouseFollower);
-
-
-/***/ }),
-/* 245 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var HitDragListener_1 = __webpack_require__(23);
-var Interaction_1 = __webpack_require__(15);
-var DateClicking = /** @class */ (function (_super) {
-    tslib_1.__extends(DateClicking, _super);
-    /*
-    component must implement:
-      - bindDateHandlerToEl
-      - getSafeHitFootprint
-      - getHitEl
-    */
-    function DateClicking(component) {
-        var _this = _super.call(this, component) || this;
-        _this.dragListener = _this.buildDragListener();
-        return _this;
-    }
-    DateClicking.prototype.end = function () {
-        this.dragListener.endInteraction();
-    };
-    DateClicking.prototype.bindToEl = function (el) {
-        var component = this.component;
-        var dragListener = this.dragListener;
-        component.bindDateHandlerToEl(el, 'mousedown', function (ev) {
-            if (!component.shouldIgnoreMouse()) {
-                dragListener.startInteraction(ev);
-            }
-        });
-        component.bindDateHandlerToEl(el, 'touchstart', function (ev) {
-            if (!component.shouldIgnoreTouch()) {
-                dragListener.startInteraction(ev);
-            }
-        });
-    };
-    // Creates a listener that tracks the user's drag across day elements, for day clicking.
-    DateClicking.prototype.buildDragListener = function () {
-        var _this = this;
-        var component = this.component;
-        var dayClickHit; // null if invalid dayClick
-        var dragListener = new HitDragListener_1.default(component, {
-            scroll: this.opt('dragScroll'),
-            interactionStart: function () {
-                dayClickHit = dragListener.origHit;
-            },
-            hitOver: function (hit, isOrig, origHit) {
-                // if user dragged to another cell at any point, it can no longer be a dayClick
-                if (!isOrig) {
-                    dayClickHit = null;
-                }
-            },
-            hitOut: function () {
-                dayClickHit = null;
-            },
-            interactionEnd: function (ev, isCancelled) {
-                var componentFootprint;
-                if (!isCancelled && dayClickHit) {
-                    componentFootprint = component.getSafeHitFootprint(dayClickHit);
-                    if (componentFootprint) {
-                        _this.view.triggerDayClick(componentFootprint, component.getHitEl(dayClickHit), ev);
-                    }
-                }
-            }
-        });
-        // because dragListener won't be called with any time delay, "dragging" will begin immediately,
-        // which will kill any touchmoving/scrolling. Prevent this.
-        dragListener.shouldCancelTouchScroll = false;
-        dragListener.scrollAlwaysKills = true;
-        return dragListener;
-    };
-    return DateClicking;
-}(Interaction_1.default));
-exports.default = DateClicking;
-
-
-/***/ }),
-/* 246 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var EventRenderer_1 = __webpack_require__(42);
-/*
-Only handles foreground segs.
-Does not own rendering. Use for low-level util methods by TimeGrid.
-*/
-var TimeGridEventRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(TimeGridEventRenderer, _super);
-    function TimeGridEventRenderer(timeGrid, fillRenderer) {
-        var _this = _super.call(this, timeGrid, fillRenderer) || this;
-        _this.timeGrid = timeGrid;
-        return _this;
-    }
-    TimeGridEventRenderer.prototype.renderFgSegs = function (segs) {
-        this.renderFgSegsIntoContainers(segs, this.timeGrid.fgContainerEls);
-    };
-    // Given an array of foreground segments, render a DOM element for each, computes position,
-    // and attaches to the column inner-container elements.
-    TimeGridEventRenderer.prototype.renderFgSegsIntoContainers = function (segs, containerEls) {
-        var segsByCol;
-        var col;
-        segsByCol = this.timeGrid.groupSegsByCol(segs);
-        for (col = 0; col < this.timeGrid.colCnt; col++) {
-            this.updateFgSegCoords(segsByCol[col]);
-        }
-        this.timeGrid.attachSegsByCol(segsByCol, containerEls);
-    };
-    TimeGridEventRenderer.prototype.unrenderFgSegs = function () {
-        if (this.fgSegs) {
-            this.fgSegs.forEach(function (seg) {
-                seg.el.remove();
-            });
-        }
-    };
-    // Computes a default event time formatting string if `timeFormat` is not explicitly defined
-    TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
-        return this.opt('noMeridiemTimeFormat'); // like "6:30" (no AM/PM)
-    };
-    // Computes a default `displayEventEnd` value if one is not expliclty defined
-    TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return true;
-    };
-    // Renders the HTML for a single event segment's default rendering
-    TimeGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {
-        var view = this.view;
-        var calendar = view.calendar;
-        var componentFootprint = seg.footprint.componentFootprint;
-        var isAllDay = componentFootprint.isAllDay;
-        var eventDef = seg.footprint.eventDef;
-        var isDraggable = view.isEventDefDraggable(eventDef);
-        var isResizableFromStart = !disableResizing && seg.isStart && view.isEventDefResizableFromStart(eventDef);
-        var isResizableFromEnd = !disableResizing && seg.isEnd && view.isEventDefResizableFromEnd(eventDef);
-        var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);
-        var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));
-        var timeText;
-        var fullTimeText; // more verbose time text. for the print stylesheet
-        var startTimeText; // just the start time text
-        classes.unshift('fc-time-grid-event', 'fc-v-event');
-        // if the event appears to span more than one day...
-        if (view.isMultiDayRange(componentFootprint.unzonedRange)) {
-            // Don't display time text on segments that run entirely through a day.
-            // That would appear as midnight-midnight and would look dumb.
-            // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
-            if (seg.isStart || seg.isEnd) {
-                var zonedStart = calendar.msToMoment(seg.startMs);
-                var zonedEnd = calendar.msToMoment(seg.endMs);
-                timeText = this._getTimeText(zonedStart, zonedEnd, isAllDay);
-                fullTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, 'LT');
-                startTimeText = this._getTimeText(zonedStart, zonedEnd, isAllDay, null, false); // displayEnd=false
-            }
-        }
-        else {
-            // Display the normal time text for the *event's* times
-            timeText = this.getTimeText(seg.footprint);
-            fullTimeText = this.getTimeText(seg.footprint, 'LT');
-            startTimeText = this.getTimeText(seg.footprint, null, false); // displayEnd=false
-        }
-        return '<a class="' + classes.join(' ') + '"' +
-            (eventDef.url ?
-                ' href="' + util_1.htmlEscape(eventDef.url) + '"' :
-                '') +
-            (skinCss ?
-                ' style="' + skinCss + '"' :
-                '') +
-            '>' +
-            '<div class="fc-content">' +
-            (timeText ?
-                '<div class="fc-time"' +
-                    ' data-start="' + util_1.htmlEscape(startTimeText) + '"' +
-                    ' data-full="' + util_1.htmlEscape(fullTimeText) + '"' +
-                    '>' +
-                    '<span>' + util_1.htmlEscape(timeText) + '</span>' +
-                    '</div>' :
-                '') +
-            (eventDef.title ?
-                '<div class="fc-title">' +
-                    util_1.htmlEscape(eventDef.title) +
-                    '</div>' :
-                '') +
-            '</div>' +
-            '<div class="fc-bg"/>' +
-            /* TODO: write CSS for this
-            (isResizableFromStart ?
-              '<div class="fc-resizer fc-start-resizer" />' :
-              ''
-              ) +
-            */
-            (isResizableFromEnd ?
-                '<div class="fc-resizer fc-end-resizer" />' :
-                '') +
-            '</a>';
-    };
-    // Given segments that are assumed to all live in the *same column*,
-    // compute their verical/horizontal coordinates and assign to their elements.
-    TimeGridEventRenderer.prototype.updateFgSegCoords = function (segs) {
-        this.timeGrid.computeSegVerticals(segs); // horizontals relies on this
-        this.computeFgSegHorizontals(segs); // compute horizontal coordinates, z-index's, and reorder the array
-        this.timeGrid.assignSegVerticals(segs);
-        this.assignFgSegHorizontals(segs);
-    };
-    // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
-    // NOTE: Also reorders the given array by date!
-    TimeGridEventRenderer.prototype.computeFgSegHorizontals = function (segs) {
-        var levels;
-        var level0;
-        var i;
-        this.sortEventSegs(segs); // order by certain criteria
-        levels = buildSlotSegLevels(segs);
-        computeForwardSlotSegs(levels);
-        if ((level0 = levels[0])) {
-            for (i = 0; i < level0.length; i++) {
-                computeSlotSegPressures(level0[i]);
-            }
-            for (i = 0; i < level0.length; i++) {
-                this.computeFgSegForwardBack(level0[i], 0, 0);
-            }
-        }
-    };
-    // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
-    // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
-    // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
-    //
-    // The segment might be part of a "series", which means consecutive segments with the same pressure
-    // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
-    // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
-    // coordinate of the first segment in the series.
-    TimeGridEventRenderer.prototype.computeFgSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
-        var forwardSegs = seg.forwardSegs;
-        var i;
-        if (seg.forwardCoord === undefined) {
-            if (!forwardSegs.length) {
-                // if there are no forward segments, this segment should butt up against the edge
-                seg.forwardCoord = 1;
-            }
-            else {
-                // sort highest pressure first
-                this.sortForwardSegs(forwardSegs);
-                // this segment's forwardCoord will be calculated from the backwardCoord of the
-                // highest-pressure forward segment.
-                this.computeFgSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
-                seg.forwardCoord = forwardSegs[0].backwardCoord;
-            }
-            // calculate the backwardCoord from the forwardCoord. consider the series
-            seg.backwardCoord = seg.forwardCoord -
-                (seg.forwardCoord - seriesBackwardCoord) / // available width for series
-                    (seriesBackwardPressure + 1); // # of segments in the series
-            // use this segment's coordinates to computed the coordinates of the less-pressurized
-            // forward segments
-            for (i = 0; i < forwardSegs.length; i++) {
-                this.computeFgSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
-            }
-        }
-    };
-    TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
-        forwardSegs.sort(util_1.proxy(this, 'compareForwardSegs'));
-    };
-    // A cmp function for determining which forward segment to rely on more when computing coordinates.
-    TimeGridEventRenderer.prototype.compareForwardSegs = function (seg1, seg2) {
-        // put higher-pressure first
-        return seg2.forwardPressure - seg1.forwardPressure ||
-            // put segments that are closer to initial edge first (and favor ones with no coords yet)
-            (seg1.backwardCoord || 0) - (seg2.backwardCoord || 0) ||
-            // do normal sorting...
-            this.compareEventSegs(seg1, seg2);
-    };
-    // Given foreground event segments that have already had their position coordinates computed,
-    // assigns position-related CSS values to their elements.
-    TimeGridEventRenderer.prototype.assignFgSegHorizontals = function (segs) {
-        var i;
-        var seg;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            seg.el.css(this.generateFgSegHorizontalCss(seg));
-            // if the height is short, add a className for alternate styling
-            if (seg.bottom - seg.top < 30) {
-                seg.el.addClass('fc-short');
-            }
-        }
-    };
-    // Generates an object with CSS properties/values that should be applied to an event segment element.
-    // Contains important positioning-related properties that should be applied to any event element, customized or not.
-    TimeGridEventRenderer.prototype.generateFgSegHorizontalCss = function (seg) {
-        var shouldOverlap = this.opt('slotEventOverlap');
-        var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
-        var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
-        var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
-        var isRTL = this.timeGrid.isRTL;
-        var left; // amount of space from left edge, a fraction of the total width
-        var right; // amount of space from right edge, a fraction of the total width
-        if (shouldOverlap) {
-            // double the width, but don't go beyond the maximum forward coordinate (1.0)
-            forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
-        }
-        if (isRTL) {
-            left = 1 - forwardCoord;
-            right = backwardCoord;
-        }
-        else {
-            left = backwardCoord;
-            right = 1 - forwardCoord;
-        }
-        props.zIndex = seg.level + 1; // convert from 0-base to 1-based
-        props.left = left * 100 + '%';
-        props.right = right * 100 + '%';
-        if (shouldOverlap && seg.forwardPressure) {
-            // add padding to the edge so that forward stacked events don't cover the resizer's icon
-            props[isRTL ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
-        }
-        return props;
-    };
-    return TimeGridEventRenderer;
-}(EventRenderer_1.default));
-exports.default = TimeGridEventRenderer;
-// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
-// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
-function buildSlotSegLevels(segs) {
-    var levels = [];
-    var i;
-    var seg;
-    var j;
-    for (i = 0; i < segs.length; i++) {
-        seg = segs[i];
-        // go through all the levels and stop on the first level where there are no collisions
-        for (j = 0; j < levels.length; j++) {
-            if (!computeSlotSegCollisions(seg, levels[j]).length) {
-                break;
-            }
-        }
-        seg.level = j;
-        (levels[j] || (levels[j] = [])).push(seg);
-    }
-    return levels;
-}
-// For every segment, figure out the other segments that are in subsequent
-// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
-function computeForwardSlotSegs(levels) {
-    var i;
-    var level;
-    var j;
-    var seg;
-    var k;
-    for (i = 0; i < levels.length; i++) {
-        level = levels[i];
-        for (j = 0; j < level.length; j++) {
-            seg = level[j];
-            seg.forwardSegs = [];
-            for (k = i + 1; k < levels.length; k++) {
-                computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
-            }
-        }
-    }
-}
-// Figure out which path forward (via seg.forwardSegs) results in the longest path until
-// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
-function computeSlotSegPressures(seg) {
-    var forwardSegs = seg.forwardSegs;
-    var forwardPressure = 0;
-    var i;
-    var forwardSeg;
-    if (seg.forwardPressure === undefined) {
-        for (i = 0; i < forwardSegs.length; i++) {
-            forwardSeg = forwardSegs[i];
-            // figure out the child's maximum forward path
-            computeSlotSegPressures(forwardSeg);
-            // either use the existing maximum, or use the child's forward pressure
-            // plus one (for the forwardSeg itself)
-            forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
-        }
-        seg.forwardPressure = forwardPressure;
-    }
-}
-// Find all the segments in `otherSegs` that vertically collide with `seg`.
-// Append into an optionally-supplied `results` array and return.
-function computeSlotSegCollisions(seg, otherSegs, results) {
-    if (results === void 0) { results = []; }
-    for (var i = 0; i < otherSegs.length; i++) {
-        if (isSlotSegCollision(seg, otherSegs[i])) {
-            results.push(otherSegs[i]);
-        }
-    }
-    return results;
-}
-// Do these segments occupy the same vertical space?
-function isSlotSegCollision(seg1, seg2) {
-    return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
-}
-
-
-/***/ }),
-/* 247 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var HelperRenderer_1 = __webpack_require__(58);
-var TimeGridHelperRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(TimeGridHelperRenderer, _super);
-    function TimeGridHelperRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    TimeGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {
-        var helperNodes = [];
-        var i;
-        var seg;
-        var sourceEl;
-        // TODO: not good to call eventRenderer this way
-        this.eventRenderer.renderFgSegsIntoContainers(segs, this.component.helperContainerEls);
-        // Try to make the segment that is in the same row as sourceSeg look the same
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            if (sourceSeg && sourceSeg.col === seg.col) {
-                sourceEl = sourceSeg.el;
-                seg.el.css({
-                    left: sourceEl.css('left'),
-                    right: sourceEl.css('right'),
-                    'margin-left': sourceEl.css('margin-left'),
-                    'margin-right': sourceEl.css('margin-right')
-                });
-            }
-            helperNodes.push(seg.el[0]);
-        }
-        return $(helperNodes); // must return the elements rendered
-    };
-    return TimeGridHelperRenderer;
-}(HelperRenderer_1.default));
-exports.default = TimeGridHelperRenderer;
-
-
-/***/ }),
-/* 248 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var FillRenderer_1 = __webpack_require__(57);
-var TimeGridFillRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(TimeGridFillRenderer, _super);
-    function TimeGridFillRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    TimeGridFillRenderer.prototype.attachSegEls = function (type, segs) {
-        var timeGrid = this.component;
-        var containerEls;
-        // TODO: more efficient lookup
-        if (type === 'bgEvent') {
-            containerEls = timeGrid.bgContainerEls;
-        }
-        else if (type === 'businessHours') {
-            containerEls = timeGrid.businessContainerEls;
-        }
-        else if (type === 'highlight') {
-            containerEls = timeGrid.highlightContainerEls;
-        }
-        timeGrid.updateSegVerticals(segs);
-        timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
-        return segs.map(function (seg) {
-            return seg.el[0];
-        });
-    };
-    return TimeGridFillRenderer;
-}(FillRenderer_1.default));
-exports.default = TimeGridFillRenderer;
-
-
-/***/ }),
-/* 249 */
-/***/ (function(module, exports, __webpack_require__) {
-
-/* A rectangular panel that is absolutely positioned over other content
-------------------------------------------------------------------------------------------------------------------------
-Options:
-  - className (string)
-  - content (HTML string or jQuery element set)
-  - parentEl
-  - top
-  - left
-  - right (the x coord of where the right edge should be. not a "CSS" right)
-  - autoHide (boolean)
-  - show (callback)
-  - hide (callback)
-*/
-Object.defineProperty(exports, "__esModule", { value: true });
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var ListenerMixin_1 = __webpack_require__(7);
-var Popover = /** @class */ (function () {
-    function Popover(options) {
-        this.isHidden = true;
-        this.margin = 10; // the space required between the popover and the edges of the scroll container
-        this.options = options || {};
-    }
-    // Shows the popover on the specified position. Renders it if not already
-    Popover.prototype.show = function () {
-        if (this.isHidden) {
-            if (!this.el) {
-                this.render();
-            }
-            this.el.show();
-            this.position();
-            this.isHidden = false;
-            this.trigger('show');
-        }
-    };
-    // Hides the popover, through CSS, but does not remove it from the DOM
-    Popover.prototype.hide = function () {
-        if (!this.isHidden) {
-            this.el.hide();
-            this.isHidden = true;
-            this.trigger('hide');
-        }
-    };
-    // Creates `this.el` and renders content inside of it
-    Popover.prototype.render = function () {
-        var _this = this;
-        var options = this.options;
-        this.el = $('<div class="fc-popover"/>')
-            .addClass(options.className || '')
-            .css({
-            // position initially to the top left to avoid creating scrollbars
-            top: 0,
-            left: 0
-        })
-            .append(options.content)
-            .appendTo(options.parentEl);
-        // when a click happens on anything inside with a 'fc-close' className, hide the popover
-        this.el.on('click', '.fc-close', function () {
-            _this.hide();
-        });
-        if (options.autoHide) {
-            this.listenTo($(document), 'mousedown', this.documentMousedown);
-        }
-    };
-    // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
-    Popover.prototype.documentMousedown = function (ev) {
-        // only hide the popover if the click happened outside the popover
-        if (this.el && !$(ev.target).closest(this.el).length) {
-            this.hide();
-        }
-    };
-    // Hides and unregisters any handlers
-    Popover.prototype.removeElement = function () {
-        this.hide();
-        if (this.el) {
-            this.el.remove();
-            this.el = null;
-        }
-        this.stopListeningTo($(document), 'mousedown');
-    };
-    // Positions the popover optimally, using the top/left/right options
-    Popover.prototype.position = function () {
-        var options = this.options;
-        var origin = this.el.offsetParent().offset();
-        var width = this.el.outerWidth();
-        var height = this.el.outerHeight();
-        var windowEl = $(window);
-        var viewportEl = util_1.getScrollParent(this.el);
-        var viewportTop;
-        var viewportLeft;
-        var viewportOffset;
-        var top; // the "position" (not "offset") values for the popover
-        var left; //
-        // compute top and left
-        top = options.top || 0;
-        if (options.left !== undefined) {
-            left = options.left;
-        }
-        else if (options.right !== undefined) {
-            left = options.right - width; // derive the left value from the right value
-        }
-        else {
-            left = 0;
-        }
-        if (viewportEl.is(window) || viewportEl.is(document)) {
-            viewportEl = windowEl;
-            viewportTop = 0; // the window is always at the top left
-            viewportLeft = 0; // (and .offset() won't work if called here)
-        }
-        else {
-            viewportOffset = viewportEl.offset();
-            viewportTop = viewportOffset.top;
-            viewportLeft = viewportOffset.left;
-        }
-        // if the window is scrolled, it causes the visible area to be further down
-        viewportTop += windowEl.scrollTop();
-        viewportLeft += windowEl.scrollLeft();
-        // constrain to the view port. if constrained by two edges, give precedence to top/left
-        if (options.viewportConstrain !== false) {
-            top = Math.min(top, viewportTop + viewportEl.outerHeight() - height - this.margin);
-            top = Math.max(top, viewportTop + this.margin);
-            left = Math.min(left, viewportLeft + viewportEl.outerWidth() - width - this.margin);
-            left = Math.max(left, viewportLeft + this.margin);
-        }
-        this.el.css({
-            top: top - origin.top,
-            left: left - origin.left
-        });
-    };
-    // Triggers a callback. Calls a function in the option hash of the same name.
-    // Arguments beyond the first `name` are forwarded on.
-    // TODO: better code reuse for this. Repeat code
-    Popover.prototype.trigger = function (name) {
-        if (this.options[name]) {
-            this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
-        }
-    };
-    return Popover;
-}());
-exports.default = Popover;
-ListenerMixin_1.default.mixInto(Popover);
-
-
-/***/ }),
-/* 250 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var util_1 = __webpack_require__(4);
-var EventRenderer_1 = __webpack_require__(42);
-/* Event-rendering methods for the DayGrid class
-----------------------------------------------------------------------------------------------------------------------*/
-var DayGridEventRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(DayGridEventRenderer, _super);
-    function DayGridEventRenderer(dayGrid, fillRenderer) {
-        var _this = _super.call(this, dayGrid, fillRenderer) || this;
-        _this.dayGrid = dayGrid;
-        return _this;
-    }
-    DayGridEventRenderer.prototype.renderBgRanges = function (eventRanges) {
-        // don't render timed background events
-        eventRanges = $.grep(eventRanges, function (eventRange) {
-            return eventRange.eventDef.isAllDay();
-        });
-        _super.prototype.renderBgRanges.call(this, eventRanges);
-    };
-    // Renders the given foreground event segments onto the grid
-    DayGridEventRenderer.prototype.renderFgSegs = function (segs) {
-        var rowStructs = this.rowStructs = this.renderSegRows(segs);
-        // append to each row's content skeleton
-        this.dayGrid.rowEls.each(function (i, rowNode) {
-            $(rowNode).find('.fc-content-skeleton > table').append(rowStructs[i].tbodyEl);
-        });
-    };
-    // Unrenders all currently rendered foreground event segments
-    DayGridEventRenderer.prototype.unrenderFgSegs = function () {
-        var rowStructs = this.rowStructs || [];
-        var rowStruct;
-        while ((rowStruct = rowStructs.pop())) {
-            rowStruct.tbodyEl.remove();
-        }
-        this.rowStructs = null;
-    };
-    // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
-    // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
-    // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
-    DayGridEventRenderer.prototype.renderSegRows = function (segs) {
-        var rowStructs = [];
-        var segRows;
-        var row;
-        segRows = this.groupSegRows(segs); // group into nested arrays
-        // iterate each row of segment groupings
-        for (row = 0; row < segRows.length; row++) {
-            rowStructs.push(this.renderSegRow(row, segRows[row]));
-        }
-        return rowStructs;
-    };
-    // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
-    // the segments. Returns object with a bunch of internal data about how the render was calculated.
-    // NOTE: modifies rowSegs
-    DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
-        var colCnt = this.dayGrid.colCnt;
-        var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
-        var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
-        var tbody = $('<tbody/>');
-        var segMatrix = []; // lookup for which segments are rendered into which level+col cells
-        var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
-        var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
-        var i;
-        var levelSegs;
-        var col;
-        var tr;
-        var j;
-        var seg;
-        var td;
-        // populates empty cells from the current column (`col`) to `endCol`
-        function emptyCellsUntil(endCol) {
-            while (col < endCol) {
-                // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
-                td = (loneCellMatrix[i - 1] || [])[col];
-                if (td) {
-                    td.attr('rowspan', parseInt(td.attr('rowspan') || 1, 10) + 1);
-                }
-                else {
-                    td = $('<td/>');
-                    tr.append(td);
-                }
-                cellMatrix[i][col] = td;
-                loneCellMatrix[i][col] = td;
-                col++;
-            }
-        }
-        for (i = 0; i < levelCnt; i++) {
-            levelSegs = segLevels[i];
-            col = 0;
-            tr = $('<tr/>');
-            segMatrix.push([]);
-            cellMatrix.push([]);
-            loneCellMatrix.push([]);
-            // levelCnt might be 1 even though there are no actual levels. protect against this.
-            // this single empty row is useful for styling.
-            if (levelSegs) {
-                for (j = 0; j < levelSegs.length; j++) {
-                    seg = levelSegs[j];
-                    emptyCellsUntil(seg.leftCol);
-                    // create a container that occupies or more columns. append the event element.
-                    td = $('<td class="fc-event-container"/>').append(seg.el);
-                    if (seg.leftCol !== seg.rightCol) {
-                        td.attr('colspan', seg.rightCol - seg.leftCol + 1);
-                    }
-                    else {
-                        loneCellMatrix[i][col] = td;
-                    }
-                    while (col <= seg.rightCol) {
-                        cellMatrix[i][col] = td;
-                        segMatrix[i][col] = seg;
-                        col++;
-                    }
-                    tr.append(td);
-                }
-            }
-            emptyCellsUntil(colCnt); // finish off the row
-            this.dayGrid.bookendCells(tr);
-            tbody.append(tr);
-        }
-        return {
-            row: row,
-            tbodyEl: tbody,
-            cellMatrix: cellMatrix,
-            segMatrix: segMatrix,
-            segLevels: segLevels,
-            segs: rowSegs
-        };
-    };
-    // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
-    // NOTE: modifies segs
-    DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
-        var levels = [];
-        var i;
-        var seg;
-        var j;
-        // Give preference to elements with certain criteria, so they have
-        // a chance to be closer to the top.
-        this.sortEventSegs(segs);
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
-            for (j = 0; j < levels.length; j++) {
-                if (!isDaySegCollision(seg, levels[j])) {
-                    break;
-                }
-            }
-            // `j` now holds the desired subrow index
-            seg.level = j;
-            // create new level array if needed and append segment
-            (levels[j] || (levels[j] = [])).push(seg);
-        }
-        // order segments left-to-right. very important if calendar is RTL
-        for (j = 0; j < levels.length; j++) {
-            levels[j].sort(compareDaySegCols);
-        }
-        return levels;
-    };
-    // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
-    DayGridEventRenderer.prototype.groupSegRows = function (segs) {
-        var segRows = [];
-        var i;
-        for (i = 0; i < this.dayGrid.rowCnt; i++) {
-            segRows.push([]);
-        }
-        for (i = 0; i < segs.length; i++) {
-            segRows[segs[i].row].push(segs[i]);
-        }
-        return segRows;
-    };
-    // Computes a default event time formatting string if `timeFormat` is not explicitly defined
-    DayGridEventRenderer.prototype.computeEventTimeFormat = function () {
-        return this.opt('extraSmallTimeFormat'); // like "6p" or "6:30p"
-    };
-    // Computes a default `displayEventEnd` value if one is not expliclty defined
-    DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
-    };
-    // Builds the HTML to be used for the default element for an individual segment
-    DayGridEventRenderer.prototype.fgSegHtml = function (seg, disableResizing) {
-        var view = this.view;
-        var eventDef = seg.footprint.eventDef;
-        var isAllDay = seg.footprint.componentFootprint.isAllDay;
-        var isDraggable = view.isEventDefDraggable(eventDef);
-        var isResizableFromStart = !disableResizing && isAllDay &&
-            seg.isStart && view.isEventDefResizableFromStart(eventDef);
-        var isResizableFromEnd = !disableResizing && isAllDay &&
-            seg.isEnd && view.isEventDefResizableFromEnd(eventDef);
-        var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd);
-        var skinCss = util_1.cssToStr(this.getSkinCss(eventDef));
-        var timeHtml = '';
-        var timeText;
-        var titleHtml;
-        classes.unshift('fc-day-grid-event', 'fc-h-event');
-        // Only display a timed events time if it is the starting segment
-        if (seg.isStart) {
-            timeText = this.getTimeText(seg.footprint);
-            if (timeText) {
-                timeHtml = '<span class="fc-time">' + util_1.htmlEscape(timeText) + '</span>';
-            }
-        }
-        titleHtml =
-            '<span class="fc-title">' +
-                (util_1.htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
-                '</span>';
-        return '<a class="' + classes.join(' ') + '"' +
-            (eventDef.url ?
-                ' href="' + util_1.htmlEscape(eventDef.url) + '"' :
-                '') +
-            (skinCss ?
-                ' style="' + skinCss + '"' :
-                '') +
-            '>' +
-            '<div class="fc-content">' +
-            (this.dayGrid.isRTL ?
-                titleHtml + ' ' + timeHtml : // put a natural space in between
-                timeHtml + ' ' + titleHtml //
-            ) +
-            '</div>' +
-            (isResizableFromStart ?
-                '<div class="fc-resizer fc-start-resizer" />' :
-                '') +
-            (isResizableFromEnd ?
-                '<div class="fc-resizer fc-end-resizer" />' :
-                '') +
-            '</a>';
-    };
-    return DayGridEventRenderer;
-}(EventRenderer_1.default));
-exports.default = DayGridEventRenderer;
-// Computes whether two segments' columns collide. They are assumed to be in the same row.
-function isDaySegCollision(seg, otherSegs) {
-    var i;
-    var otherSeg;
-    for (i = 0; i < otherSegs.length; i++) {
-        otherSeg = otherSegs[i];
-        if (otherSeg.leftCol <= seg.rightCol &&
-            otherSeg.rightCol >= seg.leftCol) {
-            return true;
-        }
-    }
-    return false;
-}
-// A cmp function for determining the leftmost event
-function compareDaySegCols(a, b) {
-    return a.leftCol - b.leftCol;
-}
-
-
-/***/ }),
-/* 251 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var HelperRenderer_1 = __webpack_require__(58);
-var DayGridHelperRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(DayGridHelperRenderer, _super);
-    function DayGridHelperRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Renders a mock "helper" event. `sourceSeg` is the associated internal segment object. It can be null.
-    DayGridHelperRenderer.prototype.renderSegs = function (segs, sourceSeg) {
-        var helperNodes = [];
-        var rowStructs;
-        // TODO: not good to call eventRenderer this way
-        rowStructs = this.eventRenderer.renderSegRows(segs);
-        // inject each new event skeleton into each associated row
-        this.component.rowEls.each(function (row, rowNode) {
-            var rowEl = $(rowNode); // the .fc-row
-            var skeletonEl = $('<div class="fc-helper-skeleton"><table/></div>'); // will be absolutely positioned
-            var skeletonTopEl;
-            var skeletonTop;
-            // If there is an original segment, match the top position. Otherwise, put it at the row's top level
-            if (sourceSeg && sourceSeg.row === row) {
-                skeletonTop = sourceSeg.el.position().top;
-            }
-            else {
-                skeletonTopEl = rowEl.find('.fc-content-skeleton tbody');
-                if (!skeletonTopEl.length) {
-                    skeletonTopEl = rowEl.find('.fc-content-skeleton table');
-                }
-                skeletonTop = skeletonTopEl.position().top;
-            }
-            skeletonEl.css('top', skeletonTop)
-                .find('table')
-                .append(rowStructs[row].tbodyEl);
-            rowEl.append(skeletonEl);
-            helperNodes.push(skeletonEl[0]);
-        });
-        return $(helperNodes); // must return the elements rendered
-    };
-    return DayGridHelperRenderer;
-}(HelperRenderer_1.default));
-exports.default = DayGridHelperRenderer;
-
-
-/***/ }),
-/* 252 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var FillRenderer_1 = __webpack_require__(57);
-var DayGridFillRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(DayGridFillRenderer, _super);
-    function DayGridFillRenderer() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.fillSegTag = 'td'; // override the default tag name
-        return _this;
-    }
-    DayGridFillRenderer.prototype.attachSegEls = function (type, segs) {
-        var nodes = [];
-        var i;
-        var seg;
-        var skeletonEl;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            skeletonEl = this.renderFillRow(type, seg);
-            this.component.rowEls.eq(seg.row).append(skeletonEl);
-            nodes.push(skeletonEl[0]);
-        }
-        return nodes;
-    };
-    // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
-    DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
-        var colCnt = this.component.colCnt;
-        var startCol = seg.leftCol;
-        var endCol = seg.rightCol + 1;
-        var className;
-        var skeletonEl;
-        var trEl;
-        if (type === 'businessHours') {
-            className = 'bgevent';
-        }
-        else {
-            className = type.toLowerCase();
-        }
-        skeletonEl = $('<div class="fc-' + className + '-skeleton">' +
-            '<table><tr/></table>' +
-            '</div>');
-        trEl = skeletonEl.find('tr');
-        if (startCol > 0) {
-            trEl.append('<td colspan="' + startCol + '"/>');
-        }
-        trEl.append(seg.el.attr('colspan', endCol - startCol));
-        if (endCol < colCnt) {
-            trEl.append('<td colspan="' + (colCnt - endCol) + '"/>');
-        }
-        this.component.bookendCells(trEl);
-        return skeletonEl;
-    };
-    return DayGridFillRenderer;
-}(FillRenderer_1.default));
-exports.default = DayGridFillRenderer;
-
-
-/***/ }),
-/* 253 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var BasicViewDateProfileGenerator_1 = __webpack_require__(228);
-var UnzonedRange_1 = __webpack_require__(5);
-var MonthViewDateProfileGenerator = /** @class */ (function (_super) {
-    tslib_1.__extends(MonthViewDateProfileGenerator, _super);
-    function MonthViewDateProfileGenerator() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Computes the date range that will be rendered.
-    MonthViewDateProfileGenerator.prototype.buildRenderRange = function (currentUnzonedRange, currentRangeUnit, isRangeAllDay) {
-        var renderUnzonedRange = _super.prototype.buildRenderRange.call(this, currentUnzonedRange, currentRangeUnit, isRangeAllDay);
-        var start = this.msToUtcMoment(renderUnzonedRange.startMs, isRangeAllDay);
-        var end = this.msToUtcMoment(renderUnzonedRange.endMs, isRangeAllDay);
-        var rowCnt;
-        // ensure 6 weeks
-        if (this.opt('fixedWeekCount')) {
-            rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
-            end.diff(start, 'weeks', true) // dontRound=true
-            );
-            end.add(6 - rowCnt, 'weeks');
-        }
-        return new UnzonedRange_1.default(start, end);
-    };
-    return MonthViewDateProfileGenerator;
-}(BasicViewDateProfileGenerator_1.default));
-exports.default = MonthViewDateProfileGenerator;
-
-
-/***/ }),
-/* 254 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var util_1 = __webpack_require__(4);
-var EventRenderer_1 = __webpack_require__(42);
-var ListEventRenderer = /** @class */ (function (_super) {
-    tslib_1.__extends(ListEventRenderer, _super);
-    function ListEventRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ListEventRenderer.prototype.renderFgSegs = function (segs) {
-        if (!segs.length) {
-            this.component.renderEmptyMessage();
-        }
-        else {
-            this.component.renderSegList(segs);
-        }
-    };
-    // generates the HTML for a single event row
-    ListEventRenderer.prototype.fgSegHtml = function (seg) {
-        var view = this.view;
-        var calendar = view.calendar;
-        var theme = calendar.theme;
-        var eventFootprint = seg.footprint;
-        var eventDef = eventFootprint.eventDef;
-        var componentFootprint = eventFootprint.componentFootprint;
-        var url = eventDef.url;
-        var classes = ['fc-list-item'].concat(this.getClasses(eventDef));
-        var bgColor = this.getBgColor(eventDef);
-        var timeHtml;
-        if (componentFootprint.isAllDay) {
-            timeHtml = view.getAllDayHtml();
-        }
-        else if (view.isMultiDayRange(componentFootprint.unzonedRange)) {
-            if (seg.isStart || seg.isEnd) {
-                timeHtml = util_1.htmlEscape(this._getTimeText(calendar.msToMoment(seg.startMs), calendar.msToMoment(seg.endMs), componentFootprint.isAllDay));
-            }
-            else {
-                timeHtml = view.getAllDayHtml();
-            }
-        }
-        else {
-            // Display the normal time text for the *event's* times
-            timeHtml = util_1.htmlEscape(this.getTimeText(eventFootprint));
-        }
-        if (url) {
-            classes.push('fc-has-url');
-        }
-        return '<tr class="' + classes.join(' ') + '">' +
-            (this.displayEventTime ?
-                '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
-                    (timeHtml || '') +
-                    '</td>' :
-                '') +
-            '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
-            '<span class="fc-event-dot"' +
-            (bgColor ?
-                ' style="background-color:' + bgColor + '"' :
-                '') +
-            '></span>' +
-            '</td>' +
-            '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
-            '<a' + (url ? ' href="' + util_1.htmlEscape(url) + '"' : '') + '>' +
-            util_1.htmlEscape(eventDef.title || '') +
-            '</a>' +
-            '</td>' +
-            '</tr>';
-    };
-    // like "4:00am"
-    ListEventRenderer.prototype.computeEventTimeFormat = function () {
-        return this.opt('mediumTimeFormat');
-    };
-    return ListEventRenderer;
-}(EventRenderer_1.default));
-exports.default = ListEventRenderer;
-
-
-/***/ }),
-/* 255 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var EventPointing_1 = __webpack_require__(59);
-var ListEventPointing = /** @class */ (function (_super) {
-    tslib_1.__extends(ListEventPointing, _super);
-    function ListEventPointing() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // for events with a url, the whole <tr> should be clickable,
-    // but it's impossible to wrap with an <a> tag. simulate this.
-    ListEventPointing.prototype.handleClick = function (seg, ev) {
-        var url;
-        _super.prototype.handleClick.call(this, seg, ev); // might prevent the default action
-        // not clicking on or within an <a> with an href
-        if (!$(ev.target).closest('a[href]').length) {
-            url = seg.footprint.eventDef.url;
-            if (url && !ev.isDefaultPrevented()) {
-                window.location.href = url; // simulate link click
-            }
-        }
-    };
-    return ListEventPointing;
-}(EventPointing_1.default));
-exports.default = ListEventPointing;
-
-
-/***/ }),
-/* 256 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var EventSourceParser_1 = __webpack_require__(38);
-var ArrayEventSource_1 = __webpack_require__(52);
-var FuncEventSource_1 = __webpack_require__(215);
-var JsonFeedEventSource_1 = __webpack_require__(216);
-EventSourceParser_1.default.registerClass(ArrayEventSource_1.default);
-EventSourceParser_1.default.registerClass(FuncEventSource_1.default);
-EventSourceParser_1.default.registerClass(JsonFeedEventSource_1.default);
-
-
-/***/ }),
-/* 257 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var ThemeRegistry_1 = __webpack_require__(51);
-var StandardTheme_1 = __webpack_require__(213);
-var JqueryUiTheme_1 = __webpack_require__(214);
-var Bootstrap3Theme_1 = __webpack_require__(258);
-var Bootstrap4Theme_1 = __webpack_require__(259);
-ThemeRegistry_1.defineThemeSystem('standard', StandardTheme_1.default);
-ThemeRegistry_1.defineThemeSystem('jquery-ui', JqueryUiTheme_1.default);
-ThemeRegistry_1.defineThemeSystem('bootstrap3', Bootstrap3Theme_1.default);
-ThemeRegistry_1.defineThemeSystem('bootstrap4', Bootstrap4Theme_1.default);
-
-
-/***/ }),
-/* 258 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Theme_1 = __webpack_require__(19);
-var Bootstrap3Theme = /** @class */ (function (_super) {
-    tslib_1.__extends(Bootstrap3Theme, _super);
-    function Bootstrap3Theme() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return Bootstrap3Theme;
-}(Theme_1.default));
-exports.default = Bootstrap3Theme;
-Bootstrap3Theme.prototype.classes = {
-    widget: 'fc-bootstrap3',
-    tableGrid: 'table-bordered',
-    tableList: 'table',
-    tableListHeading: 'active',
-    buttonGroup: 'btn-group',
-    button: 'btn btn-default',
-    stateActive: 'active',
-    stateDisabled: 'disabled',
-    today: 'alert alert-info',
-    popover: 'panel panel-default',
-    popoverHeader: 'panel-heading',
-    popoverContent: 'panel-body',
-    // day grid
-    // for left/right border color when border is inset from edges (all-day in agenda view)
-    // avoid `panel` class b/c don't want margins/radius. only border color.
-    headerRow: 'panel-default',
-    dayRow: 'panel-default',
-    // list view
-    listView: 'panel panel-default'
-};
-Bootstrap3Theme.prototype.baseIconClass = 'glyphicon';
-Bootstrap3Theme.prototype.iconClasses = {
-    close: 'glyphicon-remove',
-    prev: 'glyphicon-chevron-left',
-    next: 'glyphicon-chevron-right',
-    prevYear: 'glyphicon-backward',
-    nextYear: 'glyphicon-forward'
-};
-Bootstrap3Theme.prototype.iconOverrideOption = 'bootstrapGlyphicons';
-Bootstrap3Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapGlyphicon';
-Bootstrap3Theme.prototype.iconOverridePrefix = 'glyphicon-';
-
-
-/***/ }),
-/* 259 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var Theme_1 = __webpack_require__(19);
-var Bootstrap4Theme = /** @class */ (function (_super) {
-    tslib_1.__extends(Bootstrap4Theme, _super);
-    function Bootstrap4Theme() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return Bootstrap4Theme;
-}(Theme_1.default));
-exports.default = Bootstrap4Theme;
-Bootstrap4Theme.prototype.classes = {
-    widget: 'fc-bootstrap4',
-    tableGrid: 'table-bordered',
-    tableList: 'table',
-    tableListHeading: 'table-active',
-    buttonGroup: 'btn-group',
-    button: 'btn btn-primary',
-    stateActive: 'active',
-    stateDisabled: 'disabled',
-    today: 'alert alert-info',
-    popover: 'card card-primary',
-    popoverHeader: 'card-header',
-    popoverContent: 'card-body',
-    // day grid
-    // for left/right border color when border is inset from edges (all-day in agenda view)
-    // avoid `table` class b/c don't want margins/padding/structure. only border color.
-    headerRow: 'table-bordered',
-    dayRow: 'table-bordered',
-    // list view
-    listView: 'card card-primary'
-};
-Bootstrap4Theme.prototype.baseIconClass = 'fa';
-Bootstrap4Theme.prototype.iconClasses = {
-    close: 'fa-times',
-    prev: 'fa-chevron-left',
-    next: 'fa-chevron-right',
-    prevYear: 'fa-angle-double-left',
-    nextYear: 'fa-angle-double-right'
-};
-Bootstrap4Theme.prototype.iconOverrideOption = 'bootstrapFontAwesome';
-Bootstrap4Theme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
-Bootstrap4Theme.prototype.iconOverridePrefix = 'fa-';
-
-
-/***/ }),
-/* 260 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var ViewRegistry_1 = __webpack_require__(22);
-var BasicView_1 = __webpack_require__(62);
-var MonthView_1 = __webpack_require__(229);
-ViewRegistry_1.defineView('basic', {
-    'class': BasicView_1.default
-});
-ViewRegistry_1.defineView('basicDay', {
-    type: 'basic',
-    duration: { days: 1 }
-});
-ViewRegistry_1.defineView('basicWeek', {
-    type: 'basic',
-    duration: { weeks: 1 }
-});
-ViewRegistry_1.defineView('month', {
-    'class': MonthView_1.default,
-    duration: { months: 1 },
-    defaults: {
-        fixedWeekCount: true
-    }
-});
-
-
-/***/ }),
-/* 261 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var ViewRegistry_1 = __webpack_require__(22);
-var AgendaView_1 = __webpack_require__(226);
-ViewRegistry_1.defineView('agenda', {
-    'class': AgendaView_1.default,
-    defaults: {
-        allDaySlot: true,
-        slotDuration: '00:30:00',
-        slotEventOverlap: true // a bad name. confused with overlap/constraint system
-    }
-});
-ViewRegistry_1.defineView('agendaDay', {
-    type: 'agenda',
-    duration: { days: 1 }
-});
-ViewRegistry_1.defineView('agendaWeek', {
-    type: 'agenda',
-    duration: { weeks: 1 }
-});
-
-
-/***/ }),
-/* 262 */
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var ViewRegistry_1 = __webpack_require__(22);
-var ListView_1 = __webpack_require__(230);
-ViewRegistry_1.defineView('list', {
-    'class': ListView_1.default,
-    buttonTextKey: 'list',
-    defaults: {
-        buttonText: 'list',
-        listDayFormat: 'LL',
-        noEventsMessage: 'No events to display'
-    }
-});
-ViewRegistry_1.defineView('listDay', {
-    type: 'list',
-    duration: { days: 1 },
-    defaults: {
-        listDayFormat: 'dddd' // day-of-week is all we need. full date is probably in header
-    }
-});
-ViewRegistry_1.defineView('listWeek', {
-    type: 'list',
-    duration: { weeks: 1 },
-    defaults: {
-        listDayFormat: 'dddd',
-        listDayAltFormat: 'LL'
-    }
-});
-ViewRegistry_1.defineView('listMonth', {
-    type: 'list',
-    duration: { month: 1 },
-    defaults: {
-        listDayAltFormat: 'dddd' // day-of-week is nice-to-have
-    }
-});
-ViewRegistry_1.defineView('listYear', {
-    type: 'list',
-    duration: { year: 1 },
-    defaults: {
-        listDayAltFormat: 'dddd' // day-of-week is nice-to-have
-    }
-});
-
-
-/***/ }),
-/* 263 */
-/***/ (function(module, exports) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-
-
-/***/ })
-/******/ ]);
-});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.min.css b/backoffice/vendors/fullcalendar/fullcalendar.min.css
deleted file mode 100644 (file)
index cf86d29..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */.fc button,.fc table,body .fc{font-size:1em}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-icon,.fc-unselectable{-webkit-touch-callout:none;-khtml-user-select:none}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}.fc th,.fc-basic-view td.fc-week-number,.fc-icon,.fc-toolbar{text-align:center}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;height:2.1em;padding:0 .6em;white-space:nowrap;cursor:pointer}.fc button::-moz-focus-inner{margin:0;padding:0}.fc-state-default{border:1px solid;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-repeat:repeat-x;border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0,0,0,.1) rgba(0,0,0,.1) rgba(0,0,0,.25);color:#333;text-shadow:0 1px 1px rgba(255,255,255,.75);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 2px rgba(0,0,0,.05)}.fc-state-default.fc-corner-left{border-top-left-radius:4px;border-bottom-left-radius:4px}.fc-state-default.fc-corner-right{border-top-right-radius:4px;border-bottom-right-radius:4px}.fc button .fc-icon{position:relative;top:-.05em;margin:0 .2em;vertical-align:middle}.fc-state-active,.fc-state-disabled,.fc-state-down,.fc-state-hover{color:#333;background-color:#e6e6e6}.fc-state-hover{color:#333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.fc-state-active,.fc-state-down{background-color:#ccc;background-image:none;box-shadow:inset 0 2px 4px rgba(0,0,0,.15),0 1px 2px rgba(0,0,0,.05)}.fc-state-disabled{cursor:default;background-image:none;opacity:.65;box-shadow:none}.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a[data-goto]{cursor:pointer}.fc-button-group{display:inline-block}.fc .fc-button-group>*{float:left;margin:0 0 0 -1px}.fc .fc-button-group>:first-child{margin-left:0}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{padding:2px 4px}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-ltr .fc-popover .fc-header .fc-title,.fc-rtl .fc-popover .fc-header .fc-close{float:left}.fc-ltr .fc-popover .fc-header .fc-close,.fc-rtl .fc-popover .fc-header .fc-title{float:right}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-clear{clear:both}.fc-bg,.fc-bgevent-skeleton,.fc-helper-skeleton,.fc-highlight-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-helper-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-helper-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-helper-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-helper-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-icon,.fc-row.fc-rigid,.fc-time-grid-event{overflow:hidden}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.3;border-radius:3px;border:1px solid #3a87ad}.fc-event,.fc-event-dot{background-color:#3a87ad}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-bg{z-index:1;background:#fff;opacity:.25}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected.fc-dragging{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-day-grid-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc.fc-bootstrap3 a,.ui-widget .fc-event{text-decoration:none}.fc-limited{display:none}.fc-icon,.fc-toolbar .fc-center{display:inline-block}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-bootstrap3 .fc-popover .panel-body,.fc-bootstrap4 .fc-popover .card-body{padding:0}.fc-now-indicator{position:absolute;border:0 solid red}.fc-bootstrap3 .fc-today.alert,.fc-bootstrap4 .fc-today.alert{border-radius:0}.fc-unselectable{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff;border-width:1px;border-style:solid}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}.fc-icon{height:1em;line-height:1em;font-size:1em;font-family:"Courier New",Courier,monospace;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fc-icon:after{position:relative}.fc-icon-left-single-arrow:after{content:"\2039";font-weight:700;font-size:200%;top:-7%}.fc-icon-right-single-arrow:after{content:"\203A";font-weight:700;font-size:200%;top:-7%}.fc-icon-left-double-arrow:after{content:"\AB";font-size:160%;top:-7%}.fc-icon-right-double-arrow:after{content:"\BB";font-size:160%;top:-7%}.fc-icon-left-triangle:after{content:"\25C4";font-size:125%;top:3%}.fc-icon-right-triangle:after{content:"\25BA";font-size:125%;top:3%}.fc-icon-down-triangle:after{content:"\25BC";font-size:125%;top:2%}.fc-icon-x:after{content:"\D7";font-size:200%;top:6%}.fc-unthemed .fc-popover .fc-header .fc-close{color:#666;font-size:.9em;margin-top:2px}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.ui-widget .fc-disabled-day{background-image:none}.fc-bootstrap3 .fc-time-grid .fc-slats table,.fc-bootstrap4 .fc-time-grid .fc-slats table,.fc-time-grid .fc-slats .ui-widget-content{background:0 0}.fc-popover>.ui-widget-header+.ui-widget-content{border-top:0}.fc-bootstrap3 hr.fc-divider,.fc-bootstrap4 hr.fc-divider{border-color:inherit}.ui-widget .fc-event{color:#fff;font-weight:400}.ui-widget td.fc-axis{font-weight:400}.fc.fc-bootstrap3 a[data-goto]:hover{text-decoration:underline}.fc.fc-bootstrap4 a{text-decoration:none}.fc.fc-bootstrap4 a[data-goto]:hover{text-decoration:underline}.fc-bootstrap4 a.fc-event:not([href]):not([tabindex]){color:#fff}.fc-bootstrap4 .fc-popover.card{position:absolute}.fc-toolbar.fc-header-toolbar{margin-bottom:1em}.fc-toolbar.fc-footer-toolbar{margin-top:1em}.fc-toolbar .fc-left{float:left}.fc-toolbar .fc-right{float:right}.fc .fc-toolbar>*>*{float:left;margin-left:.75em}.fc .fc-toolbar>*>:first-child{margin-left:0}.fc-toolbar h2{margin:0}.fc-toolbar button{position:relative}.fc-toolbar .fc-state-hover,.fc-toolbar .ui-state-hover{z-index:2}.fc-toolbar .fc-state-down{z-index:3}.fc-toolbar .fc-state-active,.fc-toolbar .ui-state-active{z-index:4}.fc-toolbar button:focus{z-index:5}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}.fc-basicDay-view .fc-content-skeleton,.fc-basicWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-basic-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-basic-view .fc-day-number,.fc-basic-view .fc-week-number{padding:2px}.fc-basic-view th.fc-day-number,.fc-basic-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-basic-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-basic-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-basic-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-basic-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-basic-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-basic-view td.fc-week-number>*{display:inline-block;min-width:1.25em}.fc-agenda-view .fc-day-grid{position:relative;z-index:2}.fc-agenda-view .fc-day-grid .fc-row{min-height:3em}.fc-agenda-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-helper-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-v-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event.fc-selected{overflow:visible}.fc-time-grid-event.fc-selected .fc-bg{display:none}.fc-time-grid-event .fc-content{overflow:hidden}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\A0-\A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.min.js b/backoffice/vendors/fullcalendar/fullcalendar.min.js
deleted file mode 100644 (file)
index 8804545..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("moment"),require("jquery")):"function"==typeof define&&define.amd?define(["moment","jquery"],e):"object"==typeof exports?exports.FullCalendar=e(require("moment"),require("jquery")):t.FullCalendar=e(t.moment,t.jQuery)}("undefined"!=typeof self?self:this,function(t,e){return function(t){function e(i){if(n[i])return n[i].exports;var r=n[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.d=function(t,n,i){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:i})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=236)}([function(e,n){e.exports=t},,function(t,e){var n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])};e.__extends=function(t,e){function i(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}},function(t,n){t.exports=e},function(t,e,n){function i(t,e){e.left&&t.css({"border-left-width":1,"margin-left":e.left-1}),e.right&&t.css({"border-right-width":1,"margin-right":e.right-1})}function r(t){t.css({"margin-left":"","margin-right":"","border-left-width":"","border-right-width":""})}function o(){ht("body").addClass("fc-not-allowed")}function s(){ht("body").removeClass("fc-not-allowed")}function a(t,e,n){var i=Math.floor(e/t.length),r=Math.floor(e-i*(t.length-1)),o=[],s=[],a=[],u=0;l(t),t.each(function(e,n){var l=e===t.length-1?r:i,d=ht(n).outerHeight(!0);d<l?(o.push(n),s.push(d),a.push(ht(n).height())):u+=d}),n&&(e-=u,i=Math.floor(e/o.length),r=Math.floor(e-i*(o.length-1))),ht(o).each(function(t,e){var n=t===o.length-1?r:i,l=s[t],u=a[t],d=n-(l-u);l<n&&ht(e).height(d)})}function l(t){t.height("")}function u(t){var e=0;return t.find("> *").each(function(t,n){var i=ht(n).outerWidth();i>e&&(e=i)}),e++,t.width(e),e}function d(t,e){var n,i=t.add(e);return i.css({position:"relative",left:-1}),n=t.outerHeight()-e.outerHeight(),i.css({position:"",left:""}),n}function c(t){var e=t.css("position"),n=t.parents().filter(function(){var t=ht(this);return/(auto|scroll)/.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==e&&n.length?n:ht(t[0].ownerDocument||document)}function p(t,e){var n=t.offset(),i=n.left-(e?e.left:0),r=n.top-(e?e.top:0);return{left:i,right:i+t.outerWidth(),top:r,bottom:r+t.outerHeight()}}function h(t,e){var n=t.offset(),i=g(t),r=n.left+b(t,"border-left-width")+i.left-(e?e.left:0),o=n.top+b(t,"border-top-width")+i.top-(e?e.top:0);return{left:r,right:r+t[0].clientWidth,top:o,bottom:o+t[0].clientHeight}}function f(t,e){var n=t.offset(),i=n.left+b(t,"border-left-width")+b(t,"padding-left")-(e?e.left:0),r=n.top+b(t,"border-top-width")+b(t,"padding-top")-(e?e.top:0);return{left:i,right:i+t.width(),top:r,bottom:r+t.height()}}function g(t){var e,n=t[0].offsetWidth-t[0].clientWidth,i=t[0].offsetHeight-t[0].clientHeight;return n=v(n),i=v(i),e={left:0,right:0,top:0,bottom:i},y()&&"rtl"===t.css("direction")?e.left=n:e.right=n,e}function v(t){return t=Math.max(0,t),t=Math.round(t)}function y(){return null===ft&&(ft=m()),ft}function m(){var t=ht("<div><div/></div>").css({position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}).appendTo("body"),e=t.children(),n=e.offset().left>t.offset().left;return t.remove(),n}function b(t,e){return parseFloat(t.css(e))||0}function w(t){return 1===t.which&&!t.ctrlKey}function D(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageX:t.pageX}function E(t){var e=t.originalEvent.touches;return e&&e.length?e[0].pageY:t.pageY}function S(t){return/^touch/.test(t.type)}function C(t){t.addClass("fc-unselectable").on("selectstart",T)}function R(t){t.removeClass("fc-unselectable").off("selectstart",T)}function T(t){t.preventDefault()}function M(t,e){var n={left:Math.max(t.left,e.left),right:Math.min(t.right,e.right),top:Math.max(t.top,e.top),bottom:Math.min(t.bottom,e.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function I(t,e){return{left:Math.min(Math.max(t.left,e.left),e.right),top:Math.min(Math.max(t.top,e.top),e.bottom)}}function H(t){return{left:(t.left+t.right)/2,top:(t.top+t.bottom)/2}}function P(t,e){return{left:t.left-e.left,top:t.top-e.top}}function _(t){var e,n,i=[],r=[];for("string"==typeof t?r=t.split(/\s*,\s*/):"function"==typeof t?r=[t]:ht.isArray(t)&&(r=t),e=0;e<r.length;e++)n=r[e],"string"==typeof n?i.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&i.push({func:n});return i}function x(t,e,n,i,r){var o,s;for(o=0;o<n.length;o++)if(s=O(t,e,n[o],i,r))return s;return 0}function O(t,e,n,i,r){if(n.func)return n.func(t,e);var o=t[n.field],s=e[n.field];return null==o&&i&&(o=i[n.field]),null==s&&r&&(s=r[n.field]),F(o,s)*(n.order||1)}function F(t,e){return t||e?null==e?-1:null==t?1:"string"===ht.type(t)||"string"===ht.type(e)?String(t).localeCompare(String(e)):t-e:0}function z(t,e){return pt.duration({days:t.clone().stripTime().diff(e.clone().stripTime(),"days"),ms:t.time()-e.time()})}function B(t,e){return pt.duration({days:t.clone().stripTime().diff(e.clone().stripTime(),"days")})}function A(t,e,n){return pt.duration(Math.round(t.diff(e,n,!0)),n)}function k(t,n){var i,r,o;for(i=0;i<e.unitsDesc.length&&(r=e.unitsDesc[i],!((o=V(r,t,n))>=1&&ut(o)));i++);return r}function L(t,e){var n=k(t);return"week"===n&&"object"==typeof e&&e.days&&(n="day"),n}function V(t,e,n){return null!=n?n.diff(e,t,!0):pt.isDuration(e)?e.as(t):e.end.diff(e.start,t,!0)}function G(t,e,n){var i;return U(n)?(e-t)/n:(i=n.asMonths(),Math.abs(i)>=1&&ut(i)?e.diff(t,"months",!0)/i:e.diff(t,"days",!0)/n.asDays())}function N(t,e){var n,i;return U(t)||U(e)?t/e:(n=t.asMonths(),i=e.asMonths(),Math.abs(n)>=1&&ut(n)&&Math.abs(i)>=1&&ut(i)?n/i:t.asDays()/e.asDays())}function j(t,e){var n;return U(t)?pt.duration(t*e):(n=t.asMonths(),Math.abs(n)>=1&&ut(n)?pt.duration({months:n*e}):pt.duration({days:t.asDays()*e}))}function U(t){return Boolean(t.hours()||t.minutes()||t.seconds()||t.milliseconds())}function W(t){return"[object Date]"===Object.prototype.toString.call(t)||t instanceof Date}function q(t){return"string"==typeof t&&/^\d+\:\d+(?:\:\d+\.?(?:\d{3})?)?$/.test(t)}function Y(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=window.console;if(n&&n.log)return n.log.apply(n,t)}function Z(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=window.console;return n&&n.warn?n.warn.apply(n,t):Y.apply(null,t)}function Q(t,e){var n,i,r,o,s,a,l={};if(e)for(n=0;n<e.length;n++){for(i=e[n],r=[],o=t.length-1;o>=0;o--)if("object"==typeof(s=t[o][i]))r.unshift(s);else if(void 0!==s){l[i]=s;break}r.length&&(l[i]=Q(r))}for(n=t.length-1;n>=0;n--){a=t[n];for(i in a)i in l||(l[i]=a[i])}return l}function X(t,e){for(var n in t)$(t,n)&&(e[n]=t[n])}function $(t,e){return gt.call(t,e)}function K(t,e,n){if(ht.isFunction(t)&&(t=[t]),t){var i=void 0,r=void 0;for(i=0;i<t.length;i++)r=t[i].apply(e,n)||r;return r}}function J(t,e){for(var n=0,i=0;i<t.length;)e(t[i])?(t.splice(i,1),n++):i++;return n}function tt(t,e){for(var n=0,i=0;i<t.length;)t[i]===e?(t.splice(i,1),n++):i++;return n}function et(t,e){var n,i=t.length;if(null==i||i!==e.length)return!1;for(n=0;n<i;n++)if(t[n]!==e[n])return!1;return!0}function nt(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];for(var n=0;n<t.length;n++)if(void 0!==t[n])return t[n]}function it(t){return(t+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function rt(t){return t.replace(/&.*?;/g,"")}function ot(t){var e=[];return ht.each(t,function(t,n){null!=n&&e.push(t+":"+n)}),e.join(";")}function st(t){var e=[];return ht.each(t,function(t,n){null!=n&&e.push(t+'="'+it(n)+'"')}),e.join(" ")}function at(t){return t.charAt(0).toUpperCase()+t.slice(1)}function lt(t,e){return t-e}function ut(t){return t%1==0}function dt(t,e){var n=t[e];return function(){return n.apply(t,arguments)}}function ct(t,e,n){void 0===n&&(n=!1);var i,r,o,s,a,l=function(){var u=+new Date-s;u<e?i=setTimeout(l,e-u):(i=null,n||(a=t.apply(o,r),o=r=null))};return function(){o=this,r=arguments,s=+new Date;var u=n&&!i;return i||(i=setTimeout(l,e)),u&&(a=t.apply(o,r),o=r=null),a}}Object.defineProperty(e,"__esModule",{value:!0});var pt=n(0),ht=n(3);e.compensateScroll=i,e.uncompensateScroll=r,e.disableCursor=o,e.enableCursor=s,e.distributeHeight=a,e.undistributeHeight=l,e.matchCellWidths=u,e.subtractInnerElHeight=d,e.getScrollParent=c,e.getOuterRect=p,e.getClientRect=h,e.getContentRect=f,e.getScrollbarWidths=g;var ft=null;e.isPrimaryMouseButton=w,e.getEvX=D,e.getEvY=E,e.getEvIsTouch=S,e.preventSelection=C,e.allowSelection=R,e.preventDefault=T,e.intersectRects=M,e.constrainPoint=I,e.getRectCenter=H,e.diffPoints=P,e.parseFieldSpecs=_,e.compareByFieldSpecs=x,e.compareByFieldSpec=O,e.flexibleCompare=F,e.dayIDs=["sun","mon","tue","wed","thu","fri","sat"],e.unitsDesc=["year","month","week","day","hour","minute","second","millisecond"],e.diffDayTime=z,e.diffDay=B,e.diffByUnit=A,e.computeGreatestUnit=k,e.computeDurationGreatestUnit=L,e.divideRangeByDuration=G,e.divideDurationByDuration=N,e.multiplyDuration=j,e.durationHasTime=U,e.isNativeDate=W,e.isTimeString=q,e.log=Y,e.warn=Z;var gt={}.hasOwnProperty;e.mergeProps=Q,e.copyOwnProps=X,e.hasOwnProp=$,e.applyAll=K,e.removeMatching=J,e.removeExact=tt,e.isArraysEqual=et,e.firstDefined=nt,e.htmlEscape=it,e.stripHtmlEntities=rt,e.cssToStr=ot,e.attrsToStr=st,e.capitaliseFirstLetter=at,e.compareNumbers=lt,e.isInt=ut,e.proxy=dt,e.debounce=ct},function(t,e,n){function i(t,e){return t.startMs-e.startMs}Object.defineProperty(e,"__esModule",{value:!0});var r=n(0),o=n(10),s=function(){function t(t,e){this.isStart=!0,this.isEnd=!0,r.isMoment(t)&&(t=t.clone().stripZone()),r.isMoment(e)&&(e=e.clone().stripZone()),t&&(this.startMs=t.valueOf()),e&&(this.endMs=e.valueOf())}return t.invertRanges=function(e,n){var r,o,s=[],a=n.startMs;for(e.sort(i),r=0;r<e.length;r++)o=e[r],o.startMs>a&&s.push(new t(a,o.startMs)),o.endMs>a&&(a=o.endMs);return a<n.endMs&&s.push(new t(a,n.endMs)),s},t.prototype.intersect=function(e){var n=this.startMs,i=this.endMs,r=null;return null!=e.startMs&&(n=null==n?e.startMs:Math.max(n,e.startMs)),null!=e.endMs&&(i=null==i?e.endMs:Math.min(i,e.endMs)),(null==n||null==i||n<i)&&(r=new t(n,i),r.isStart=this.isStart&&n===this.startMs,r.isEnd=this.isEnd&&i===this.endMs),r},t.prototype.intersectsWith=function(t){return(null==this.endMs||null==t.startMs||this.endMs>t.startMs)&&(null==this.startMs||null==t.endMs||this.startMs<t.endMs)},t.prototype.containsRange=function(t){return(null==this.startMs||null!=t.startMs&&t.startMs>=this.startMs)&&(null==this.endMs||null!=t.endMs&&t.endMs<=this.endMs)},t.prototype.containsDate=function(t){var e=t.valueOf();return(null==this.startMs||e>=this.startMs)&&(null==this.endMs||e<this.endMs)},t.prototype.constrainDate=function(t){var e=t.valueOf();return null!=this.startMs&&e<this.startMs&&(e=this.startMs),null!=this.endMs&&e>=this.endMs&&(e=this.endMs-1),e},t.prototype.equals=function(t){return this.startMs===t.startMs&&this.endMs===t.endMs},t.prototype.clone=function(){var e=new t(this.startMs,this.endMs);return e.isStart=this.isStart,e.isEnd=this.isEnd,e},t.prototype.getStart=function(){return null!=this.startMs?o.default.utc(this.startMs).stripZone():null},t.prototype.getEnd=function(){return null!=this.endMs?o.default.utc(this.endMs).stripZone():null},t.prototype.as=function(t){return r.utc(this.endMs).diff(r.utc(this.startMs),t,!0)},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(208),s=n(33),a=n(49),l=function(t){function e(n){var i=t.call(this)||this;return i.calendar=n,i.className=[],i.uid=String(e.uuid++),i}return i.__extends(e,t),e.parse=function(t,e){var n=new this(e);return!("object"!=typeof t||!n.applyProps(t))&&n},e.normalizeId=function(t){return t?String(t):null},e.prototype.fetch=function(t,e,n){},e.prototype.removeEventDefsById=function(t){},e.prototype.removeAllEventDefs=function(){},e.prototype.getPrimitive=function(t){},e.prototype.parseEventDefs=function(t){var e,n,i=[];for(e=0;e<t.length;e++)(n=this.parseEventDef(t[e]))&&i.push(n);return i},e.prototype.parseEventDef=function(t){var e=this.calendar.opt("eventDataTransform"),n=this.eventDataTransform;return e&&(t=e(t,this.calendar)),n&&(t=n(t,this.calendar)),a.default.parse(t,this)},e.prototype.applyManualStandardProps=function(t){return null!=t.id&&(this.id=e.normalizeId(t.id)),r.isArray(t.className)?this.className=t.className:"string"==typeof t.className&&(this.className=t.className.split(/\s+/)),!0},e.uuid=0,e.defineStandardProps=o.default.defineStandardProps,e.copyVerbatimStandardProps=o.default.copyVerbatimStandardProps,e}(s.default);e.default=l,o.default.mixInto(l),l.defineStandardProps({id:!1,className:!1,color:!0,backgroundColor:!0,borderColor:!0,textColor:!0,editable:!0,startEditable:!0,durationEditable:!0,rendering:!0,overlap:!0,constraint:!0,allDayDefault:!0,eventDataTransform:!0})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(14),s=0,a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.listenTo=function(t,e,n){if("object"==typeof e)for(var i in e)e.hasOwnProperty(i)&&this.listenTo(t,i,e[i]);else"string"==typeof e&&t.on(e+"."+this.getListenerNamespace(),r.proxy(n,this))},e.prototype.stopListeningTo=function(t,e){t.off((e||"")+"."+this.getListenerNamespace())},e.prototype.getListenerNamespace=function(){return null==this.listenerId&&(this.listenerId=s++),"_listener"+this.listenerId},e}(o.default);e.default=a},,,function(t,e,n){function i(t,e){return c.format.call(t,e)}function r(t,e,n){void 0===e&&(e=!1),void 0===n&&(n=!1);var i,r,d,c,p=t[0],h=1===t.length&&"string"==typeof p;return o.isMoment(p)||a.isNativeDate(p)||void 0===p?c=o.apply(null,t):(i=!1,r=!1,h?l.test(p)?(p+="-01",t=[p],i=!0,r=!0):(d=u.exec(p))&&(i=!d[5],r=!0):s.isArray(p)&&(r=!0),c=e||i?o.utc.apply(o,t):o.apply(null,t),i?(c._ambigTime=!0,c._ambigZone=!0):n&&(r?c._ambigZone=!0:h&&c.utcOffset(p))),c._fullCalendar=!0,c}Object.defineProperty(e,"__esModule",{value:!0});var o=n(0),s=n(3),a=n(4),l=/^\s*\d{4}-\d\d$/,u=/^\s*\d{4}-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?)?$/,d=o.fn;e.newMomentProto=d;var c=s.extend({},d);e.oldMomentProto=c;var p=o.momentProperties;p.push("_fullCalendar"),p.push("_ambigTime"),p.push("_ambigZone"),e.oldMomentFormat=i;var h=function(){return r(arguments)};e.default=h,h.utc=function(){var t=r(arguments,!0);return t.hasTime()&&t.utc(),t},h.parseZone=function(){return r(arguments,!0,!0)},d.week=d.weeks=function(t){var e=this._locale._fullCalendar_weekCalc;return null==t&&"function"==typeof e?e(this):"ISO"===e?c.isoWeek.apply(this,arguments):c.week.apply(this,arguments)},d.time=function(t){if(!this._fullCalendar)return c.time.apply(this,arguments);if(null==t)return o.duration({hours:this.hours(),minutes:this.minutes(),seconds:this.seconds(),milliseconds:this.milliseconds()});this._ambigTime=!1,o.isDuration(t)||o.isMoment(t)||(t=o.duration(t));var e=0;return o.isDuration(t)&&(e=24*Math.floor(t.asDays())),this.hours(e+t.hours()).minutes(t.minutes()).seconds(t.seconds()).milliseconds(t.milliseconds())},d.stripTime=function(){return this._ambigTime||(this.utc(!0),this.set({hours:0,minutes:0,seconds:0,ms:0}),this._ambigTime=!0,this._ambigZone=!0),this},d.hasTime=function(){return!this._ambigTime},d.stripZone=function(){var t;return this._ambigZone||(t=this._ambigTime,this.utc(!0),this._ambigTime=t||!1,this._ambigZone=!0),this},d.hasZone=function(){return!this._ambigZone},d.local=function(t){return c.local.call(this,this._ambigZone||t),this._ambigTime=!1,this._ambigZone=!1,this},d.utc=function(t){return c.utc.call(this,t),this._ambigTime=!1,this._ambigZone=!1,this},d.utcOffset=function(t){return null!=t&&(this._ambigTime=!1,this._ambigZone=!1),c.utcOffset.apply(this,arguments)}},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(14),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.on=function(t,e){return r(this).on(t,this._prepareIntercept(e)),this},e.prototype.one=function(t,e){return r(this).one(t,this._prepareIntercept(e)),this},e.prototype._prepareIntercept=function(t){var e=function(e,n){return t.apply(n.context||this,n.args||[])};return t.guid||(t.guid=r.guid++),e.guid=t.guid,e},e.prototype.off=function(t,e){return r(this).off(t,e),this},e.prototype.trigger=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return r(this).triggerHandler(t,{args:e}),this},e.prototype.triggerWith=function(t,e,n){return r(this).triggerHandler(t,{context:e,args:n}),this},e.prototype.hasHandlers=function(t){var e=r._data(this,"events");return e&&e[t]&&e[t].length>0},e}(o.default);e.default=s},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.isAllDay=!1,this.unzonedRange=t,this.isAllDay=e}return t.prototype.toLegacy=function(t){return{start:t.msToMoment(this.unzonedRange.startMs,this.isAllDay),end:t.msToMoment(this.unzonedRange.endMs,this.isAllDay)}},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(34),o=n(209),s=n(17),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildInstances=function(){return[this.buildInstance()]},e.prototype.buildInstance=function(){return new o.default(this,this.dateProfile)},e.prototype.isAllDay=function(){return this.dateProfile.isAllDay()},e.prototype.clone=function(){var e=t.prototype.clone.call(this);return e.dateProfile=this.dateProfile,e},e.prototype.rezone=function(){var t=this.source.calendar,e=this.dateProfile;this.dateProfile=new s.default(t.moment(e.start),e.end?t.moment(e.end):null,t)},e.prototype.applyManualStandardProps=function(e){var n=t.prototype.applyManualStandardProps.call(this,e),i=s.default.parse(e,this.source);return!!i&&(this.dateProfile=i,null!=e.date&&(this.miscProps.date=e.date),n)},e}(r.default);e.default=a,a.defineStandardProps({start:!1,date:!1,end:!1,allDay:!1})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(){}return t.mixInto=function(t){var e=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){t.prototype[n]||(t.prototype[n]=e.prototype[n])})},t.mixOver=function(t){var e=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){t.prototype[n]=e.prototype[n]})},t}();e.default=n},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){this.view=t._getView(),this.component=t}return t.prototype.opt=function(t){return this.view.opt(t)},t.prototype.end=function(){},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0}),e.version="3.9.0",e.internalApiVersion=12;var i=n(4);e.applyAll=i.applyAll,e.debounce=i.debounce,e.isInt=i.isInt,e.htmlEscape=i.htmlEscape,e.cssToStr=i.cssToStr,e.proxy=i.proxy,e.capitaliseFirstLetter=i.capitaliseFirstLetter,e.getOuterRect=i.getOuterRect,e.getClientRect=i.getClientRect,e.getContentRect=i.getContentRect,e.getScrollbarWidths=i.getScrollbarWidths,e.preventDefault=i.preventDefault,e.parseFieldSpecs=i.parseFieldSpecs,e.compareByFieldSpecs=i.compareByFieldSpecs,e.compareByFieldSpec=i.compareByFieldSpec,e.flexibleCompare=i.flexibleCompare,e.computeGreatestUnit=i.computeGreatestUnit,e.divideRangeByDuration=i.divideRangeByDuration,e.divideDurationByDuration=i.divideDurationByDuration,e.multiplyDuration=i.multiplyDuration,e.durationHasTime=i.durationHasTime,e.log=i.log,e.warn=i.warn,e.removeExact=i.removeExact,e.intersectRects=i.intersectRects;var r=n(47);e.formatDate=r.formatDate,e.formatRange=r.formatRange,e.queryMostGranularFormatUnit=r.queryMostGranularFormatUnit;var o=n(31);e.datepickerLocale=o.datepickerLocale,e.locale=o.locale;var s=n(10);e.moment=s.default;var a=n(11);e.EmitterMixin=a.default;var l=n(7);e.ListenerMixin=l.default;var u=n(48);e.Model=u.default;var d=n(207);e.Constraints=d.default;var c=n(5);e.UnzonedRange=c.default;var p=n(12);e.ComponentFootprint=p.default;var h=n(212);e.BusinessHourGenerator=h.default;var f=n(34);e.EventDef=f.default;var g=n(37);e.EventDefMutation=g.default;var v=n(38);e.EventSourceParser=v.default;var y=n(6);e.EventSource=y.default;var m=n(51);e.defineThemeSystem=m.defineThemeSystem;var b=n(18);e.EventInstanceGroup=b.default;var w=n(52);e.ArrayEventSource=w.default;var D=n(215);e.FuncEventSource=D.default;var E=n(216);e.JsonFeedEventSource=E.default;var S=n(36);e.EventFootprint=S.default;var C=n(33);e.Class=C.default;var R=n(14);e.Mixin=R.default;var T=n(53);e.CoordCache=T.default;var M=n(54);e.DragListener=M.default;var I=n(20);e.Promise=I.default;var H=n(217);e.TaskQueue=H.default;var P=n(218);e.RenderQueue=P.default;var _=n(39);e.Scroller=_.default;var x=n(19);e.Theme=x.default;var O=n(219);e.DateComponent=O.default;var F=n(40);e.InteractiveDateComponent=F.default;var z=n(220);e.Calendar=z.default;var B=n(41);e.View=B.default;var A=n(22);e.defineView=A.defineView,e.getViewConfig=A.getViewConfig;var k=n(55);e.DayTableMixin=k.default;var L=n(56);e.BusinessHourRenderer=L.default;var V=n(42);e.EventRenderer=V.default;var G=n(57);e.FillRenderer=G.default;var N=n(58);e.HelperRenderer=N.default;var j=n(222);e.ExternalDropping=j.default;var U=n(223);e.EventResizing=U.default;var W=n(59);e.EventPointing=W.default;var q=n(224);e.EventDragging=q.default;var Y=n(225);e.DateSelecting=Y.default;var Z=n(60);e.StandardInteractionsMixin=Z.default;var Q=n(226);e.AgendaView=Q.default;var X=n(227);e.TimeGrid=X.default;var $=n(61);e.DayGrid=$.default;var K=n(62);e.BasicView=K.default;var J=n(229);e.MonthView=J.default;var tt=n(230);e.ListView=tt.default},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(5),r=function(){function t(t,e,n){this.start=t,this.end=e||null,this.unzonedRange=this.buildUnzonedRange(n)}return t.parse=function(e,n){var i=e.start||e.date,r=e.end;if(!i)return!1;var o=n.calendar,s=o.moment(i),a=r?o.moment(r):null,l=e.allDay,u=o.opt("forceEventDuration");return!!s.isValid()&&(!a||a.isValid()&&a.isAfter(s)||(a=null),null==l&&null==(l=n.allDayDefault)&&(l=o.opt("allDayDefault")),!0===l?(s.stripTime(),a&&a.stripTime()):!1===l&&(s.hasTime()||s.time(0),a&&!a.hasTime()&&a.time(0)),!a&&u&&(a=o.getDefaultEventEnd(!s.hasTime(),s)),new t(s,a,o))},t.isStandardProp=function(t){return"start"===t||"date"===t||"end"===t||"allDay"===t},t.prototype.isAllDay=function(){return!(this.start.hasTime()||this.end&&this.end.hasTime())},t.prototype.buildUnzonedRange=function(t){var e=this.start.clone().stripZone().valueOf(),n=this.getEnd(t).stripZone().valueOf();return new i.default(e,n)},t.prototype.getEnd=function(t){return this.end?this.end.clone():t.getDefaultEventEnd(this.isAllDay(),this.start)},t}();e.default=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(5),r=n(35),o=n(211),s=function(){function t(t){this.eventInstances=t||[]}return t.prototype.getAllEventRanges=function(t){return t?this.sliceNormalRenderRanges(t):this.eventInstances.map(r.eventInstanceToEventRange)},t.prototype.sliceRenderRanges=function(t){return this.isInverse()?this.sliceInverseRenderRanges(t):this.sliceNormalRenderRanges(t)},t.prototype.sliceNormalRenderRanges=function(t){var e,n,i,r=this.eventInstances,s=[];for(e=0;e<r.length;e++)n=r[e],(i=n.dateProfile.unzonedRange.intersect(t))&&s.push(new o.default(i,n.def,n));return s},t.prototype.sliceInverseRenderRanges=function(t){var e=this.eventInstances.map(r.eventInstanceToUnzonedRange),n=this.getEventDef();return e=i.default.invertRanges(e,t),e.map(function(t){return new o.default(t,n)})},t.prototype.isInverse=function(){return this.getEventDef().hasInverseRendering()},t.prototype.getEventDef=function(){return this.explicitEventDef||this.eventInstances[0].def},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=function(){function t(t){this.optionsManager=t,this.processIconOverride()}return t.prototype.processIconOverride=function(){this.iconOverrideOption&&this.setIconOverride(this.optionsManager.get(this.iconOverrideOption))},t.prototype.setIconOverride=function(t){var e,n;if(i.isPlainObject(t)){e=i.extend({},this.iconClasses);for(n in t)e[n]=this.applyIconOverridePrefix(t[n]);this.iconClasses=e}else!1===t&&(this.iconClasses={})},t.prototype.applyIconOverridePrefix=function(t){var e=this.iconOverridePrefix;return e&&0!==t.indexOf(e)&&(t=e+t),t},t.prototype.getClass=function(t){return this.classes[t]||""},t.prototype.getIconClass=function(t){var e=this.iconClasses[t];return e?this.baseIconClass+" "+e:""},t.prototype.getCustomButtonIconClass=function(t){var e;return this.iconOverrideCustomButtonOption&&(e=t[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(e):""},t}();e.default=r,r.prototype.classes={},r.prototype.iconClasses={},r.prototype.baseIconClass="",r.prototype.iconOverridePrefix=""},function(t,e,n){function i(t,e){t.then=function(n){return"function"==typeof n?s.resolve(n(e)):t}}function r(t){t.then=function(e,n){return"function"==typeof n&&n(),t}}Object.defineProperty(e,"__esModule",{value:!0});var o=n(3),s={construct:function(t){var e=o.Deferred(),n=e.promise();return"function"==typeof t&&t(function(t){e.resolve(t),i(n,t)},function(){e.reject(),r(n)}),n},resolve:function(t){var e=o.Deferred().resolve(t),n=e.promise();return i(n,t),n},reject:function(){var t=o.Deferred().reject(),e=t.promise();return r(e),e}};e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(16),o=n(11),s=n(7);r.touchMouseIgnoreWait=500;var a=null,l=0,u=function(){function t(){this.isTouching=!1,this.mouseIgnoreDepth=0}return t.get=function(){return a||(a=new t,a.bind()),a},t.needed=function(){t.get(),l++},t.unneeded=function(){--l||(a.unbind(),a=null)},t.prototype.bind=function(){var t=this;this.listenTo(i(document),{touchstart:this.handleTouchStart,touchcancel:this.handleTouchCancel,touchend:this.handleTouchEnd,mousedown:this.handleMouseDown,mousemove:this.handleMouseMove,mouseup:this.handleMouseUp,click:this.handleClick,selectstart:this.handleSelectStart,contextmenu:this.handleContextMenu}),window.addEventListener("touchmove",this.handleTouchMoveProxy=function(e){t.handleTouchMove(i.Event(e))},{passive:!1}),window.addEventListener("scroll",this.handleScrollProxy=function(e){t.handleScroll(i.Event(e))},!0)},t.prototype.unbind=function(){this.stopListeningTo(i(document)),window.removeEventListener("touchmove",this.handleTouchMoveProxy),window.removeEventListener("scroll",this.handleScrollProxy,!0)},t.prototype.handleTouchStart=function(t){this.stopTouch(t,!0),this.isTouching=!0,this.trigger("touchstart",t)},t.prototype.handleTouchMove=function(t){this.isTouching&&this.trigger("touchmove",t)},t.prototype.handleTouchCancel=function(t){this.isTouching&&(this.trigger("touchcancel",t),this.stopTouch(t))},t.prototype.handleTouchEnd=function(t){this.stopTouch(t)},t.prototype.handleMouseDown=function(t){this.shouldIgnoreMouse()||this.trigger("mousedown",t)},t.prototype.handleMouseMove=function(t){this.shouldIgnoreMouse()||this.trigger("mousemove",t)},t.prototype.handleMouseUp=function(t){this.shouldIgnoreMouse()||this.trigger("mouseup",t)},t.prototype.handleClick=function(t){this.shouldIgnoreMouse()||this.trigger("click",t)},t.prototype.handleSelectStart=function(t){this.trigger("selectstart",t)},t.prototype.handleContextMenu=function(t){this.trigger("contextmenu",t)},t.prototype.handleScroll=function(t){this.trigger("scroll",t)},t.prototype.stopTouch=function(t,e){void 0===e&&(e=!1),this.isTouching&&(this.isTouching=!1,this.trigger("touchend",t),e||this.startTouchMouseIgnore())},t.prototype.startTouchMouseIgnore=function(){var t=this,e=r.touchMouseIgnoreWait;e&&(this.mouseIgnoreDepth++,setTimeout(function(){t.mouseIgnoreDepth--},e))},t.prototype.shouldIgnoreMouse=function(){return this.isTouching||Boolean(this.mouseIgnoreDepth)},t}();e.default=u,s.default.mixInto(u),o.default.mixInto(u)},function(t,e,n){function i(t,n){e.viewHash[t]=n}function r(t){return e.viewHash[t]}Object.defineProperty(e,"__esModule",{value:!0});var o=n(16);e.viewHash={},o.views=e.viewHash,e.defineView=i,e.getViewConfig=r},function(t,e,n){function i(t,e){return!t&&!e||!(!t||!e)&&(t.component===e.component&&r(t,e)&&r(e,t))}function r(t,e){for(var n in t)if(!/^(component|left|right|top|bottom)$/.test(n)&&t[n]!==e[n])return!1;return!0}Object.defineProperty(e,"__esModule",{value:!0});var o=n(2),s=n(4),a=n(54),l=function(t){function e(e,n){var i=t.call(this,n)||this;return i.component=e,i}return o.__extends(e,t),e.prototype.handleInteractionStart=function(e){var n,i,r,o=this.subjectEl;this.component.hitsNeeded(),this.computeScrollBounds(),e?(i={left:s.getEvX(e),top:s.getEvY(e)},r=i,o&&(n=s.getOuterRect(o),r=s.constrainPoint(r,n)),this.origHit=this.queryHit(r.left,r.top),o&&this.options.subjectCenter&&(this.origHit&&(n=s.intersectRects(this.origHit,n)||n),r=s.getRectCenter(n)),this.coordAdjust=s.diffPoints(r,i)):(this.origHit=null,this.coordAdjust=null),t.prototype.handleInteractionStart.call(this,e)},e.prototype.handleDragStart=function(e){var n;t.prototype.handleDragStart.call(this,e),(n=this.queryHit(s.getEvX(e),s.getEvY(e)))&&this.handleHitOver(n)},e.prototype.handleDrag=function(e,n,r){var o;t.prototype.handleDrag.call(this,e,n,r),o=this.queryHit(s.getEvX(r),s.getEvY(r)),i(o,this.hit)||(this.hit&&this.handleHitOut(),o&&this.handleHitOver(o))},e.prototype.handleDragEnd=function(e){this.handleHitDone(),t.prototype.handleDragEnd.call(this,e)},e.prototype.handleHitOver=function(t){var e=i(t,this.origHit);this.hit=t,this.trigger("hitOver",this.hit,e,this.origHit)},e.prototype.handleHitOut=function(){this.hit&&(this.trigger("hitOut",this.hit),this.handleHitDone(),this.hit=null)},e.prototype.handleHitDone=function(){this.hit&&this.trigger("hitDone",this.hit)},e.prototype.handleInteractionEnd=function(e,n){t.prototype.handleInteractionEnd.call(this,e,n),this.origHit=null,this.hit=null,this.component.hitsNotNeeded()},e.prototype.handleScrollEnd=function(){t.prototype.handleScrollEnd.call(this),this.isDragging&&(this.component.releaseHits(),this.component.prepareHits())},e.prototype.queryHit=function(t,e){return this.coordAdjust&&(t+=this.coordAdjust.left,e+=this.coordAdjust.top),this.component.queryHit(t,e)},e}(a.default);e.default=l},,,,,,,,function(t,e,n){function i(t){a.each(f,function(e,n){null==t[e]&&(t[e]=n(t))})}function r(t,n,i){var r=e.localeOptionHash[t]||(e.localeOptionHash[t]={});r.isRTL=i.isRTL,r.weekNumberTitle=i.weekHeader,a.each(p,function(t,e){r[t]=e(i)});var o=a.datepicker;o&&(o.regional[n]=o.regional[t]=i,o.regional.en=o.regional[""],o.setDefaults(i))}function o(t,n){var i,r;i=e.localeOptionHash[t]||(e.localeOptionHash[t]={}),n&&(i=e.localeOptionHash[t]=d.mergeOptions([i,n])),r=s(t),a.each(h,function(t,e){null==i[t]&&(i[t]=e(r,i))}),d.globalDefaults.locale=t}function s(t){return l.localeData(t)||l.localeData("en")}Object.defineProperty(e,"__esModule",{value:!0});var a=n(3),l=n(0),u=n(16),d=n(32),c=n(4);e.localeOptionHash={},u.locales=e.localeOptionHash;var p={buttonText:function(t){return{prev:c.stripHtmlEntities(t.prevText),next:c.stripHtmlEntities(t.nextText),today:c.stripHtmlEntities(t.currentText)}},monthYearFormat:function(t){return t.showMonthAfterYear?"YYYY["+t.yearSuffix+"] MMMM":"MMMM YYYY["+t.yearSuffix+"]"}},h={dayOfMonthFormat:function(t,e){var n=t.longDateFormat("l");return n=n.replace(/^Y+[^\w\s]*|[^\w\s]*Y+$/g,""),e.isRTL?n+=" ddd":n="ddd "+n,n},
-mediumTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"a")},smallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"a")},extraSmallTimeFormat:function(t){return t.longDateFormat("LT").replace(":mm","(:mm)").replace(/(\Wmm)$/,"($1)").replace(/\s*a$/i,"t")},hourFormat:function(t){return t.longDateFormat("LT").replace(":mm","").replace(/(\Wmm)$/,"").replace(/\s*a$/i,"a")},noMeridiemTimeFormat:function(t){return t.longDateFormat("LT").replace(/\s*a$/i,"")}},f={smallDayDateFormat:function(t){return t.isRTL?"D dd":"dd D"},weekFormat:function(t){return t.isRTL?"w[ "+t.weekNumberTitle+"]":"["+t.weekNumberTitle+" ]w"},smallWeekFormat:function(t){return t.isRTL?"w["+t.weekNumberTitle+"]":"["+t.weekNumberTitle+"]w"}};e.populateInstanceComputableOptions=i,e.datepickerLocale=r,e.locale=o,e.getMomentLocaleData=s,o("en",d.englishDefaults)},function(t,e,n){function i(t){return r.mergeProps(t,o)}Object.defineProperty(e,"__esModule",{value:!0});var r=n(4);e.globalDefaults={titleRangeSeparator:" – ",monthYearFormat:"MMMM YYYY",defaultTimedEventDuration:"02:00:00",defaultAllDayEventDuration:{days:1},forceEventDuration:!1,nextDayThreshold:"09:00:00",columnHeader:!0,defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberTitle:"W",weekNumberCalculation:"local",scrollTime:"06:00:00",minTime:"00:00:00",maxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timezoneParam:"timezone",timezone:!1,locale:null,isRTL:!1,buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day"},allDayText:"all-day",agendaEventMinHeight:0,theme:!1,dragOpacity:.75,dragRevertDuration:500,dragScroll:!0,unselectAuto:!0,dropAccept:"*",eventOrder:"title",eventLimit:!1,eventLimitText:"more",eventLimitClick:"popover",dayPopoverFormat:"LL",handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3},e.englishDefaults={dayPopoverFormat:"dddd, MMMM D"},e.rtlDefaults={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"right-single-arrow",next:"left-single-arrow",prevYear:"right-double-arrow",nextYear:"left-double-arrow"},themeButtonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w",nextYear:"seek-prev",prevYear:"seek-next"}};var o=["header","footer","buttonText","buttonIcons","themeButtonIcons"];e.mergeOptions=i},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),o=function(){function t(){}return t.extend=function(t){var e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(this);return r.copyOwnProps(t,e.prototype),e},t.mixin=function(t){r.copyOwnProps(t,this.prototype)},t}();e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(208),o=function(){function t(t){this.source=t,this.className=[],this.miscProps={}}return t.parse=function(t,e){var n=new this(e);return!!n.applyProps(t)&&n},t.normalizeId=function(t){return String(t)},t.generateId=function(){return"_fc"+t.uuid++},t.prototype.clone=function(){var e=new this.constructor(this.source);return e.id=this.id,e.rawId=this.rawId,e.uid=this.uid,t.copyVerbatimStandardProps(this,e),e.className=this.className.slice(),e.miscProps=i.extend({},this.miscProps),e},t.prototype.hasInverseRendering=function(){return"inverse-background"===this.getRendering()},t.prototype.hasBgRendering=function(){var t=this.getRendering();return"inverse-background"===t||"background"===t},t.prototype.getRendering=function(){return null!=this.rendering?this.rendering:this.source.rendering},t.prototype.getConstraint=function(){return null!=this.constraint?this.constraint:null!=this.source.constraint?this.source.constraint:this.source.calendar.opt("eventConstraint")},t.prototype.getOverlap=function(){return null!=this.overlap?this.overlap:null!=this.source.overlap?this.source.overlap:this.source.calendar.opt("eventOverlap")},t.prototype.isStartExplicitlyEditable=function(){return null!=this.startEditable?this.startEditable:this.source.startEditable},t.prototype.isDurationExplicitlyEditable=function(){return null!=this.durationEditable?this.durationEditable:this.source.durationEditable},t.prototype.isExplicitlyEditable=function(){return null!=this.editable?this.editable:this.source.editable},t.prototype.toLegacy=function(){var e=i.extend({},this.miscProps);return e._id=this.uid,e.source=this.source,e.className=this.className.slice(),e.allDay=this.isAllDay(),null!=this.rawId&&(e.id=this.rawId),t.copyVerbatimStandardProps(this,e),e},t.prototype.applyManualStandardProps=function(e){return null!=e.id?this.id=t.normalizeId(this.rawId=e.id):this.id=t.generateId(),null!=e._id?this.uid=String(e._id):this.uid=t.generateId(),i.isArray(e.className)&&(this.className=e.className),"string"==typeof e.className&&(this.className=e.className.split(/\s+/)),!0},t.prototype.applyMiscProps=function(t){i.extend(this.miscProps,t)},t.uuid=0,t.defineStandardProps=r.default.defineStandardProps,t.copyVerbatimStandardProps=r.default.copyVerbatimStandardProps,t}();e.default=o,r.default.mixInto(o),o.defineStandardProps({_id:!1,id:!1,className:!1,source:!1,title:!0,url:!0,rendering:!0,constraint:!0,overlap:!0,editable:!0,startEditable:!0,durationEditable:!0,color:!0,backgroundColor:!0,borderColor:!0,textColor:!0})},function(t,e,n){function i(t,e){var n,i=[];for(n=0;n<t.length;n++)i.push.apply(i,t[n].buildInstances(e));return i}function r(t){return new l.default(t.dateProfile.unzonedRange,t.def,t)}function o(t){return new u.default(new d.default(t.unzonedRange,t.eventDef.isAllDay()),t.eventDef,t.eventInstance)}function s(t){return t.dateProfile.unzonedRange}function a(t){return t.componentFootprint}Object.defineProperty(e,"__esModule",{value:!0});var l=n(211),u=n(36),d=n(12);e.eventDefsToEventInstances=i,e.eventInstanceToEventRange=r,e.eventRangeToEventFootprint=o,e.eventInstanceToUnzonedRange=s,e.eventFootprintToComponentFootprint=a},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e,n){this.componentFootprint=t,this.eventDef=e,n&&(this.eventInstance=n)}return t.prototype.getEventLegacy=function(){return(this.eventInstance||this.eventDef).toLegacy()},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(4),r=n(17),o=n(34),s=n(50),a=n(13),l=function(){function t(){}return t.createFromRawProps=function(e,n,a){var l,u,d,c,p=e.def,h={},f={},g={},v={},y=null,m=null;for(l in n)r.default.isStandardProp(l)?h[l]=n[l]:p.isStandardProp(l)?f[l]=n[l]:p.miscProps[l]!==n[l]&&(g[l]=n[l]);return u=r.default.parse(h,p.source),u&&(d=s.default.createFromDiff(e.dateProfile,u,a)),f.id!==p.id&&(y=f.id),i.isArraysEqual(f.className,p.className)||(m=f.className),o.default.copyVerbatimStandardProps(f,v),c=new t,c.eventDefId=y,c.className=m,c.verbatimStandardProps=v,c.miscProps=g,d&&(c.dateMutation=d),c},t.prototype.mutateSingle=function(t){var e;return this.dateMutation&&(e=t.dateProfile,t.dateProfile=this.dateMutation.buildNewDateProfile(e,t.source.calendar)),null!=this.eventDefId&&(t.id=o.default.normalizeId(t.rawId=this.eventDefId)),this.className&&(t.className=this.className),this.verbatimStandardProps&&a.default.copyVerbatimStandardProps(this.verbatimStandardProps,t),this.miscProps&&t.applyMiscProps(this.miscProps),e?function(){t.dateProfile=e}:function(){}},t.prototype.setDateMutation=function(t){t&&!t.isEmpty()?this.dateMutation=t:this.dateMutation=null},t.prototype.isEmpty=function(){return!this.dateMutation},t}();e.default=l},function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.default={sourceClasses:[],registerClass:function(t){this.sourceClasses.unshift(t)},parse:function(t,e){var n,i,r=this.sourceClasses;for(n=0;n<r.length;n++)if(i=r[n].parse(t,e))return i}}},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(33),a=function(t){function e(e){var n=t.call(this)||this;return e=e||{},n.overflowX=e.overflowX||e.overflow||"auto",n.overflowY=e.overflowY||e.overflow||"auto",n}return i.__extends(e,t),e.prototype.render=function(){this.el=this.renderEl(),this.applyOverflow()},e.prototype.renderEl=function(){return this.scrollEl=r('<div class="fc-scroller"></div>')},e.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},e.prototype.destroy=function(){this.el.remove()},e.prototype.applyOverflow=function(){this.scrollEl.css({"overflow-x":this.overflowX,"overflow-y":this.overflowY})},e.prototype.lockOverflow=function(t){var e=this.overflowX,n=this.overflowY;t=t||this.getScrollbarWidths(),"auto"===e&&(e=t.top||t.bottom||this.scrollEl[0].scrollWidth-1>this.scrollEl[0].clientWidth?"scroll":"hidden"),"auto"===n&&(n=t.left||t.right||this.scrollEl[0].scrollHeight-1>this.scrollEl[0].clientHeight?"scroll":"hidden"),this.scrollEl.css({"overflow-x":e,"overflow-y":n})},e.prototype.setHeight=function(t){this.scrollEl.height(t)},e.prototype.getScrollTop=function(){return this.scrollEl.scrollTop()},e.prototype.setScrollTop=function(t){this.scrollEl.scrollTop(t)},e.prototype.getClientWidth=function(){return this.scrollEl[0].clientWidth},e.prototype.getClientHeight=function(){return this.scrollEl[0].clientHeight},e.prototype.getScrollbarWidths=function(){return o.getScrollbarWidths(this.scrollEl)},e}(s.default);e.default=a},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(219),a=n(21),l=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.segSelector=".fc-event-container > *",i.dateSelectingClass&&(i.dateClicking=new i.dateClickingClass(i)),i.dateSelectingClass&&(i.dateSelecting=new i.dateSelectingClass(i)),i.eventPointingClass&&(i.eventPointing=new i.eventPointingClass(i)),i.eventDraggingClass&&i.eventPointing&&(i.eventDragging=new i.eventDraggingClass(i,i.eventPointing)),i.eventResizingClass&&i.eventPointing&&(i.eventResizing=new i.eventResizingClass(i,i.eventPointing)),i.externalDroppingClass&&(i.externalDropping=new i.externalDroppingClass(i)),i}return i.__extends(e,t),e.prototype.setElement=function(e){t.prototype.setElement.call(this,e),this.dateClicking&&this.dateClicking.bindToEl(e),this.dateSelecting&&this.dateSelecting.bindToEl(e),this.bindAllSegHandlersToEl(e)},e.prototype.removeElement=function(){this.endInteractions(),t.prototype.removeElement.call(this)},e.prototype.executeEventUnrender=function(){this.endInteractions(),t.prototype.executeEventUnrender.call(this)},e.prototype.bindGlobalHandlers=function(){t.prototype.bindGlobalHandlers.call(this),this.externalDropping&&this.externalDropping.bindToDocument()},e.prototype.unbindGlobalHandlers=function(){t.prototype.unbindGlobalHandlers.call(this),this.externalDropping&&this.externalDropping.unbindFromDocument()},e.prototype.bindDateHandlerToEl=function(t,e,n){var i=this;this.el.on(e,function(t){if(!r(t.target).is(i.segSelector+":not(.fc-helper),"+i.segSelector+":not(.fc-helper) *,.fc-more,a[data-goto]"))return n.call(i,t)})},e.prototype.bindAllSegHandlersToEl=function(t){[this.eventPointing,this.eventDragging,this.eventResizing].forEach(function(e){e&&e.bindToEl(t)})},e.prototype.bindSegHandlerToEl=function(t,e,n){var i=this;t.on(e,this.segSelector,function(t){var e=r(t.currentTarget);if(!e.is(".fc-helper")){var o=e.data("fc-seg");if(o&&!i.shouldIgnoreEventPointing())return n.call(i,o,t)}})},e.prototype.shouldIgnoreMouse=function(){return a.default.get().shouldIgnoreMouse()},e.prototype.shouldIgnoreTouch=function(){var t=this._getView();return t.isSelected||t.selectedEvent},e.prototype.shouldIgnoreEventPointing=function(){return this.eventDragging&&this.eventDragging.isDragging||this.eventResizing&&this.eventResizing.isResizing},e.prototype.canStartSelection=function(t,e){return o.getEvIsTouch(e)&&!this.canStartResize(t,e)&&(this.isEventDefDraggable(t.footprint.eventDef)||this.isEventDefResizable(t.footprint.eventDef))},e.prototype.canStartDrag=function(t,e){return!this.canStartResize(t,e)&&this.isEventDefDraggable(t.footprint.eventDef)},e.prototype.canStartResize=function(t,e){var n=this._getView(),i=t.footprint.eventDef;return(!o.getEvIsTouch(e)||n.isEventDefSelected(i))&&this.isEventDefResizable(i)&&r(e.target).is(".fc-resizer")},e.prototype.endInteractions=function(){[this.dateClicking,this.dateSelecting,this.eventPointing,this.eventDragging,this.eventResizing].forEach(function(t){t&&t.end()})},e.prototype.isEventDefDraggable=function(t){return this.isEventDefStartEditable(t)},e.prototype.isEventDefStartEditable=function(t){var e=t.isStartExplicitlyEditable();return null==e&&null==(e=this.opt("eventStartEditable"))&&(e=this.isEventDefGenerallyEditable(t)),e},e.prototype.isEventDefGenerallyEditable=function(t){var e=t.isExplicitlyEditable();return null==e&&(e=this.opt("editable")),e},e.prototype.isEventDefResizableFromStart=function(t){return this.opt("eventResizableFromStart")&&this.isEventDefResizable(t)},e.prototype.isEventDefResizableFromEnd=function(t){return this.isEventDefResizable(t)},e.prototype.isEventDefResizable=function(t){var e=t.isDurationExplicitlyEditable();return null==e&&null==(e=this.opt("eventDurationEditable"))&&(e=this.isEventDefGenerallyEditable(t)),e},e.prototype.diffDates=function(t,e){return this.largeUnit?o.diffByUnit(t,e,this.largeUnit):o.diffDayTime(t,e)},e.prototype.isEventInstanceGroupAllowed=function(t){var e,n=this._getView(),i=this.dateProfile,r=this.eventRangesToEventFootprints(t.getAllEventRanges());for(e=0;e<r.length;e++)if(!i.validUnzonedRange.containsRange(r[e].componentFootprint.unzonedRange))return!1;return n.calendar.constraints.isEventInstanceGroupAllowed(t)},e.prototype.isExternalInstanceGroupAllowed=function(t){var e,n=this._getView(),i=this.dateProfile,r=this.eventRangesToEventFootprints(t.getAllEventRanges());for(e=0;e<r.length;e++)if(!i.validUnzonedRange.containsRange(r[e].componentFootprint.unzonedRange))return!1;for(e=0;e<r.length;e++)if(!n.calendar.constraints.isSelectionFootprintAllowed(r[e].componentFootprint))return!1;return!0},e}(s.default);e.default=l},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(0),s=n(4),a=n(218),l=n(221),u=n(40),d=n(21),c=n(5),p=function(t){function e(e,n){var i=t.call(this,null,n.options)||this;return i.batchRenderDepth=0,i.isSelected=!1,i.calendar=e,i.viewSpec=n,i.type=n.type,i.name=i.type,i.initRenderQueue(),i.initHiddenDays(),i.dateProfileGenerator=new i.dateProfileGeneratorClass(i),i.bindBaseRenderHandlers(),i.eventOrderSpecs=s.parseFieldSpecs(i.opt("eventOrder")),i.initialize&&i.initialize(),i}return i.__extends(e,t),e.prototype._getView=function(){return this},e.prototype.opt=function(t){return this.options[t]},e.prototype.initRenderQueue=function(){this.renderQueue=new a.default({event:this.opt("eventRenderWait")}),this.renderQueue.on("start",this.onRenderQueueStart.bind(this)),this.renderQueue.on("stop",this.onRenderQueueStop.bind(this)),this.on("before:change",this.startBatchRender),this.on("change",this.stopBatchRender)},e.prototype.onRenderQueueStart=function(){this.calendar.freezeContentHeight(),this.addScroll(this.queryScroll())},e.prototype.onRenderQueueStop=function(){this.calendar.updateViewSize()&&this.popScroll(),this.calendar.thawContentHeight()},e.prototype.startBatchRender=function(){this.batchRenderDepth++||this.renderQueue.pause()},e.prototype.stopBatchRender=function(){--this.batchRenderDepth||this.renderQueue.resume()},e.prototype.requestRender=function(t,e,n){this.renderQueue.queue(t,e,n)},e.prototype.whenSizeUpdated=function(t){this.renderQueue.isRunning?this.renderQueue.one("stop",t.bind(this)):t.call(this)},e.prototype.computeTitle=function(t){var e;return e=/^(year|month)$/.test(t.currentRangeUnit)?t.currentUnzonedRange:t.activeUnzonedRange,this.formatRange({start:this.calendar.msToMoment(e.startMs,t.isRangeAllDay),end:this.calendar.msToMoment(e.endMs,t.isRangeAllDay)},t.isRangeAllDay,this.opt("titleFormat")||this.computeTitleFormat(t),this.opt("titleRangeSeparator"))},e.prototype.computeTitleFormat=function(t){var e=t.currentRangeUnit;return"year"===e?"YYYY":"month"===e?this.opt("monthYearFormat"):t.currentUnzonedRange.as("days")>1?"ll":"LL"},e.prototype.setDate=function(t){var e=this.get("dateProfile"),n=this.dateProfileGenerator.build(t,void 0,!0);e&&e.activeUnzonedRange.equals(n.activeUnzonedRange)||this.set("dateProfile",n)},e.prototype.unsetDate=function(){this.unset("dateProfile")},e.prototype.fetchInitialEvents=function(t){var e=this.calendar,n=t.isRangeAllDay&&!this.usesMinMaxTime;return e.requestEvents(e.msToMoment(t.activeUnzonedRange.startMs,n),e.msToMoment(t.activeUnzonedRange.endMs,n))},e.prototype.bindEventChanges=function(){this.listenTo(this.calendar,"eventsReset",this.resetEvents)},e.prototype.unbindEventChanges=function(){this.stopListeningTo(this.calendar,"eventsReset")},e.prototype.setEvents=function(t){this.set("currentEvents",t),this.set("hasEvents",!0)},e.prototype.unsetEvents=function(){this.unset("currentEvents"),this.unset("hasEvents")},e.prototype.resetEvents=function(t){this.startBatchRender(),this.unsetEvents(),this.setEvents(t),this.stopBatchRender()},e.prototype.requestDateRender=function(t){var e=this;this.requestRender(function(){e.executeDateRender(t)},"date","init")},e.prototype.requestDateUnrender=function(){var t=this;this.requestRender(function(){t.executeDateUnrender()},"date","destroy")},e.prototype.executeDateRender=function(e){t.prototype.executeDateRender.call(this,e),this.render&&this.render(),this.trigger("datesRendered"),this.addScroll({isDateInit:!0}),this.startNowIndicator()},e.prototype.executeDateUnrender=function(){this.unselect(),this.stopNowIndicator(),this.trigger("before:datesUnrendered"),this.destroy&&this.destroy(),t.prototype.executeDateUnrender.call(this)},e.prototype.bindBaseRenderHandlers=function(){var t=this;this.on("datesRendered",function(){t.whenSizeUpdated(t.triggerViewRender)}),this.on("before:datesUnrendered",function(){t.triggerViewDestroy()})},e.prototype.triggerViewRender=function(){this.publiclyTrigger("viewRender",{context:this,args:[this,this.el]})},e.prototype.triggerViewDestroy=function(){this.publiclyTrigger("viewDestroy",{context:this,args:[this,this.el]})},e.prototype.requestEventsRender=function(t){var e=this;this.requestRender(function(){e.executeEventRender(t),e.whenSizeUpdated(e.triggerAfterEventsRendered)},"event","init")},e.prototype.requestEventsUnrender=function(){var t=this;this.requestRender(function(){t.triggerBeforeEventsDestroyed(),t.executeEventUnrender()},"event","destroy")},e.prototype.requestBusinessHoursRender=function(t){var e=this;this.requestRender(function(){e.renderBusinessHours(t)},"businessHours","init")},e.prototype.requestBusinessHoursUnrender=function(){var t=this;this.requestRender(function(){t.unrenderBusinessHours()},"businessHours","destroy")},e.prototype.bindGlobalHandlers=function(){t.prototype.bindGlobalHandlers.call(this),this.listenTo(d.default.get(),{touchstart:this.processUnselect,mousedown:this.handleDocumentMousedown})},e.prototype.unbindGlobalHandlers=function(){t.prototype.unbindGlobalHandlers.call(this),this.stopListeningTo(d.default.get())},e.prototype.startNowIndicator=function(){var t,e,n,i=this;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit())&&(e=s.proxy(this,"updateNowIndicator"),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),n=this.initialNowDate.clone().startOf(t).add(1,t).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout(function(){i.nowIndicatorTimeoutID=null,e(),n=+o.duration(1,t),n=Math.max(100,n),i.nowIndicatorIntervalID=setInterval(e,n)},n))},e.prototype.updateNowIndicator=function(){this.isDatesRendered&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(this.initialNowDate.clone().add((new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},e.prototype.stopNowIndicator=function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},e.prototype.updateSize=function(e,n,i){this.setHeight?this.setHeight(e,n):t.prototype.updateSize.call(this,e,n,i),this.updateNowIndicator()},e.prototype.addScroll=function(t){var e=this.queuedScroll||(this.queuedScroll={});r.extend(e,t)},e.prototype.popScroll=function(){this.applyQueuedScroll(),this.queuedScroll=null},e.prototype.applyQueuedScroll=function(){this.queuedScroll&&this.applyScroll(this.queuedScroll)},e.prototype.queryScroll=function(){var t={};return this.isDatesRendered&&r.extend(t,this.queryDateScroll()),t},e.prototype.applyScroll=function(t){t.isDateInit&&this.isDatesRendered&&r.extend(t,this.computeInitialDateScroll()),this.isDatesRendered&&this.applyDateScroll(t)},e.prototype.computeInitialDateScroll=function(){return{}},e.prototype.queryDateScroll=function(){return{}},e.prototype.applyDateScroll=function(t){},e.prototype.reportEventDrop=function(t,e,n,i){var r=this.calendar.eventManager,s=r.mutateEventsWithId(t.def.id,e),a=e.dateMutation;a&&(t.dateProfile=a.buildNewDateProfile(t.dateProfile,this.calendar)),this.triggerEventDrop(t,a&&a.dateDelta||o.duration(),s,n,i)},e.prototype.triggerEventDrop=function(t,e,n,i,r){this.publiclyTrigger("eventDrop",{context:i[0],args:[t.toLegacy(),e,n,r,{},this]})},e.prototype.reportExternalDrop=function(t,e,n,i,r,o){e&&this.calendar.eventManager.addEventDef(t,n),this.triggerExternalDrop(t,e,i,r,o)},e.prototype.triggerExternalDrop=function(t,e,n,i,r){this.publiclyTrigger("drop",{context:n[0],args:[t.dateProfile.start.clone(),i,r,this]}),e&&this.publiclyTrigger("eventReceive",{context:this,args:[t.buildInstance().toLegacy(),this]})},e.prototype.reportEventResize=function(t,e,n,i){var r=this.calendar.eventManager,o=r.mutateEventsWithId(t.def.id,e);t.dateProfile=e.dateMutation.buildNewDateProfile(t.dateProfile,this.calendar),this.triggerEventResize(t,e.dateMutation.endDelta,o,n,i)},e.prototype.triggerEventResize=function(t,e,n,i,r){this.publiclyTrigger("eventResize",{context:i[0],args:[t.toLegacy(),e,n,r,{},this]})},e.prototype.select=function(t,e){this.unselect(e),this.renderSelectionFootprint(t),this.reportSelection(t,e)},e.prototype.renderSelectionFootprint=function(e){this.renderSelection?this.renderSelection(e.toLegacy(this.calendar)):t.prototype.renderSelectionFootprint.call(this,e)},e.prototype.reportSelection=function(t,e){this.isSelected=!0,this.triggerSelect(t,e)},e.prototype.triggerSelect=function(t,e){var n=this.calendar.footprintToDateProfile(t);this.publiclyTrigger("select",{context:this,args:[n.start,n.end,e,this]})},e.prototype.unselect=function(t){this.isSelected&&(this.isSelected=!1,this.destroySelection&&this.destroySelection(),this.unrenderSelection(),this.publiclyTrigger("unselect",{context:this,args:[t,this]}))},e.prototype.selectEventInstance=function(t){this.selectedEventInstance&&this.selectedEventInstance===t||(this.unselectEventInstance(),this.getEventSegs().forEach(function(e){e.footprint.eventInstance===t&&e.el&&e.el.addClass("fc-selected")}),this.selectedEventInstance=t)},e.prototype.unselectEventInstance=function(){this.selectedEventInstance&&(this.getEventSegs().forEach(function(t){t.el&&t.el.removeClass("fc-selected")}),this.selectedEventInstance=null)},e.prototype.isEventDefSelected=function(t){return this.selectedEventInstance&&this.selectedEventInstance.def.id===t.id},e.prototype.handleDocumentMousedown=function(t){s.isPrimaryMouseButton(t)&&this.processUnselect(t)},e.prototype.processUnselect=function(t){this.processRangeUnselect(t),this.processEventUnselect(t)},e.prototype.processRangeUnselect=function(t){var e;this.isSelected&&this.opt("unselectAuto")&&((e=this.opt("unselectCancel"))&&r(t.target).closest(e).length||this.unselect(t))},e.prototype.processEventUnselect=function(t){this.selectedEventInstance&&(r(t.target).closest(".fc-selected").length||this.unselectEventInstance())},e.prototype.triggerBaseRendered=function(){this.publiclyTrigger("viewRender",{context:this,args:[this,this.el]})},e.prototype.triggerBaseUnrendered=function(){this.publiclyTrigger("viewDestroy",{context:this,args:[this,this.el]})},e.prototype.triggerDayClick=function(t,e,n){var i=this.calendar.footprintToDateProfile(t);this.publiclyTrigger("dayClick",{context:e,args:[i.start,n,this]})},e.prototype.isDateInOtherMonth=function(t,e){return!1},e.prototype.getUnzonedRangeOption=function(t){var e=this.opt(t);if("function"==typeof e&&(e=e.apply(null,Array.prototype.slice.call(arguments,1))),e)return this.calendar.parseUnzonedRange(e)},e.prototype.initHiddenDays=function(){var t,e=this.opt("hiddenDays")||[],n=[],i=0;for(!1===this.opt("weekends")&&e.push(0,6),t=0;t<7;t++)(n[t]=-1!==r.inArray(t,e))||i++;if(!i)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(t){var e=t.getStart(),n=t.getEnd();return e&&(e=this.skipHiddenDays(e)),n&&(n=this.skipHiddenDays(n,-1,!0)),null===e||null===n||e<n?new c.default(e,n):null},e.prototype.isHiddenDay=function(t){return o.isMoment(t)&&(t=t.day()),this.isHiddenDayHash[t]},e.prototype.skipHiddenDays=function(t,e,n){void 0===e&&(e=1),void 0===n&&(n=!1);for(var i=t.clone();this.isHiddenDayHash[(i.day()+(n?e:0)+7)%7];)i.add(e,"days");return i},e}(u.default);e.default=p,p.prototype.usesMinMaxTime=!1,p.prototype.dateProfileGeneratorClass=l.default,p.watch("displayingDates",["isInDom","dateProfile"],function(t){this.requestDateRender(t.dateProfile)},function(){this.requestDateUnrender()}),p.watch("displayingBusinessHours",["displayingDates","businessHourGenerator"],function(t){this.requestBusinessHoursRender(t.businessHourGenerator)},function(){this.requestBusinessHoursUnrender()}),p.watch("initialEvents",["dateProfile"],function(t){return this.fetchInitialEvents(t.dateProfile)}),p.watch("bindingEvents",["initialEvents"],function(t){this.setEvents(t.initialEvents),this.bindEventChanges()},function(){this.unbindEventChanges(),this.unsetEvents()}),p.watch("displayingEvents",["displayingDates","hasEvents"],function(){this.requestEventsRender(this.get("currentEvents"))},function(){this.requestEventsUnrender()}),p.watch("title",["dateProfile"],function(t){return this.title=this.computeTitle(t.dateProfile)}),p.watch("legacyDateProps",["dateProfile"],function(t){var e=this.calendar,n=t.dateProfile;this.start=e.msToMoment(n.activeUnzonedRange.startMs,n.isRangeAllDay),this.end=e.msToMoment(n.activeUnzonedRange.endMs,n.isRangeAllDay),this.intervalStart=e.msToMoment(n.currentUnzonedRange.startMs,n.isRangeAllDay),this.intervalEnd=e.msToMoment(n.currentUnzonedRange.endMs,n.isRangeAllDay)})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=function(){function t(t,e){this.view=t._getView(),this.component=t,this.fillRenderer=e}return t.prototype.opt=function(t){return this.view.opt(t)},t.prototype.rangeUpdated=function(){var t,e;this.eventTimeFormat=this.opt("eventTimeFormat")||this.opt("timeFormat")||this.computeEventTimeFormat(),t=this.opt("displayEventTime"),null==t&&(t=this.computeDisplayEventTime()),e=this.opt("displayEventEnd"),null==e&&(e=this.computeDisplayEventEnd()),this.displayEventTime=t,this.displayEventEnd=e},t.prototype.render=function(t){var e,n,i,r=this.component._getDateProfile(),o=[],s=[];for(e in t)n=t[e],i=n.sliceRenderRanges(r.activeUnzonedRange),n.getEventDef().hasBgRendering()?o.push.apply(o,i):s.push.apply(s,i);this.renderBgRanges(o),this.renderFgRanges(s)},t.prototype.unrender=function(){this.unrenderBgRanges(),this.unrenderFgRanges()},t.prototype.renderFgRanges=function(t){var e=this.component.eventRangesToEventFootprints(t),n=this.component.eventFootprintsToSegs(e);n=this.renderFgSegEls(n),!1!==this.renderFgSegs(n)&&(this.fgSegs=n)},t.prototype.unrenderFgRanges=function(){this.unrenderFgSegs(this.fgSegs||[]),this.fgSegs=null},t.prototype.renderBgRanges=function(t){var e=this.component.eventRangesToEventFootprints(t),n=this.component.eventFootprintsToSegs(e);!1!==this.renderBgSegs(n)&&(this.bgSegs=n)},t.prototype.unrenderBgRanges=function(){this.unrenderBgSegs(),this.bgSegs=null},t.prototype.getSegs=function(){return(this.bgSegs||[]).concat(this.fgSegs||[])},t.prototype.renderFgSegs=function(t){return!1},t.prototype.unrenderFgSegs=function(t){},t.prototype.renderBgSegs=function(t){var e=this;if(!this.fillRenderer)return!1;this.fillRenderer.renderSegs("bgEvent",t,{getClasses:function(t){return e.getBgClasses(t.footprint.eventDef)},getCss:function(t){return{"background-color":e.getBgColor(t.footprint.eventDef)}},filterEl:function(t,n){return e.filterEventRenderEl(t.footprint,n)}})},t.prototype.unrenderBgSegs=function(){this.fillRenderer&&this.fillRenderer.unrender("bgEvent")},t.prototype.renderFgSegEls=function(t,e){var n=this;void 0===e&&(e=!1);var r,o=this.view.hasPublicHandlers("eventRender"),s="",a=[];if(t.length){for(r=0;r<t.length;r++)this.beforeFgSegHtml(t[r]),s+=this.fgSegHtml(t[r],e);i(s).each(function(e,r){var s=t[e],l=i(r);o&&(l=n.filterEventRenderEl(s.footprint,l)),l&&(l.data("fc-seg",s),s.el=l,a.push(s))})}return a},t.prototype.beforeFgSegHtml=function(t){},t.prototype.fgSegHtml=function(t,e){},t.prototype.getSegClasses=function(t,e,n){var i=["fc-event",t.isStart?"fc-start":"fc-not-start",t.isEnd?"fc-end":"fc-not-end"].concat(this.getClasses(t.footprint.eventDef));return e&&i.push("fc-draggable"),n&&i.push("fc-resizable"),this.view.isEventDefSelected(t.footprint.eventDef)&&i.push("fc-selected"),i},t.prototype.filterEventRenderEl=function(t,e){var n=t.getEventLegacy(),r=this.view.publiclyTrigger("eventRender",{context:n,args:[n,e,this.view]});return!1===r?e=null:r&&!0!==r&&(e=i(r)),e},t.prototype.getTimeText=function(t,e,n){return this._getTimeText(t.eventInstance.dateProfile.start,t.eventInstance.dateProfile.end,t.componentFootprint.isAllDay,e,n)},t.prototype._getTimeText=function(t,e,n,i,r){return null==i&&(i=this.eventTimeFormat),null==r&&(r=this.displayEventEnd),this.displayEventTime&&!n?r&&e?this.view.formatRange({start:t,end:e},!1,i):t.format(i):""},t.prototype.computeEventTimeFormat=function(){return this.opt("smallTimeFormat")},t.prototype.computeDisplayEventTime=function(){return!0},t.prototype.computeDisplayEventEnd=function(){return!0},t.prototype.getBgClasses=function(t){var e=this.getClasses(t);return e.push("fc-bgevent"),e},t.prototype.getClasses=function(t){var e,n=this.getStylingObjs(t),i=[];for(e=0;e<n.length;e++)i.push.apply(i,n[e].eventClassName||n[e].className||[]);return i},t.prototype.getSkinCss=function(t){return{"background-color":this.getBgColor(t),"border-color":this.getBorderColor(t),color:this.getTextColor(t)}},t.prototype.getBgColor=function(t){var e,n,i=this.getStylingObjs(t);for(e=0;e<i.length&&!n;e++)n=i[e].eventBackgroundColor||i[e].eventColor||i[e].backgroundColor||i[e].color;return n||(n=this.opt("eventBackgroundColor")||this.opt("eventColor")),n},t.prototype.getBorderColor=function(t){var e,n,i=this.getStylingObjs(t);for(e=0;e<i.length&&!n;e++)n=i[e].eventBorderColor||i[e].eventColor||i[e].borderColor||i[e].color;return n||(n=this.opt("eventBorderColor")||this.opt("eventColor")),n},t.prototype.getTextColor=function(t){var e,n,i=this.getStylingObjs(t);for(e=0;e<i.length&&!n;e++)n=i[e].eventTextColor||i[e].textColor;return n||(n=this.opt("eventTextColor")),n},t.prototype.getStylingObjs=function(t){var e=this.getFallbackStylingObjs(t);return e.unshift(t),e},t.prototype.getFallbackStylingObjs=function(t){return[t.source]},t.prototype.sortEventSegs=function(t){t.sort(r.proxy(this,"compareEventSegs"))},t.prototype.compareEventSegs=function(t,e){var n=t.footprint,i=e.footprint,o=n.componentFootprint,s=i.componentFootprint,a=o.unzonedRange,l=s.unzonedRange
-;return a.startMs-l.startMs||l.endMs-l.startMs-(a.endMs-a.startMs)||s.isAllDay-o.isAllDay||r.compareByFieldSpecs(n.eventDef,i.eventDef,this.view.eventOrderSpecs,n.eventDef.miscProps,i.eventDef.miscProps)},t}();e.default=o},,,,,function(t,e,n){function i(t){return"en"!==t.locale()?t.clone().locale("en"):t}function r(t,e){return h(a(e).fakeFormatString,t)}function o(t,e,n,i,r){var o;return t=y.default.parseZone(t),e=y.default.parseZone(e),o=t.localeData(),n=o.longDateFormat(n)||n,s(a(n),t,e,i||" - ",r)}function s(t,e,n,i,r){var o,s,a,l=t.sameUnits,u=e.clone().stripZone(),d=n.clone().stripZone(),c=f(t.fakeFormatString,e),p=f(t.fakeFormatString,n),h="",v="",y="",m="",b="";for(o=0;o<l.length&&(!l[o]||u.isSame(d,l[o]));o++)h+=c[o];for(s=l.length-1;s>o&&(!l[s]||u.isSame(d,l[s]))&&(s-1!==o||"."!==c[s]);s--)v=c[s]+v;for(a=o;a<=s;a++)y+=c[a],m+=p[a];return(y||m)&&(b=r?m+i+y:y+i+m),g(h+b+v)}function a(t){return C[t]||(C[t]=l(t))}function l(t){var e=u(t);return{fakeFormatString:c(e),sameUnits:p(e)}}function u(t){for(var e,n=[],i=/\[([^\]]*)\]|\(([^\)]*)\)|(LTS|LT|(\w)\4*o?)|([^\w\[\(]+)/g;e=i.exec(t);)e[1]?n.push.apply(n,d(e[1])):e[2]?n.push({maybe:u(e[2])}):e[3]?n.push({token:e[3]}):e[5]&&n.push.apply(n,d(e[5]));return n}function d(t){return". "===t?["."," "]:[t]}function c(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],"string"==typeof n?i.push("["+n+"]"):n.token?n.token in E?i.push(b+"["+n.token+"]"):i.push(n.token):n.maybe&&i.push(w+c(n.maybe)+w);return i.join(m)}function p(t){var e,n,i,r=[];for(e=0;e<t.length;e++)n=t[e],n.token?(i=S[n.token.charAt(0)],r.push(i?i.unit:"second")):n.maybe?r.push.apply(r,p(n.maybe)):r.push(null);return r}function h(t,e){return g(f(t,e).join(""))}function f(t,e){var n,i,r=[],o=y.oldMomentFormat(e,t),s=o.split(m);for(n=0;n<s.length;n++)i=s[n],i.charAt(0)===b?r.push(E[i.substring(1)](e)):r.push(i);return r}function g(t){return t.replace(D,function(t,e){return e.match(/[1-9]/)?e:""})}function v(t){var e,n,i,r,o=u(t);for(e=0;e<o.length;e++)n=o[e],n.token&&(i=S[n.token.charAt(0)])&&(!r||i.value>r.value)&&(r=i);return r?r.unit:null}Object.defineProperty(e,"__esModule",{value:!0});var y=n(10);y.newMomentProto.format=function(){return this._fullCalendar&&arguments[0]?r(this,arguments[0]):this._ambigTime?y.oldMomentFormat(i(this),"YYYY-MM-DD"):this._ambigZone?y.oldMomentFormat(i(this),"YYYY-MM-DD[T]HH:mm:ss"):this._fullCalendar?y.oldMomentFormat(i(this)):y.oldMomentProto.format.apply(this,arguments)},y.newMomentProto.toISOString=function(){return this._ambigTime?y.oldMomentFormat(i(this),"YYYY-MM-DD"):this._ambigZone?y.oldMomentFormat(i(this),"YYYY-MM-DD[T]HH:mm:ss"):this._fullCalendar?y.oldMomentProto.toISOString.apply(i(this),arguments):y.oldMomentProto.toISOString.apply(this,arguments)};var m="\v",b="\1f",w="\1e",D=new RegExp(w+"([^"+w+"]*)"+w,"g"),E={t:function(t){return y.oldMomentFormat(t,"a").charAt(0)},T:function(t){return y.oldMomentFormat(t,"A").charAt(0)}},S={Y:{value:1,unit:"year"},M:{value:2,unit:"month"},W:{value:3,unit:"week"},w:{value:3,unit:"week"},D:{value:4,unit:"day"},d:{value:4,unit:"day"}};e.formatDate=r,e.formatRange=o;var C={};e.queryMostGranularFormatUnit=v},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(33),o=n(11),s=n(7),a=function(t){function e(){var e=t.call(this)||this;return e._watchers={},e._props={},e.applyGlobalWatchers(),e.constructed(),e}return i.__extends(e,t),e.watch=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];this.prototype.hasOwnProperty("_globalWatchArgs")||(this.prototype._globalWatchArgs=Object.create(this.prototype._globalWatchArgs)),this.prototype._globalWatchArgs[t]=e},e.prototype.constructed=function(){},e.prototype.applyGlobalWatchers=function(){var t,e=this._globalWatchArgs;for(t in e)this.watch.apply(this,[t].concat(e[t]))},e.prototype.has=function(t){return t in this._props},e.prototype.get=function(t){return void 0===t?this._props:this._props[t]},e.prototype.set=function(t,e){var n;"string"==typeof t?(n={},n[t]=void 0===e?null:e):n=t,this.setProps(n)},e.prototype.reset=function(t){var e,n=this._props,i={};for(e in n)i[e]=void 0;for(e in t)i[e]=t[e];this.setProps(i)},e.prototype.unset=function(t){var e,n,i={};for(e="string"==typeof t?[t]:t,n=0;n<e.length;n++)i[e[n]]=void 0;this.setProps(i)},e.prototype.setProps=function(t){var e,n,i={},r=0;for(e in t)"object"!=typeof(n=t[e])&&n===this._props[e]||(i[e]=n,r++);if(r){this.trigger("before:batchChange",i);for(e in i)n=i[e],this.trigger("before:change",e,n),this.trigger("before:change:"+e,n);for(e in i)n=i[e],void 0===n?delete this._props[e]:this._props[e]=n,this.trigger("change:"+e,n),this.trigger("change",e,n);this.trigger("batchChange",i)}},e.prototype.watch=function(t,e,n,i){var r=this;this.unwatch(t),this._watchers[t]=this._watchDeps(e,function(e){var i=n.call(r,e);i&&i.then?(r.unset(t),i.then(function(e){r.set(t,e)})):r.set(t,i)},function(e){r.unset(t),i&&i.call(r,e)})},e.prototype.unwatch=function(t){var e=this._watchers[t];e&&(delete this._watchers[t],e.teardown())},e.prototype._watchDeps=function(t,e,n){var i=this,r=0,o=t.length,s=0,a={},l=[],u=!1,d=function(t,e,i){1===++r&&s===o&&(u=!0,n(a),u=!1)},c=function(t,n,i){void 0===n?(i||void 0===a[t]||s--,delete a[t]):(i||void 0!==a[t]||s++,a[t]=n),--r||s===o&&(u||e(a))},p=function(t,e){i.on(t,e),l.push([t,e])};return t.forEach(function(t){var e=!1;"?"===t.charAt(0)&&(t=t.substring(1),e=!0),p("before:change:"+t,function(t){d()}),p("change:"+t,function(n){c(t,n,e)})}),t.forEach(function(t){var e=!1;"?"===t.charAt(0)&&(t=t.substring(1),e=!0),i.has(t)?(a[t]=i.get(t),s++):e&&s++}),s===o&&e(a),{teardown:function(){for(var t=0;t<l.length;t++)i.off(l[t][0],l[t][1]);l=null,s===o&&n()},flash:function(){s===o&&(n(),e(a))}}},e.prototype.flash=function(t){var e=this._watchers[t];e&&e.flash()},e}(r.default);e.default=a,a.prototype._globalWatchArgs={},o.default.mixInto(a),s.default.mixInto(a)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(0),r=n(4),o=n(13),s=n(210);e.default={parse:function(t,e){return r.isTimeString(t.start)||i.isDuration(t.start)||r.isTimeString(t.end)||i.isDuration(t.end)?s.default.parse(t,e):o.default.parse(t,e)}}},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(4),r=n(17),o=function(){function t(){this.clearEnd=!1,this.forceTimed=!1,this.forceAllDay=!1}return t.createFromDiff=function(e,n,r){function o(t,e){return r?i.diffByUnit(t,e,r):n.isAllDay()?i.diffDay(t,e):i.diffDayTime(t,e)}var s,a,l,u,d=e.end&&!n.end,c=e.isAllDay()&&!n.isAllDay(),p=!e.isAllDay()&&n.isAllDay();return s=o(n.start,e.start),n.end&&(a=o(n.unzonedRange.getEnd(),e.unzonedRange.getEnd()),l=a.subtract(s)),u=new t,u.clearEnd=d,u.forceTimed=c,u.forceAllDay=p,u.setDateDelta(s),u.setEndDelta(l),u},t.prototype.buildNewDateProfile=function(t,e){var n=t.start.clone(),i=null,o=!1;return t.end&&!this.clearEnd?i=t.end.clone():this.endDelta&&!i&&(i=e.getDefaultEventEnd(t.isAllDay(),n)),this.forceTimed?(o=!0,n.hasTime()||n.time(0),i&&!i.hasTime()&&i.time(0)):this.forceAllDay&&(n.hasTime()&&n.stripTime(),i&&i.hasTime()&&i.stripTime()),this.dateDelta&&(o=!0,n.add(this.dateDelta),i&&i.add(this.dateDelta)),this.endDelta&&(o=!0,i.add(this.endDelta)),this.startDelta&&(o=!0,n.add(this.startDelta)),o&&(n=e.applyTimezone(n),i&&(i=e.applyTimezone(i))),!i&&e.opt("forceEventDuration")&&(i=e.getDefaultEventEnd(t.isAllDay(),n)),new r.default(n,i,e)},t.prototype.setDateDelta=function(t){t&&t.valueOf()?this.dateDelta=t:this.dateDelta=null},t.prototype.setStartDelta=function(t){t&&t.valueOf()?this.startDelta=t:this.startDelta=null},t.prototype.setEndDelta=function(t){t&&t.valueOf()?this.endDelta=t:this.endDelta=null},t.prototype.isEmpty=function(){return!(this.clearEnd||this.forceTimed||this.forceAllDay||this.dateDelta||this.startDelta||this.endDelta)},t}();e.default=o},function(t,e,n){function i(t,e){a[t]=e}function r(t){return t?!0===t?s.default:a[t]:o.default}Object.defineProperty(e,"__esModule",{value:!0});var o=n(213),s=n(214),a={};e.defineThemeSystem=i,e.getThemeSystemClass=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(20),a=n(6),l=n(13),u=function(t){function e(e){var n=t.call(this,e)||this;return n.eventDefs=[],n}return i.__extends(e,t),e.parse=function(t,e){var n;return r.isArray(t.events)?n=t:r.isArray(t)&&(n={events:t}),!!n&&a.default.parse.call(this,n,e)},e.prototype.setRawEventDefs=function(t){this.rawEventDefs=t,this.eventDefs=this.parseEventDefs(t)},e.prototype.fetch=function(t,e,n){var i,r=this.eventDefs;if(null!=this.currentTimezone&&this.currentTimezone!==n)for(i=0;i<r.length;i++)r[i]instanceof l.default&&r[i].rezone();return this.currentTimezone=n,s.default.resolve(r)},e.prototype.addEventDef=function(t){this.eventDefs.push(t)},e.prototype.removeEventDefsById=function(t){return o.removeMatching(this.eventDefs,function(e){return e.id===t})},e.prototype.removeAllEventDefs=function(){this.eventDefs=[]},e.prototype.getPrimitive=function(){return this.rawEventDefs},e.prototype.applyManualStandardProps=function(e){var n=t.prototype.applyManualStandardProps.call(this,e);return this.setRawEventDefs(e.events),n},e}(a.default);e.default=u,u.defineStandardProps({events:!1})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=function(){function t(t){this.isHorizontal=!1,this.isVertical=!1,this.els=i(t.els),this.isHorizontal=t.isHorizontal,this.isVertical=t.isVertical,this.forcedOffsetParentEl=t.offsetParent?i(t.offsetParent):null}return t.prototype.build=function(){var t=this.forcedOffsetParentEl;!t&&this.els.length>0&&(t=this.els.eq(0).offsetParent()),this.origin=t?t.offset():null,this.boundingRect=this.queryBoundingRect(),this.isHorizontal&&this.buildElHorizontals(),this.isVertical&&this.buildElVerticals()},t.prototype.clear=function(){this.origin=null,this.boundingRect=null,this.lefts=null,this.rights=null,this.tops=null,this.bottoms=null},t.prototype.ensureBuilt=function(){this.origin||this.build()},t.prototype.buildElHorizontals=function(){var t=[],e=[];this.els.each(function(n,r){var o=i(r),s=o.offset().left,a=o.outerWidth();t.push(s),e.push(s+a)}),this.lefts=t,this.rights=e},t.prototype.buildElVerticals=function(){var t=[],e=[];this.els.each(function(n,r){var o=i(r),s=o.offset().top,a=o.outerHeight();t.push(s),e.push(s+a)}),this.tops=t,this.bottoms=e},t.prototype.getHorizontalIndex=function(t){this.ensureBuilt();var e,n=this.lefts,i=this.rights,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},t.prototype.getVerticalIndex=function(t){this.ensureBuilt();var e,n=this.tops,i=this.bottoms,r=n.length;for(e=0;e<r;e++)if(t>=n[e]&&t<i[e])return e},t.prototype.getLeftOffset=function(t){return this.ensureBuilt(),this.lefts[t]},t.prototype.getLeftPosition=function(t){return this.ensureBuilt(),this.lefts[t]-this.origin.left},t.prototype.getRightOffset=function(t){return this.ensureBuilt(),this.rights[t]},t.prototype.getRightPosition=function(t){return this.ensureBuilt(),this.rights[t]-this.origin.left},t.prototype.getWidth=function(t){return this.ensureBuilt(),this.rights[t]-this.lefts[t]},t.prototype.getTopOffset=function(t){return this.ensureBuilt(),this.tops[t]},t.prototype.getTopPosition=function(t){return this.ensureBuilt(),this.tops[t]-this.origin.top},t.prototype.getBottomOffset=function(t){return this.ensureBuilt(),this.bottoms[t]},t.prototype.getBottomPosition=function(t){return this.ensureBuilt(),this.bottoms[t]-this.origin.top},t.prototype.getHeight=function(t){return this.ensureBuilt(),this.bottoms[t]-this.tops[t]},t.prototype.queryBoundingRect=function(){var t;return this.els.length>0&&(t=r.getScrollParent(this.els.eq(0)),!t.is(document))?r.getClientRect(t):null},t.prototype.isPointInBounds=function(t,e){return this.isLeftInBounds(t)&&this.isTopInBounds(e)},t.prototype.isLeftInBounds=function(t){return!this.boundingRect||t>=this.boundingRect.left&&t<this.boundingRect.right},t.prototype.isTopInBounds=function(t){return!this.boundingRect||t>=this.boundingRect.top&&t<this.boundingRect.bottom},t}();e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=n(7),s=n(21),a=function(){function t(t){this.isInteracting=!1,this.isDistanceSurpassed=!1,this.isDelayEnded=!1,this.isDragging=!1,this.isTouch=!1,this.isGeneric=!1,this.shouldCancelTouchScroll=!0,this.scrollAlwaysKills=!1,this.isAutoScroll=!1,this.scrollSensitivity=30,this.scrollSpeed=200,this.scrollIntervalMs=50,this.options=t||{}}return t.prototype.startInteraction=function(t,e){if(void 0===e&&(e={}),"mousedown"===t.type){if(s.default.get().shouldIgnoreMouse())return;if(!r.isPrimaryMouseButton(t))return;t.preventDefault()}this.isInteracting||(this.delay=r.firstDefined(e.delay,this.options.delay,0),this.minDistance=r.firstDefined(e.distance,this.options.distance,0),this.subjectEl=this.options.subjectEl,r.preventSelection(i("body")),this.isInteracting=!0,this.isTouch=r.getEvIsTouch(t),this.isGeneric="dragstart"===t.type,this.isDelayEnded=!1,this.isDistanceSurpassed=!1,this.originX=r.getEvX(t),this.originY=r.getEvY(t),this.scrollEl=r.getScrollParent(i(t.target)),this.bindHandlers(),this.initAutoScroll(),this.handleInteractionStart(t),this.startDelay(t),this.minDistance||this.handleDistanceSurpassed(t))},t.prototype.handleInteractionStart=function(t){this.trigger("interactionStart",t)},t.prototype.endInteraction=function(t,e){this.isInteracting&&(this.endDrag(t),this.delayTimeoutId&&(clearTimeout(this.delayTimeoutId),this.delayTimeoutId=null),this.destroyAutoScroll(),this.unbindHandlers(),this.isInteracting=!1,this.handleInteractionEnd(t,e),r.allowSelection(i("body")))},t.prototype.handleInteractionEnd=function(t,e){this.trigger("interactionEnd",t,e||!1)},t.prototype.bindHandlers=function(){var t=s.default.get();this.isGeneric?this.listenTo(i(document),{drag:this.handleMove,dragstop:this.endInteraction}):this.isTouch?this.listenTo(t,{touchmove:this.handleTouchMove,touchend:this.endInteraction,scroll:this.handleTouchScroll}):this.listenTo(t,{mousemove:this.handleMouseMove,mouseup:this.endInteraction}),this.listenTo(t,{selectstart:r.preventDefault,contextmenu:r.preventDefault})},t.prototype.unbindHandlers=function(){this.stopListeningTo(s.default.get()),this.stopListeningTo(i(document))},t.prototype.startDrag=function(t,e){this.startInteraction(t,e),this.isDragging||(this.isDragging=!0,this.handleDragStart(t))},t.prototype.handleDragStart=function(t){this.trigger("dragStart",t)},t.prototype.handleMove=function(t){var e=r.getEvX(t)-this.originX,n=r.getEvY(t)-this.originY,i=this.minDistance;this.isDistanceSurpassed||e*e+n*n>=i*i&&this.handleDistanceSurpassed(t),this.isDragging&&this.handleDrag(e,n,t)},t.prototype.handleDrag=function(t,e,n){this.trigger("drag",t,e,n),this.updateAutoScroll(n)},t.prototype.endDrag=function(t){this.isDragging&&(this.isDragging=!1,this.handleDragEnd(t))},t.prototype.handleDragEnd=function(t){this.trigger("dragEnd",t)},t.prototype.startDelay=function(t){var e=this;this.delay?this.delayTimeoutId=setTimeout(function(){e.handleDelayEnd(t)},this.delay):this.handleDelayEnd(t)},t.prototype.handleDelayEnd=function(t){this.isDelayEnded=!0,this.isDistanceSurpassed&&this.startDrag(t)},t.prototype.handleDistanceSurpassed=function(t){this.isDistanceSurpassed=!0,this.isDelayEnded&&this.startDrag(t)},t.prototype.handleTouchMove=function(t){this.isDragging&&this.shouldCancelTouchScroll&&t.preventDefault(),this.handleMove(t)},t.prototype.handleMouseMove=function(t){this.handleMove(t)},t.prototype.handleTouchScroll=function(t){this.isDragging&&!this.scrollAlwaysKills||this.endInteraction(t,!0)},t.prototype.trigger=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];this.options[t]&&this.options[t].apply(this,e),this["_"+t]&&this["_"+t].apply(this,e)},t.prototype.initAutoScroll=function(){var t=this.scrollEl;this.isAutoScroll=this.options.scroll&&t&&!t.is(window)&&!t.is(document),this.isAutoScroll&&this.listenTo(t,"scroll",r.debounce(this.handleDebouncedScroll,100))},t.prototype.destroyAutoScroll=function(){this.endAutoScroll(),this.isAutoScroll&&this.stopListeningTo(this.scrollEl,"scroll")},t.prototype.computeScrollBounds=function(){this.isAutoScroll&&(this.scrollBounds=r.getOuterRect(this.scrollEl))},t.prototype.updateAutoScroll=function(t){var e,n,i,o,s=this.scrollSensitivity,a=this.scrollBounds,l=0,u=0;a&&(e=(s-(r.getEvY(t)-a.top))/s,n=(s-(a.bottom-r.getEvY(t)))/s,i=(s-(r.getEvX(t)-a.left))/s,o=(s-(a.right-r.getEvX(t)))/s,e>=0&&e<=1?l=e*this.scrollSpeed*-1:n>=0&&n<=1&&(l=n*this.scrollSpeed),i>=0&&i<=1?u=i*this.scrollSpeed*-1:o>=0&&o<=1&&(u=o*this.scrollSpeed)),this.setScrollVel(l,u)},t.prototype.setScrollVel=function(t,e){this.scrollTopVel=t,this.scrollLeftVel=e,this.constrainScrollVel(),!this.scrollTopVel&&!this.scrollLeftVel||this.scrollIntervalId||(this.scrollIntervalId=setInterval(r.proxy(this,"scrollIntervalFunc"),this.scrollIntervalMs))},t.prototype.constrainScrollVel=function(){var t=this.scrollEl;this.scrollTopVel<0?t.scrollTop()<=0&&(this.scrollTopVel=0):this.scrollTopVel>0&&t.scrollTop()+t[0].clientHeight>=t[0].scrollHeight&&(this.scrollTopVel=0),this.scrollLeftVel<0?t.scrollLeft()<=0&&(this.scrollLeftVel=0):this.scrollLeftVel>0&&t.scrollLeft()+t[0].clientWidth>=t[0].scrollWidth&&(this.scrollLeftVel=0)},t.prototype.scrollIntervalFunc=function(){var t=this.scrollEl,e=this.scrollIntervalMs/1e3;this.scrollTopVel&&t.scrollTop(t.scrollTop()+this.scrollTopVel*e),this.scrollLeftVel&&t.scrollLeft(t.scrollLeft()+this.scrollLeftVel*e),this.constrainScrollVel(),this.scrollTopVel||this.scrollLeftVel||this.endAutoScroll()},t.prototype.endAutoScroll=function(){this.scrollIntervalId&&(clearInterval(this.scrollIntervalId),this.scrollIntervalId=null,this.handleScrollEnd())},t.prototype.handleDebouncedScroll=function(){this.scrollIntervalId||this.handleScrollEnd()},t.prototype.handleScrollEnd=function(){},t}();e.default=a,o.default.mixInto(a)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),o=n(14),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.updateDayTable=function(){for(var t,e,n,i=this,r=i.view,o=r.calendar,s=o.msToUtcMoment(i.dateProfile.renderUnzonedRange.startMs,!0),a=o.msToUtcMoment(i.dateProfile.renderUnzonedRange.endMs,!0),l=-1,u=[],d=[];s.isBefore(a);)r.isHiddenDay(s)?u.push(l+.5):(l++,u.push(l),d.push(s.clone())),s.add(1,"days");if(this.breakOnWeeks){for(e=d[0].day(),t=1;t<d.length&&d[t].day()!==e;t++);n=Math.ceil(d.length/t)}else n=1,t=d.length;this.dayDates=d,this.dayIndices=u,this.daysPerRow=t,this.rowCnt=n,this.updateDayTableCols()},e.prototype.updateDayTableCols=function(){this.colCnt=this.computeColCnt(),this.colHeadFormat=this.opt("columnHeaderFormat")||this.opt("columnFormat")||this.computeColHeadFormat()},e.prototype.computeColCnt=function(){return this.daysPerRow},e.prototype.getCellDate=function(t,e){return this.dayDates[this.getCellDayIndex(t,e)].clone()},e.prototype.getCellRange=function(t,e){var n=this.getCellDate(t,e);return{start:n,end:n.clone().add(1,"days")}},e.prototype.getCellDayIndex=function(t,e){return t*this.daysPerRow+this.getColDayIndex(e)},e.prototype.getColDayIndex=function(t){return this.isRTL?this.colCnt-1-t:t},e.prototype.getDateDayIndex=function(t){var e=this.dayIndices,n=t.diff(this.dayDates[0],"days");return n<0?e[0]-1:n>=e.length?e[e.length-1]+1:e[n]},e.prototype.computeColHeadFormat=function(){return this.rowCnt>1||this.colCnt>10?"ddd":this.colCnt>1?this.opt("dayOfMonthFormat"):"dddd"},e.prototype.sliceRangeByRow=function(t){var e,n,i,r,o,s=this.daysPerRow,a=this.view.computeDayRange(t),l=this.getDateDayIndex(a.start),u=this.getDateDayIndex(a.end.clone().subtract(1,"days")),d=[];for(e=0;e<this.rowCnt;e++)n=e*s,i=n+s-1,r=Math.max(l,n),o=Math.min(u,i),r=Math.ceil(r),o=Math.floor(o),r<=o&&d.push({row:e,firstRowDayIndex:r-n,lastRowDayIndex:o-n,isStart:r===l,isEnd:o===u});return d},e.prototype.sliceRangeByDay=function(t){var e,n,i,r,o,s,a=this.daysPerRow,l=this.view.computeDayRange(t),u=this.getDateDayIndex(l.start),d=this.getDateDayIndex(l.end.clone().subtract(1,"days")),c=[];for(e=0;e<this.rowCnt;e++)for(n=e*a,i=n+a-1,r=n;r<=i;r++)o=Math.max(u,r),s=Math.min(d,r),o=Math.ceil(o),s=Math.floor(s),o<=s&&c.push({row:e,firstRowDayIndex:o-n,lastRowDayIndex:s-n,isStart:o===u,isEnd:s===d});return c},e.prototype.renderHeadHtml=function(){var t=this.view.calendar.theme;return'<div class="fc-row '+t.getClass("headerRow")+'"><table class="'+t.getClass("tableGrid")+'"><thead>'+this.renderHeadTrHtml()+"</thead></table></div>"},e.prototype.renderHeadIntroHtml=function(){return this.renderIntroHtml()},e.prototype.renderHeadTrHtml=function(){return"<tr>"+(this.isRTL?"":this.renderHeadIntroHtml())+this.renderHeadDateCellsHtml()+(this.isRTL?this.renderHeadIntroHtml():"")+"</tr>"},e.prototype.renderHeadDateCellsHtml=function(){var t,e,n=[];for(t=0;t<this.colCnt;t++)e=this.getCellDate(0,t),n.push(this.renderHeadDateCellHtml(e));return n.join("")},e.prototype.renderHeadDateCellHtml=function(t,e,n){var i,o=this,s=o.view,a=o.dateProfile.activeUnzonedRange.containsDate(t),l=["fc-day-header",s.calendar.theme.getClass("widgetHeader")];return i="function"==typeof o.opt("columnHeaderHtml")?o.opt("columnHeaderHtml")(t):"function"==typeof o.opt("columnHeaderText")?r.htmlEscape(o.opt("columnHeaderText")(t)):r.htmlEscape(t.format(o.colHeadFormat)),1===o.rowCnt?l=l.concat(o.getDayClasses(t,!0)):l.push("fc-"+r.dayIDs[t.day()]),'<th class="'+l.join(" ")+'"'+(1===(a&&o.rowCnt)?' data-date="'+t.format("YYYY-MM-DD")+'"':"")+(e>1?' colspan="'+e+'"':"")+(n?" "+n:"")+">"+(a?s.buildGotoAnchorHtml({date:t,forceOff:o.rowCnt>1||1===o.colCnt},i):i)+"</th>"},e.prototype.renderBgTrHtml=function(t){return"<tr>"+(this.isRTL?"":this.renderBgIntroHtml(t))+this.renderBgCellsHtml(t)+(this.isRTL?this.renderBgIntroHtml(t):"")+"</tr>"},e.prototype.renderBgIntroHtml=function(t){return this.renderIntroHtml()},e.prototype.renderBgCellsHtml=function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderBgCellHtml(n));return i.join("")},e.prototype.renderBgCellHtml=function(t,e){var n=this,i=n.view,r=n.dateProfile.activeUnzonedRange.containsDate(t),o=n.getDayClasses(t);return o.unshift("fc-day",i.calendar.theme.getClass("widgetContent")),'<td class="'+o.join(" ")+'"'+(r?' data-date="'+t.format("YYYY-MM-DD")+'"':"")+(e?" "+e:"")+"></td>"},e.prototype.renderIntroHtml=function(){},e.prototype.bookendCells=function(t){var e=this.renderIntroHtml();e&&(this.isRTL?t.append(e):t.prepend(e))},e}(o.default);e.default=s},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.component=t,this.fillRenderer=e}return t.prototype.render=function(t){var e=this.component,n=e._getDateProfile().activeUnzonedRange,i=t.buildEventInstanceGroup(e.hasAllDayBusinessHours,n),r=i?e.eventRangesToEventFootprints(i.sliceRenderRanges(n)):[];this.renderEventFootprints(r)},t.prototype.renderEventFootprints=function(t){var e=this.component.eventFootprintsToSegs(t);this.renderSegs(e),this.segs=e},t.prototype.renderSegs=function(t){this.fillRenderer&&this.fillRenderer.renderSegs("businessHours",t,{getClasses:function(t){return["fc-nonbusiness","fc-bgevent"]}})},t.prototype.unrender=function(){this.fillRenderer&&this.fillRenderer.unrender("businessHours"),this.segs=null},t.prototype.getSegs=function(){return this.segs||[]},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=function(){function t(t){this.fillSegTag="div",this.component=t,this.elsByFill={}}return t.prototype.renderFootprint=function(t,e,n){this.renderSegs(t,this.component.componentFootprintToSegs(e),n)},t.prototype.renderSegs=function(t,e,n){var i;return e=this.buildSegEls(t,e,n),i=this.attachSegEls(t,e),i&&this.reportEls(t,i),e},t.prototype.unrender=function(t){var e=this.elsByFill[t];e&&(e.remove(),delete this.elsByFill[t])},t.prototype.buildSegEls=function(t,e,n){var r,o=this,s="",a=[];if(e.length){for(r=0;r<e.length;r++)s+=this.buildSegHtml(t,e[r],n);i(s).each(function(t,r){var s=e[t],l=i(r);n.filterEl&&(l=n.filterEl(s,l)),l&&(l=i(l),l.is(o.fillSegTag)&&(s.el=l,a.push(s)))})}return a},t.prototype.buildSegHtml=function(t,e,n){var i=n.getClasses?n.getClasses(e):[],o=r.cssToStr(n.getCss?n.getCss(e):{});return"<"+this.fillSegTag+(i.length?' class="'+i.join(" ")+'"':"")+(o?' style="'+o+'"':"")+" />"},t.prototype.attachSegEls=function(t,e){},t.prototype.reportEls=function(t,e){this.elsByFill[t]?this.elsByFill[t]=this.elsByFill[t].add(e):this.elsByFill[t]=i(e)},t}();e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(13),r=n(36),o=n(6),s=function(){function t(t,e){this.view=t._getView(),this.component=t,this.eventRenderer=e}return t.prototype.renderComponentFootprint=function(t){this.renderEventFootprints([this.fabricateEventFootprint(t)])},t.prototype.renderEventDraggingFootprints=function(t,e,n){this.renderEventFootprints(t,e,"fc-dragging",n?null:this.view.opt("dragOpacity"))},t.prototype.renderEventResizingFootprints=function(t,e,n){this.renderEventFootprints(t,e,"fc-resizing")},t.prototype.renderEventFootprints=function(t,e,n,i){var r,o=this.component.eventFootprintsToSegs(t),s="fc-helper "+(n||"");for(o=this.eventRenderer.renderFgSegEls(o),r=0;r<o.length;r++)o[r].el.addClass(s);if(null!=i)for(r=0;r<o.length;r++)o[r].el.css("opacity",i);this.helperEls=this.renderSegs(o,e)},t.prototype.renderSegs=function(t,e){},t.prototype.unrender=function(){this.helperEls&&(this.helperEls.remove(),this.helperEls=null)},t.prototype.fabricateEventFootprint=function(t){var e,n=this.view.calendar,s=n.footprintToDateProfile(t),a=new i.default(new o.default(n));return a.dateProfile=s,e=a.buildInstance(),new r.default(t,a,e)},t}();e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(21),o=n(15),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.bindToEl=function(t){var e=this.component;e.bindSegHandlerToEl(t,"click",this.handleClick.bind(this)),e.bindSegHandlerToEl(t,"mouseenter",this.handleMouseover.bind(this)),e.bindSegHandlerToEl(t,"mouseleave",this.handleMouseout.bind(this))},e.prototype.handleClick=function(t,e){!1===this.component.publiclyTrigger("eventClick",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,this.view]})&&e.preventDefault()},e.prototype.handleMouseover=function(t,e){r.default.get().shouldIgnoreMouse()||this.mousedOverSeg||(this.mousedOverSeg=t,this.view.isEventDefResizable(t.footprint.eventDef)&&t.el.addClass("fc-allow-mouse-resize"),this.component.publiclyTrigger("eventMouseover",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,this.view]}))},e.prototype.handleMouseout=function(t,e){this.mousedOverSeg&&(this.mousedOverSeg=null,this.view.isEventDefResizable(t.footprint.eventDef)&&t.el.removeClass("fc-allow-mouse-resize"),this.component.publiclyTrigger("eventMouseout",{context:t.el[0],args:[t.footprint.getEventLegacy(),e||{},this.view]}))},e.prototype.end=function(){this.mousedOverSeg&&this.handleMouseout(this.mousedOverSeg)},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(14),o=n(245),s=n(225),a=n(59),l=n(224),u=n(223),d=n(222),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=c,c.prototype.dateClickingClass=o.default,c.prototype.dateSelectingClass=s.default,c.prototype.eventPointingClass=a.default,c.prototype.eventDraggingClass=l.default,c.prototype.eventResizingClass=u.default,c.prototype.externalDroppingClass=d.default},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(53),a=n(249),l=n(5),u=n(12),d=n(36),c=n(56),p=n(60),h=n(40),f=n(55),g=n(250),v=n(251),y=n(252),m=function(t){function e(e){var n=t.call(this,e)||this;return n.cellWeekNumbersVisible=!1,n.bottomCoordPadding=0,n.isRigid=!1,n.hasAllDayBusinessHours=!0,n}return i.__extends(e,t),e.prototype.componentFootprintToSegs=function(t){var e,n,i=this.sliceRangeByRow(t.unzonedRange);for(e=0;e<i.length;e++)n=i[e],this.isRTL?(n.leftCol=this.daysPerRow-1-n.lastRowDayIndex,n.rightCol=this.daysPerRow-1-n.firstRowDayIndex):(n.leftCol=n.firstRowDayIndex,n.rightCol=n.lastRowDayIndex);return i},e.prototype.renderDates=function(t){this.dateProfile=t,this.updateDayTable(),this.renderGrid()},e.prototype.unrenderDates=function(){this.removeSegPopover()},e.prototype.renderGrid=function(){var t,e,n=this.view,i=this.rowCnt,r=this.colCnt,o="";for(this.headContainerEl&&this.headContainerEl.html(this.renderHeadHtml()),t=0;t<i;t++)o+=this.renderDayRowHtml(t,this.isRigid);for(this.el.html(o),this.rowEls=this.el.find(".fc-row"),this.cellEls=this.el.find(".fc-day, .fc-disabled-day"),this.rowCoordCache=new s.default({els:this.rowEls,isVertical:!0}),this.colCoordCache=new s.default({els:this.cellEls.slice(0,this.colCnt),isHorizontal:!0}),t=0;t<i;t++)for(e=0;e<r;e++)this.publiclyTrigger("dayRender",{context:n,args:[this.getCellDate(t,e),this.getCellEl(t,e),n]})},e.prototype.renderDayRowHtml=function(t,e){var n=this.view.calendar.theme,i=["fc-row","fc-week",n.getClass("dayRow")];return e&&i.push("fc-rigid"),'<div class="'+i.join(" ")+'"><div class="fc-bg"><table class="'+n.getClass("tableGrid")+'">'+this.renderBgTrHtml(t)+'</table></div><div class="fc-content-skeleton"><table>'+(this.getIsNumbersVisible()?"<thead>"+this.renderNumberTrHtml(t)+"</thead>":"")+"</table></div></div>"},e.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.cellWeekNumbersVisible},e.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},e.prototype.renderNumberTrHtml=function(t){return"<tr>"+(this.isRTL?"":this.renderNumberIntroHtml(t))+this.renderNumberCellsHtml(t)+(this.isRTL?this.renderNumberIntroHtml(t):"")+"</tr>"},e.prototype.renderNumberIntroHtml=function(t){return this.renderIntroHtml()},e.prototype.renderNumberCellsHtml=function(t){var e,n,i=[];for(e=0;e<this.colCnt;e++)n=this.getCellDate(t,e),i.push(this.renderNumberCellHtml(n));return i.join("")},e.prototype.renderNumberCellHtml=function(t){var e,n,i=this.view,r="",o=this.dateProfile.activeUnzonedRange.containsDate(t),s=this.getIsDayNumbersVisible()&&o;return s||this.cellWeekNumbersVisible?(e=this.getDayClasses(t),e.unshift("fc-day-top"),this.cellWeekNumbersVisible&&(n="ISO"===t._locale._fullCalendar_weekCalc?1:t._locale.firstDayOfWeek()),r+='<td class="'+e.join(" ")+'"'+(o?' data-date="'+t.format()+'"':"")+">",this.cellWeekNumbersVisible&&t.day()===n&&(r+=i.buildGotoAnchorHtml({date:t,type:"week"},{class:"fc-week-number"},t.format("w"))),s&&(r+=i.buildGotoAnchorHtml(t,{class:"fc-day-number"},t.format("D"))),r+="</td>"):"<td/>"},e.prototype.prepareHits=function(){this.colCoordCache.build(),this.rowCoordCache.build(),this.rowCoordCache.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},e.prototype.releaseHits=function(){this.colCoordCache.clear(),this.rowCoordCache.clear()},e.prototype.queryHit=function(t,e){if(this.colCoordCache.isLeftInBounds(t)&&this.rowCoordCache.isTopInBounds(e)){var n=this.colCoordCache.getHorizontalIndex(t),i=this.rowCoordCache.getVerticalIndex(e);if(null!=i&&null!=n)return this.getCellHit(i,n)}},e.prototype.getHitFootprint=function(t){var e=this.getCellRange(t.row,t.col);return new u.default(new l.default(e.start,e.end),!0)},e.prototype.getHitEl=function(t){return this.getCellEl(t.row,t.col)},e.prototype.getCellHit=function(t,e){return{row:t,col:e,component:this,left:this.colCoordCache.getLeftOffset(e),right:this.colCoordCache.getRightOffset(e),top:this.rowCoordCache.getTopOffset(t),bottom:this.rowCoordCache.getBottomOffset(t)}},e.prototype.getCellEl=function(t,e){return this.cellEls.eq(t*this.colCnt+e)},e.prototype.executeEventUnrender=function(){this.removeSegPopover(),t.prototype.executeEventUnrender.call(this)},e.prototype.getOwnEventSegs=function(){
-return t.prototype.getOwnEventSegs.call(this).concat(this.popoverSegs||[])},e.prototype.renderDrag=function(t,e,n){var i;for(i=0;i<t.length;i++)this.renderHighlight(t[i].componentFootprint);if(t.length&&e&&e.component!==this)return this.helperRenderer.renderEventDraggingFootprints(t,e,n),!0},e.prototype.unrenderDrag=function(){this.unrenderHighlight(),this.helperRenderer.unrender()},e.prototype.renderEventResize=function(t,e,n){var i;for(i=0;i<t.length;i++)this.renderHighlight(t[i].componentFootprint);this.helperRenderer.renderEventResizingFootprints(t,e,n)},e.prototype.unrenderEventResize=function(){this.unrenderHighlight(),this.helperRenderer.unrender()},e.prototype.removeSegPopover=function(){this.segPopover&&this.segPopover.hide()},e.prototype.limitRows=function(t){var e,n,i=this.eventRenderer.rowStructs||[];for(e=0;e<i.length;e++)this.unlimitRow(e),!1!==(n=!!t&&("number"==typeof t?t:this.computeRowLevelLimit(e)))&&this.limitRow(e,n)},e.prototype.computeRowLevelLimit=function(t){function e(t,e){o=Math.max(o,r(e).outerHeight())}var n,i,o,s=this.rowEls.eq(t),a=s.height(),l=this.eventRenderer.rowStructs[t].tbodyEl.children();for(n=0;n<l.length;n++)if(i=l.eq(n).removeClass("fc-limited"),o=0,i.find("> td > :first-child").each(e),i.position().top+o>a)return n;return!1},e.prototype.limitRow=function(t,e){var n,i,o,s,a,l,u,d,c,p,h,f,g,v,y,m=this,b=this.eventRenderer.rowStructs[t],w=[],D=0,E=function(n){for(;D<n;)l=m.getCellSegs(t,D,e),l.length&&(c=i[e-1][D],y=m.renderMoreLink(t,D,l),v=r("<div/>").append(y),c.append(v),w.push(v[0])),D++};if(e&&e<b.segLevels.length){for(n=b.segLevels[e-1],i=b.cellMatrix,o=b.tbodyEl.children().slice(e).addClass("fc-limited").get(),s=0;s<n.length;s++){for(a=n[s],E(a.leftCol),d=[],u=0;D<=a.rightCol;)l=this.getCellSegs(t,D,e),d.push(l),u+=l.length,D++;if(u){for(c=i[e-1][a.leftCol],p=c.attr("rowspan")||1,h=[],f=0;f<d.length;f++)g=r('<td class="fc-more-cell"/>').attr("rowspan",p),l=d[f],y=this.renderMoreLink(t,a.leftCol+f,[a].concat(l)),v=r("<div/>").append(y),g.append(v),h.push(g[0]),w.push(g[0]);c.addClass("fc-limited").after(r(h)),o.push(c[0])}}E(this.colCnt),b.moreEls=r(w),b.limitedEls=r(o)}},e.prototype.unlimitRow=function(t){var e=this.eventRenderer.rowStructs[t];e.moreEls&&(e.moreEls.remove(),e.moreEls=null),e.limitedEls&&(e.limitedEls.removeClass("fc-limited"),e.limitedEls=null)},e.prototype.renderMoreLink=function(t,e,n){var i=this,o=this.view;return r('<a class="fc-more"/>').text(this.getMoreLinkText(n.length)).on("click",function(s){var a=i.opt("eventLimitClick"),l=i.getCellDate(t,e),u=r(s.currentTarget),d=i.getCellEl(t,e),c=i.getCellSegs(t,e),p=i.resliceDaySegs(c,l),h=i.resliceDaySegs(n,l);"function"==typeof a&&(a=i.publiclyTrigger("eventLimitClick",{context:o,args:[{date:l.clone(),dayEl:d,moreEl:u,segs:p,hiddenSegs:h},s,o]})),"popover"===a?i.showSegPopover(t,e,u,p):"string"==typeof a&&o.calendar.zoomTo(l,a)})},e.prototype.showSegPopover=function(t,e,n,i){var r,o,s=this,l=this.view,u=n.parent();r=1===this.rowCnt?l.el:this.rowEls.eq(t),o={className:"fc-more-popover "+l.calendar.theme.getClass("popover"),content:this.renderSegPopoverContent(t,e,i),parentEl:l.el,top:r.offset().top,autoHide:!0,viewportConstrain:this.opt("popoverViewportConstrain"),hide:function(){s.popoverSegs&&s.triggerBeforeEventSegsDestroyed(s.popoverSegs),s.segPopover.removeElement(),s.segPopover=null,s.popoverSegs=null}},this.isRTL?o.right=u.offset().left+u.outerWidth()+1:o.left=u.offset().left-1,this.segPopover=new a.default(o),this.segPopover.show(),this.bindAllSegHandlersToEl(this.segPopover.el),this.triggerAfterEventSegsRendered(i)},e.prototype.renderSegPopoverContent=function(t,e,n){var i,s=this.view,a=s.calendar.theme,l=this.getCellDate(t,e).format(this.opt("dayPopoverFormat")),u=r('<div class="fc-header '+a.getClass("popoverHeader")+'"><span class="fc-close '+a.getIconClass("close")+'"></span><span class="fc-title">'+o.htmlEscape(l)+'</span><div class="fc-clear"/></div><div class="fc-body '+a.getClass("popoverContent")+'"><div class="fc-event-container"></div></div>'),d=u.find(".fc-event-container");for(n=this.eventRenderer.renderFgSegEls(n,!0),this.popoverSegs=n,i=0;i<n.length;i++)this.hitsNeeded(),n[i].hit=this.getCellHit(t,e),this.hitsNotNeeded(),d.append(n[i].el);return u},e.prototype.resliceDaySegs=function(t,e){var n,i,o,s=e.clone(),a=s.clone().add(1,"days"),c=new l.default(s,a),p=[];for(n=0;n<t.length;n++)i=t[n],(o=i.footprint.componentFootprint.unzonedRange.intersect(c))&&p.push(r.extend({},i,{footprint:new d.default(new u.default(o,i.footprint.componentFootprint.isAllDay),i.footprint.eventDef,i.footprint.eventInstance),isStart:i.isStart&&o.isStart,isEnd:i.isEnd&&o.isEnd}));return this.eventRenderer.sortEventSegs(p),p},e.prototype.getMoreLinkText=function(t){var e=this.opt("eventLimitText");return"function"==typeof e?e(t):"+"+t+" "+e},e.prototype.getCellSegs=function(t,e,n){for(var i,r=this.eventRenderer.rowStructs[t].segMatrix,o=n||0,s=[];o<r.length;)i=r[o][e],i&&s.push(i),o++;return s},e}(h.default);e.default=m,m.prototype.eventRendererClass=g.default,m.prototype.businessHourRendererClass=c.default,m.prototype.helperRendererClass=v.default,m.prototype.fillRendererClass=y.default,p.default.mixInto(m),f.default.mixInto(m)},function(t,e,n){function i(t){return function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.colWeekNumbersVisible=!1,e}return r.__extends(e,t),e.prototype.renderHeadIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'<th class="fc-week-number '+t.calendar.theme.getClass("widgetHeader")+'" '+t.weekNumberStyleAttr()+"><span>"+s.htmlEscape(this.opt("weekNumberTitle"))+"</span></th>":""},e.prototype.renderNumberIntroHtml=function(t){var e=this.view,n=this.getCellDate(t,0);return this.colWeekNumbersVisible?'<td class="fc-week-number" '+e.weekNumberStyleAttr()+">"+e.buildGotoAnchorHtml({date:n,type:"week",forceOff:1===this.colCnt},n.format("w"))+"</td>":""},e.prototype.renderBgIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'<td class="fc-week-number '+t.calendar.theme.getClass("widgetContent")+'" '+t.weekNumberStyleAttr()+"></td>":""},e.prototype.renderIntroHtml=function(){var t=this.view;return this.colWeekNumbersVisible?'<td class="fc-week-number" '+t.weekNumberStyleAttr()+"></td>":""},e.prototype.getIsNumbersVisible=function(){return d.default.prototype.getIsNumbersVisible.apply(this,arguments)||this.colWeekNumbersVisible},e}(t)}Object.defineProperty(e,"__esModule",{value:!0});var r=n(2),o=n(3),s=n(4),a=n(39),l=n(41),u=n(228),d=n(61),c=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.dayGrid=i.instantiateDayGrid(),i.dayGrid.isRigid=i.hasRigidRows(),i.opt("weekNumbers")&&(i.opt("weekNumbersWithinDays")?(i.dayGrid.cellWeekNumbersVisible=!0,i.dayGrid.colWeekNumbersVisible=!1):(i.dayGrid.cellWeekNumbersVisible=!1,i.dayGrid.colWeekNumbersVisible=!0)),i.addChild(i.dayGrid),i.scroller=new a.default({overflowX:"hidden",overflowY:"auto"}),i}return r.__extends(e,t),e.prototype.instantiateDayGrid=function(){return new(i(this.dayGridClass))(this)},e.prototype.executeDateRender=function(e){this.dayGrid.breakOnWeeks=/year|month|week/.test(e.currentRangeUnit),t.prototype.executeDateRender.call(this,e)},e.prototype.renderSkeleton=function(){var t,e;this.el.addClass("fc-basic-view").html(this.renderSkeletonHtml()),this.scroller.render(),t=this.scroller.el.addClass("fc-day-grid-container"),e=o('<div class="fc-day-grid" />').appendTo(t),this.el.find(".fc-body > tr > td").append(t),this.dayGrid.headContainerEl=this.el.find(".fc-head-container"),this.dayGrid.setElement(e)},e.prototype.unrenderSkeleton=function(){this.dayGrid.removeElement(),this.scroller.destroy()},e.prototype.renderSkeletonHtml=function(){var t=this.calendar.theme;return'<table class="'+t.getClass("tableGrid")+'">'+(this.opt("columnHeader")?'<thead class="fc-head"><tr><td class="fc-head-container '+t.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+t.getClass("widgetContent")+'"></td></tr></tbody></table>'},e.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},e.prototype.hasRigidRows=function(){var t=this.opt("eventLimit");return t&&"number"!=typeof t},e.prototype.updateSize=function(e,n,i){var r,o,a=this.opt("eventLimit"),l=this.dayGrid.headContainerEl.find(".fc-row");if(!this.dayGrid.rowEls)return void(n||(r=this.computeScrollerHeight(e),this.scroller.setHeight(r)));t.prototype.updateSize.call(this,e,n,i),this.dayGrid.colWeekNumbersVisible&&(this.weekNumberWidth=s.matchCellWidths(this.el.find(".fc-week-number"))),this.scroller.clear(),s.uncompensateScroll(l),this.dayGrid.removeSegPopover(),a&&"number"==typeof a&&this.dayGrid.limitRows(a),r=this.computeScrollerHeight(e),this.setGridHeight(r,n),a&&"number"!=typeof a&&this.dayGrid.limitRows(a),n||(this.scroller.setHeight(r),o=this.scroller.getScrollbarWidths(),(o.left||o.right)&&(s.compensateScroll(l,o),r=this.computeScrollerHeight(e),this.scroller.setHeight(r)),this.scroller.lockOverflow(o))},e.prototype.computeScrollerHeight=function(t){return t-s.subtractInnerElHeight(this.el,this.scroller.el)},e.prototype.setGridHeight=function(t,e){e?s.undistributeHeight(this.dayGrid.rowEls):s.distributeHeight(this.dayGrid.rowEls,t,!0)},e.prototype.computeInitialDateScroll=function(){return{top:0}},e.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},e.prototype.applyDateScroll=function(t){void 0!==t.top&&this.scroller.setScrollTop(t.top)},e}(l.default);e.default=c,c.prototype.dateProfileGeneratorClass=u.default,c.prototype.dayGridClass=d.default},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(t,e,n){function i(t,e,n){var i;for(i=0;i<t.length;i++)if(!e(t[i].eventInstance.toLegacy(),n?n.toLegacy():null))return!1;return!0}function r(t,e){var n,i,r,o,s=e.toLegacy();for(n=0;n<t.length;n++){if(i=t[n].eventInstance,r=i.def,!1===(o=r.getOverlap()))return!1;if("function"==typeof o&&!o(i.toLegacy(),s))return!1}return!0}Object.defineProperty(e,"__esModule",{value:!0});var o=n(5),s=n(12),a=n(49),l=n(6),u=n(35),d=function(){function t(t,e){this.eventManager=t,this._calendar=e}return t.prototype.opt=function(t){return this._calendar.opt(t)},t.prototype.isEventInstanceGroupAllowed=function(t){var e,n=t.getEventDef(),i=this.eventRangesToEventFootprints(t.getAllEventRanges()),r=this.getPeerEventInstances(n),o=r.map(u.eventInstanceToEventRange),s=this.eventRangesToEventFootprints(o),a=n.getConstraint(),l=n.getOverlap(),d=this.opt("eventAllow");for(e=0;e<i.length;e++)if(!this.isFootprintAllowed(i[e].componentFootprint,s,a,l,i[e].eventInstance))return!1;if(d)for(e=0;e<i.length;e++)if(!1===d(i[e].componentFootprint.toLegacy(this._calendar),i[e].getEventLegacy()))return!1;return!0},t.prototype.getPeerEventInstances=function(t){return this.eventManager.getEventInstancesWithoutId(t.id)},t.prototype.isSelectionFootprintAllowed=function(t){var e,n=this.eventManager.getEventInstances(),i=n.map(u.eventInstanceToEventRange),r=this.eventRangesToEventFootprints(i);return!!this.isFootprintAllowed(t,r,this.opt("selectConstraint"),this.opt("selectOverlap"))&&(!(e=this.opt("selectAllow"))||!1!==e(t.toLegacy(this._calendar)))},t.prototype.isFootprintAllowed=function(t,e,n,o,s){var a,l;if(null!=n&&(a=this.constraintValToFootprints(n,t.isAllDay),!this.isFootprintWithinConstraints(t,a)))return!1;if(l=this.collectOverlapEventFootprints(e,t),!1===o){if(l.length)return!1}else if("function"==typeof o&&!i(l,o,s))return!1;return!(s&&!r(l,s))},t.prototype.isFootprintWithinConstraints=function(t,e){var n;for(n=0;n<e.length;n++)if(this.footprintContainsFootprint(e[n],t))return!0;return!1},t.prototype.constraintValToFootprints=function(t,e){var n;return"businessHours"===t?this.buildCurrentBusinessFootprints(e):"object"==typeof t?(n=this.parseEventDefToInstances(t),n?this.eventInstancesToFootprints(n):this.parseFootprints(t)):null!=t?(n=this.eventManager.getEventInstancesWithId(t),this.eventInstancesToFootprints(n)):void 0},t.prototype.buildCurrentBusinessFootprints=function(t){var e=this._calendar.view,n=e.get("businessHourGenerator"),i=e.dateProfile.activeUnzonedRange,r=n.buildEventInstanceGroup(t,i);return r?this.eventInstancesToFootprints(r.eventInstances):[]},t.prototype.eventInstancesToFootprints=function(t){var e=t.map(u.eventInstanceToEventRange);return this.eventRangesToEventFootprints(e).map(u.eventFootprintToComponentFootprint)},t.prototype.collectOverlapEventFootprints=function(t,e){var n,i=[];for(n=0;n<t.length;n++)this.footprintsIntersect(e,t[n].componentFootprint)&&i.push(t[n]);return i},t.prototype.parseEventDefToInstances=function(t){var e=this.eventManager,n=a.default.parse(t,new l.default(this._calendar));return!!n&&n.buildInstances(e.currentPeriod.unzonedRange)},t.prototype.eventRangesToEventFootprints=function(t){var e,n=[];for(e=0;e<t.length;e++)n.push.apply(n,this.eventRangeToEventFootprints(t[e]));return n},t.prototype.eventRangeToEventFootprints=function(t){return[u.eventRangeToEventFootprint(t)]},t.prototype.parseFootprints=function(t){var e,n;return t.start&&(e=this._calendar.moment(t.start),e.isValid()||(e=null)),t.end&&(n=this._calendar.moment(t.end),n.isValid()||(n=null)),[new s.default(new o.default(e,n),e&&!e.hasTime()||n&&!n.hasTime())]},t.prototype.footprintContainsFootprint=function(t,e){return t.unzonedRange.containsRange(e.unzonedRange)},t.prototype.footprintsIntersect=function(t,e){return t.unzonedRange.intersectsWith(e.unzonedRange)},t}();e.default=d},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),o=n(14),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.defineStandardProps=function(t){var e=this.prototype;e.hasOwnProperty("standardPropMap")||(e.standardPropMap=Object.create(e.standardPropMap)),r.copyOwnProps(t,e.standardPropMap)},e.copyVerbatimStandardProps=function(t,e){var n,i=this.prototype.standardPropMap;for(n in i)null!=t[n]&&!0===i[n]&&(e[n]=t[n])},e.prototype.applyProps=function(t){var e,n=this.standardPropMap,i={},r={};for(e in t)!0===n[e]?this[e]=t[e]:!1===n[e]?i[e]=t[e]:r[e]=t[e];return this.applyMiscProps(r),this.applyManualStandardProps(i)},e.prototype.applyManualStandardProps=function(t){return!0},e.prototype.applyMiscProps=function(t){},e.prototype.isStandardProp=function(t){return t in this.standardPropMap},e}(o.default);e.default=s,s.prototype.standardPropMap={}},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e){this.def=t,this.dateProfile=e}return t.prototype.toLegacy=function(){var t=this.dateProfile,e=this.def.toLegacy();return e.start=t.start.clone(),e.end=t.end?t.end.clone():null,e},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(0),s=n(34),a=n(209),l=n(17),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.isAllDay=function(){return!this.startTime&&!this.endTime},e.prototype.buildInstances=function(t){for(var e,n,i,r=this.source.calendar,o=t.getStart(),s=t.getEnd(),u=[];o.isBefore(s);)this.dowHash&&!this.dowHash[o.day()]||(e=r.applyTimezone(o),n=e.clone(),i=null,this.startTime?n.time(this.startTime):n.stripTime(),this.endTime&&(i=e.clone().time(this.endTime)),u.push(new a.default(this,new l.default(n,i,r)))),o.add(1,"days");return u},e.prototype.setDow=function(t){this.dowHash||(this.dowHash={});for(var e=0;e<t.length;e++)this.dowHash[t[e]]=!0},e.prototype.clone=function(){var e=t.prototype.clone.call(this);return e.startTime&&(e.startTime=o.duration(this.startTime)),e.endTime&&(e.endTime=o.duration(this.endTime)),this.dowHash&&(e.dowHash=r.extend({},this.dowHash)),e},e}(s.default);e.default=u,u.prototype.applyProps=function(t){var e=s.default.prototype.applyProps.call(this,t);return t.start&&(this.startTime=o.duration(t.start)),t.end&&(this.endTime=o.duration(t.end)),t.dow&&this.setDow(t.dow),e},u.defineStandardProps({start:!1,end:!1,dow:!1})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t,e,n){this.unzonedRange=t,this.eventDef=e,n&&(this.eventInstance=n)}return t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(35),o=n(18),s=n(210),a=n(6),l={start:"09:00",end:"17:00",dow:[1,2,3,4,5],rendering:"inverse-background"},u=function(){function t(t,e){this.rawComplexDef=t,this.calendar=e}return t.prototype.buildEventInstanceGroup=function(t,e){var n,i=this.buildEventDefs(t);if(i.length)return n=new o.default(r.eventDefsToEventInstances(i,e)),n.explicitEventDef=i[0],n},t.prototype.buildEventDefs=function(t){var e,n=this.rawComplexDef,r=[],o=!1,s=[];for(!0===n?r=[{}]:i.isPlainObject(n)?r=[n]:i.isArray(n)&&(r=n,o=!0),e=0;e<r.length;e++)o&&!r[e].dow||s.push(this.buildEventDef(t,r[e]));return s},t.prototype.buildEventDef=function(t,e){var n=i.extend({},l,e);return t&&(n.start=null,n.end=null),s.default.parse(n,new a.default(this.calendar))},t}();e.default=u},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=o,o.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button",cornerLeft:"fc-corner-left",cornerRight:"fc-corner-right",stateDefault:"fc-state-default",stateActive:"fc-state-active",stateDisabled:"fc-state-disabled",stateHover:"fc-state-hover",stateDown:"fc-state-down",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},o.prototype.baseIconClass="fc-icon",o.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-left-single-arrow",next:"fc-icon-right-single-arrow",prevYear:"fc-icon-left-double-arrow",nextYear:"fc-icon-right-double-arrow"},o.prototype.iconOverrideOption="buttonIcons",o.prototype.iconOverrideCustomButtonOption="icon",o.prototype.iconOverridePrefix="fc-icon-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=o,o.prototype.classes={widget:"ui-widget",widgetHeader:"ui-widget-header",widgetContent:"ui-widget-content",buttonGroup:"fc-button-group",button:"ui-button",cornerLeft:"ui-corner-left",cornerRight:"ui-corner-right",stateDefault:"ui-state-default",stateActive:"ui-state-active",stateDisabled:"ui-state-disabled",stateHover:"ui-state-hover",stateDown:"ui-state-down",today:"ui-state-highlight",popoverHeader:"ui-widget-header",popoverContent:"ui-widget-content",headerRow:"ui-widget-header",dayRow:"ui-widget-content",listView:"ui-widget-content"},o.prototype.baseIconClass="ui-icon",o.prototype.iconClasses={close:"ui-icon-closethick",prev:"ui-icon-circle-triangle-w",next:"ui-icon-circle-triangle-e",prevYear:"ui-icon-seek-prev",nextYear:"ui-icon-seek-next"},o.prototype.iconOverrideOption="themeButtonIcons",o.prototype.iconOverrideCustomButtonOption="themeIcon",o.prototype.iconOverridePrefix="ui-icon-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(20),s=n(6),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.parse=function(t,e){var n;return r.isFunction(t.events)?n=t:r.isFunction(t)&&(n={events:t}),!!n&&s.default.parse.call(this,n,e)},e.prototype.fetch=function(t,e,n){var i=this;return this.calendar.pushLoading(),o.default.construct(function(r){i.func.call(i.calendar,t.clone(),e.clone(),n,function(t){i.calendar.popLoading(),r(i.parseEventDefs(t))})})},e.prototype.getPrimitive=function(){return this.func},e.prototype.applyManualStandardProps=function(e){var n=t.prototype.applyManualStandardProps.call(this,e);return this.func=e.events,n},e}(s.default);e.default=a,a.defineStandardProps({events:!1})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(20),a=n(6),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.parse=function(t,e){var n;return"string"==typeof t.url?n=t:"string"==typeof t&&(n={url:t}),!!n&&a.default.parse.call(this,n,e)},e.prototype.fetch=function(t,n,i){var a=this,l=this.ajaxSettings,u=l.success,d=l.error,c=this.buildRequestParams(t,n,i);return this.calendar.pushLoading(),s.default.construct(function(t,n){r.ajax(r.extend({},e.AJAX_DEFAULTS,l,{url:a.url,data:c,success:function(e,i,s){var l;a.calendar.popLoading(),e?(l=o.applyAll(u,a,[e,i,s]),r.isArray(l)&&(e=l),t(a.parseEventDefs(e))):n()},error:function(t,e,i){a.calendar.popLoading(),o.applyAll(d,a,[t,e,i]),n()}}))})},e.prototype.buildRequestParams=function(t,e,n){var i,o,s,a,l=this.calendar,u=this.ajaxSettings,d={};return i=this.startParam,null==i&&(i=l.opt("startParam")),o=this.endParam,null==o&&(o=l.opt("endParam")),s=this.timezoneParam,null==s&&(s=l.opt("timezoneParam")),a=r.isFunction(u.data)?u.data():u.data||{},r.extend(d,a),d[i]=t.format(),d[o]=e.format(),n&&"local"!==n&&(d[s]=n),d},e.prototype.getPrimitive=function(){return this.url},e.prototype.applyMiscProps=function(t){this.ajaxSettings=t},e.AJAX_DEFAULTS={dataType:"json",cache:!1},e}(a.default);e.default=l,l.defineStandardProps({url:!0,startParam:!0,endParam:!0,timezoneParam:!0})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(11),r=function(){function t(){this.q=[],this.isPaused=!1,this.isRunning=!1}return t.prototype.queue=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];this.q.push.apply(this.q,t),this.tryStart()},t.prototype.pause=function(){this.isPaused=!0},t.prototype.resume=function(){this.isPaused=!1,this.tryStart()},t.prototype.getIsIdle=function(){return!this.isRunning&&!this.isPaused},t.prototype.tryStart=function(){!this.isRunning&&this.canRunNext()&&(this.isRunning=!0,this.trigger("start"),this.runRemaining())},t.prototype.canRunNext=function(){return!this.isPaused&&this.q.length},t.prototype.runRemaining=function(){var t,e,n=this;do{if(t=this.q.shift(),(e=this.runTask(t))&&e.then)return void e.then(function(){n.canRunNext()&&n.runRemaining()})}while(this.canRunNext());this.trigger("stop"),this.isRunning=!1,this.tryStart()},t.prototype.runTask=function(t){return t()},t}();e.default=r,i.default.mixInto(r)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(217),o=function(t){function e(e){var n=t.call(this)||this;return n.waitsByNamespace=e||{},n}return i.__extends(e,t),e.prototype.queue=function(t,e,n){var i,r={func:t,namespace:e,type:n};e&&(i=this.waitsByNamespace[e]),this.waitNamespace&&(e===this.waitNamespace&&null!=i?this.delayWait(i):(this.clearWait(),this.tryStart())),this.compoundTask(r)&&(this.waitNamespace||null==i?this.tryStart():this.startWait(e,i))},e.prototype.startWait=function(t,e){this.waitNamespace=t,this.spawnWait(e)},e.prototype.delayWait=function(t){clearTimeout(this.waitId),this.spawnWait(t)},e.prototype.spawnWait=function(t){var e=this;this.waitId=setTimeout(function(){e.waitNamespace=null,e.tryStart()},t)},e.prototype.clearWait=function(){this.waitNamespace&&(clearTimeout(this.waitId),this.waitId=null,this.waitNamespace=null)},e.prototype.canRunNext=function(){if(!t.prototype.canRunNext.call(this))return!1;if(this.waitNamespace){for(var e=this.q,n=0;n<e.length;n++)if(e[n].namespace!==this.waitNamespace)return!0;return!1}return!0},e.prototype.runTask=function(t){t.func()},e.prototype.compoundTask=function(t){var e,n,i=this.q,r=!0;if(t.namespace&&"destroy"===t.type)for(e=i.length-1;e>=0;e--)switch(n=i[e],n.type){case"init":r=!1;case"add":case"remove":i.splice(e,1)}return r&&i.push(t),r},e}(r.default);e.default=o},function(t,e,n){function i(t){var e,n,i,r=[];for(e in t)for(n=t[e].eventInstances,i=0;i<n.length;i++)r.push(n[i].toLegacy());return r}Object.defineProperty(e,"__esModule",{value:!0});var r=n(2),o=n(3),s=n(0),a=n(4),l=n(10),u=n(47),d=n(237),c=n(35),p=function(t){function e(n,i){var r=t.call(this)||this;return r.isRTL=!1,r.hitsNeededDepth=0,r.hasAllDayBusinessHours=!1,r.isDatesRendered=!1,n&&(r.view=n),i&&(r.options=i),r.uid=String(e.guid++),r.childrenByUid={},r.nextDayThreshold=s.duration(r.opt("nextDayThreshold")),r.isRTL=r.opt("isRTL"),r.fillRendererClass&&(r.fillRenderer=new r.fillRendererClass(r)),r.eventRendererClass&&(r.eventRenderer=new r.eventRendererClass(r,r.fillRenderer)),r.helperRendererClass&&r.eventRenderer&&(r.helperRenderer=new r.helperRendererClass(r,r.eventRenderer)),r.businessHourRendererClass&&r.fillRenderer&&(r.businessHourRenderer=new r.businessHourRendererClass(r,r.fillRenderer)),r}return r.__extends(e,t),e.prototype.addChild=function(t){return!this.childrenByUid[t.uid]&&(this.childrenByUid[t.uid]=t,!0)},e.prototype.removeChild=function(t){return!!this.childrenByUid[t.uid]&&(delete this.childrenByUid[t.uid],!0)},e.prototype.updateSize=function(t,e,n){this.callChildren("updateSize",arguments)},e.prototype.opt=function(t){return this._getView().opt(t)},e.prototype.publiclyTrigger=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=this._getCalendar();return n.publiclyTrigger.apply(n,t)},e.prototype.hasPublicHandlers=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n=this._getCalendar();return n.hasPublicHandlers.apply(n,t)},e.prototype.executeDateRender=function(t){this.dateProfile=t,this.renderDates(t),this.isDatesRendered=!0,this.callChildren("executeDateRender",arguments)},e.prototype.executeDateUnrender=function(){this.callChildren("executeDateUnrender",arguments),this.dateProfile=null,this.unrenderDates(),this.isDatesRendered=!1},e.prototype.renderDates=function(t){},e.prototype.unrenderDates=function(){},e.prototype.getNowIndicatorUnit=function(){},e.prototype.renderNowIndicator=function(t){this.callChildren("renderNowIndicator",arguments)},e.prototype.unrenderNowIndicator=function(){this.callChildren("unrenderNowIndicator",arguments)},e.prototype.renderBusinessHours=function(t){this.businessHourRenderer&&this.businessHourRenderer.render(t),this.callChildren("renderBusinessHours",arguments)},e.prototype.unrenderBusinessHours=function(){this.callChildren("unrenderBusinessHours",arguments),this.businessHourRenderer&&this.businessHourRenderer.unrender()},e.prototype.executeEventRender=function(t){this.eventRenderer?(this.eventRenderer.rangeUpdated(),this.eventRenderer.render(t)):this.renderEvents&&this.renderEvents(i(t)),this.callChildren("executeEventRender",arguments)},e.prototype.executeEventUnrender=function(){this.callChildren("executeEventUnrender",arguments),this.eventRenderer?this.eventRenderer.unrender():this.destroyEvents&&this.destroyEvents()},e.prototype.getBusinessHourSegs=function(){var t=this.getOwnBusinessHourSegs();return this.iterChildren(function(e){t.push.apply(t,e.getBusinessHourSegs())}),t},e.prototype.getOwnBusinessHourSegs=function(){return this.businessHourRenderer?this.businessHourRenderer.getSegs():[]},e.prototype.getEventSegs=function(){var t=this.getOwnEventSegs();return this.iterChildren(function(e){t.push.apply(t,e.getEventSegs())}),t},e.prototype.getOwnEventSegs=function(){return this.eventRenderer?this.eventRenderer.getSegs():[]},e.prototype.triggerAfterEventsRendered=function(){this.triggerAfterEventSegsRendered(this.getEventSegs()),this.publiclyTrigger("eventAfterAllRender",{context:this,args:[this]})},e.prototype.triggerAfterEventSegsRendered=function(t){var e=this;this.hasPublicHandlers("eventAfterRender")&&t.forEach(function(t){var n;t.el&&(n=t.footprint.getEventLegacy(),e.publiclyTrigger("eventAfterRender",{context:n,args:[n,t.el,e]}))})},e.prototype.triggerBeforeEventsDestroyed=function(){this.triggerBeforeEventSegsDestroyed(this.getEventSegs())},e.prototype.triggerBeforeEventSegsDestroyed=function(t){var e=this;this.hasPublicHandlers("eventDestroy")&&t.forEach(function(t){var n;t.el&&(n=t.footprint.getEventLegacy(),e.publiclyTrigger("eventDestroy",{context:n,args:[n,t.el,e]}))})},e.prototype.showEventsWithId=function(t){this.getEventSegs().forEach(function(e){e.footprint.eventDef.id===t&&e.el&&e.el.css("visibility","")}),this.callChildren("showEventsWithId",arguments)},e.prototype.hideEventsWithId=function(t){this.getEventSegs().forEach(function(e){e.footprint.eventDef.id===t&&e.el&&e.el.css("visibility","hidden")}),this.callChildren("hideEventsWithId",arguments)},e.prototype.renderDrag=function(t,e,n){var i=!1;return this.iterChildren(function(r){r.renderDrag(t,e,n)&&(i=!0)}),i},e.prototype.unrenderDrag=function(){this.callChildren("unrenderDrag",arguments)},e.prototype.renderEventResize=function(t,e,n){this.callChildren("renderEventResize",arguments)},e.prototype.unrenderEventResize=function(){this.callChildren("unrenderEventResize",arguments)},e.prototype.renderSelectionFootprint=function(t){this.renderHighlight(t),this.callChildren("renderSelectionFootprint",arguments)},e.prototype.unrenderSelection=function(){this.unrenderHighlight(),this.callChildren("unrenderSelection",arguments)},e.prototype.renderHighlight=function(t){this.fillRenderer&&this.fillRenderer.renderFootprint("highlight",t,{getClasses:function(){return["fc-highlight"]}}),this.callChildren("renderHighlight",arguments)},e.prototype.unrenderHighlight=function(){this.fillRenderer&&this.fillRenderer.unrender("highlight"),this.callChildren("unrenderHighlight",arguments)},e.prototype.hitsNeeded=function(){this.hitsNeededDepth++||this.prepareHits(),this.callChildren("hitsNeeded",arguments)},e.prototype.hitsNotNeeded=function(){this.hitsNeededDepth&&!--this.hitsNeededDepth&&this.releaseHits(),this.callChildren("hitsNotNeeded",arguments)},e.prototype.prepareHits=function(){},e.prototype.releaseHits=function(){},e.prototype.queryHit=function(t,e){var n,i,r=this.childrenByUid;for(n in r)if(i=r[n].queryHit(t,e))break;return i},e.prototype.getSafeHitFootprint=function(t){var e=this.getHitFootprint(t);return this.dateProfile.activeUnzonedRange.containsRange(e.unzonedRange)?e:null},e.prototype.getHitFootprint=function(t){},e.prototype.getHitEl=function(t){},e.prototype.eventRangesToEventFootprints=function(t){var e,n=[];for(e=0;e<t.length;e++)n.push.apply(n,this.eventRangeToEventFootprints(t[e]));return n},e.prototype.eventRangeToEventFootprints=function(t){return[c.eventRangeToEventFootprint(t)]},e.prototype.eventFootprintsToSegs=function(t){var e,n=[];for(e=0;e<t.length;e++)n.push.apply(n,this.eventFootprintToSegs(t[e]));return n},e.prototype.eventFootprintToSegs=function(t){var e,n,i,r=t.componentFootprint.unzonedRange;for(e=this.componentFootprintToSegs(t.componentFootprint),n=0;n<e.length;n++)i=e[n],r.isStart||(i.isStart=!1),r.isEnd||(i.isEnd=!1),i.footprint=t;return e},e.prototype.componentFootprintToSegs=function(t){return[]},e.prototype.callChildren=function(t,e){this.iterChildren(function(n){n[t].apply(n,e)})},e.prototype.iterChildren=function(t){var e,n=this.childrenByUid;for(e in n)t(n[e])},e.prototype._getCalendar=function(){var t=this;return t.calendar||t.view.calendar},e.prototype._getView=function(){return this.view},e.prototype._getDateProfile=function(){return this._getView().get("dateProfile")},e.prototype.buildGotoAnchorHtml=function(t,e,n){var i,r,s,u;return o.isPlainObject(t)?(i=t.date,r=t.type,s=t.forceOff):i=t,i=l.default(i),u={date:i.format("YYYY-MM-DD"),type:r||"day"},"string"==typeof e&&(n=e,e=null),e=e?" "+a.attrsToStr(e):"",n=n||"",!s&&this.opt("navLinks")?"<a"+e+' data-goto="'+a.htmlEscape(JSON.stringify(u))+'">'+n+"</a>":"<span"+e+">"+n+"</span>"},e.prototype.getAllDayHtml=function(){return this.opt("allDayHtml")||a.htmlEscape(this.opt("allDayText"))},e.prototype.getDayClasses=function(t,e){var n,i=this._getView(),r=[]
-;return this.dateProfile.activeUnzonedRange.containsDate(t)?(r.push("fc-"+a.dayIDs[t.day()]),i.isDateInOtherMonth(t,this.dateProfile)&&r.push("fc-other-month"),n=i.calendar.getNow(),t.isSame(n,"day")?(r.push("fc-today"),!0!==e&&r.push(i.calendar.theme.getClass("today"))):t<n?r.push("fc-past"):r.push("fc-future")):r.push("fc-disabled-day"),r},e.prototype.formatRange=function(t,e,n,i){var r=t.end;return e&&(r=r.clone().subtract(1)),u.formatRange(t.start,r,n,i,this.isRTL)},e.prototype.currentRangeAs=function(t){return this._getDateProfile().currentUnzonedRange.as(t)},e.prototype.computeDayRange=function(t){var e=this._getCalendar(),n=e.msToUtcMoment(t.startMs,!0),i=e.msToUtcMoment(t.endMs),r=+i.time(),o=i.clone().stripTime();return r&&r>=this.nextDayThreshold&&o.add(1,"days"),o<=n&&(o=n.clone().add(1,"days")),{start:n,end:o}},e.prototype.isMultiDayRange=function(t){var e=this.computeDayRange(t);return e.end.diff(e.start,"days")>1},e.guid=0,e}(d.default);e.default=p},function(t,e,n){function i(t,e){return null==e?t:r.isFunction(e)?t.filter(e):(e+="",t.filter(function(t){return t.id==e||t._id===e}))}Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),o=n(0),s=n(4),a=n(32),l=n(238),u=n(21),d=n(11),c=n(7),p=n(239),h=n(240),f=n(241),g=n(207),v=n(31),y=n(10),m=n(5),b=n(12),w=n(17),D=n(242),E=n(212),S=n(38),C=n(49),R=n(13),T=n(37),M=n(6),I=n(51),H=function(){function t(t,e){this.loadingLevel=0,this.ignoreUpdateViewSize=0,this.freezeContentHeightDepth=0,u.default.needed(),this.el=t,this.viewsByType={},this.optionsManager=new h.default(this,e),this.viewSpecManager=new f.default(this.optionsManager,this),this.initMomentInternals(),this.initCurrentDate(),this.initEventManager(),this.constraints=new g.default(this.eventManager,this),this.constructed()}return t.prototype.constructed=function(){},t.prototype.getView=function(){return this.view},t.prototype.publiclyTrigger=function(t,e){var n,i,o=this.opt(t);if(r.isPlainObject(e)?(n=e.context,i=e.args):r.isArray(e)&&(i=e),null==n&&(n=this.el[0]),i||(i=[]),this.triggerWith(t,n,i),o)return o.apply(n,i)},t.prototype.hasPublicHandlers=function(t){return this.hasHandlers(t)||this.opt(t)},t.prototype.option=function(t,e){var n;if("string"==typeof t){if(void 0===e)return this.optionsManager.get(t);n={},n[t]=e,this.optionsManager.add(n)}else"object"==typeof t&&this.optionsManager.add(t)},t.prototype.opt=function(t){return this.optionsManager.get(t)},t.prototype.instantiateView=function(t){var e=this.viewSpecManager.getViewSpec(t);if(!e)throw new Error('View type "'+t+'" is not valid');return new e.class(this,e)},t.prototype.isValidViewType=function(t){return Boolean(this.viewSpecManager.getViewSpec(t))},t.prototype.changeView=function(t,e){e&&(e.start&&e.end?this.optionsManager.recordOverrides({visibleRange:e}):this.currentDate=this.moment(e).stripZone()),this.renderView(t)},t.prototype.zoomTo=function(t,e){var n;e=e||"day",n=this.viewSpecManager.getViewSpec(e)||this.viewSpecManager.getUnitViewSpec(e),this.currentDate=t.clone(),this.renderView(n?n.type:null)},t.prototype.initCurrentDate=function(){var t=this.opt("defaultDate");this.currentDate=null!=t?this.moment(t).stripZone():this.getNow()},t.prototype.prev=function(){var t=this.view,e=t.dateProfileGenerator.buildPrev(t.get("dateProfile"));e.isValid&&(this.currentDate=e.date,this.renderView())},t.prototype.next=function(){var t=this.view,e=t.dateProfileGenerator.buildNext(t.get("dateProfile"));e.isValid&&(this.currentDate=e.date,this.renderView())},t.prototype.prevYear=function(){this.currentDate.add(-1,"years"),this.renderView()},t.prototype.nextYear=function(){this.currentDate.add(1,"years"),this.renderView()},t.prototype.today=function(){this.currentDate=this.getNow(),this.renderView()},t.prototype.gotoDate=function(t){this.currentDate=this.moment(t).stripZone(),this.renderView()},t.prototype.incrementDate=function(t){this.currentDate.add(o.duration(t)),this.renderView()},t.prototype.getDate=function(){return this.applyTimezone(this.currentDate)},t.prototype.pushLoading=function(){this.loadingLevel++||this.publiclyTrigger("loading",[!0,this.view])},t.prototype.popLoading=function(){--this.loadingLevel||this.publiclyTrigger("loading",[!1,this.view])},t.prototype.render=function(){this.contentEl?this.elementVisible()&&(this.calcSize(),this.updateViewSize()):this.initialRender()},t.prototype.initialRender=function(){var t=this,e=this.el;e.addClass("fc"),e.on("click.fc","a[data-goto]",function(e){var n=r(e.currentTarget),i=n.data("goto"),o=t.moment(i.date),a=i.type,l=t.view.opt("navLink"+s.capitaliseFirstLetter(a)+"Click");"function"==typeof l?l(o,e):("string"==typeof l&&(a=l),t.zoomTo(o,a))}),this.optionsManager.watch("settingTheme",["?theme","?themeSystem"],function(n){var i=I.getThemeSystemClass(n.themeSystem||n.theme),r=new i(t.optionsManager),o=r.getClass("widget");t.theme=r,o&&e.addClass(o)},function(){var n=t.theme.getClass("widget");t.theme=null,n&&e.removeClass(n)}),this.optionsManager.watch("settingBusinessHourGenerator",["?businessHours"],function(e){t.businessHourGenerator=new E.default(e.businessHours,t),t.view&&t.view.set("businessHourGenerator",t.businessHourGenerator)},function(){t.businessHourGenerator=null}),this.optionsManager.watch("applyingDirClasses",["?isRTL","?locale"],function(t){e.toggleClass("fc-ltr",!t.isRTL),e.toggleClass("fc-rtl",t.isRTL)}),this.contentEl=r("<div class='fc-view-container'/>").prependTo(e),this.initToolbars(),this.renderHeader(),this.renderFooter(),this.renderView(this.opt("defaultView")),this.opt("handleWindowResize")&&r(window).resize(this.windowResizeProxy=s.debounce(this.windowResize.bind(this),this.opt("windowResizeDelay")))},t.prototype.destroy=function(){this.view&&this.clearView(),this.toolbarsManager.proxyCall("removeElement"),this.contentEl.remove(),this.el.removeClass("fc fc-ltr fc-rtl"),this.optionsManager.unwatch("settingTheme"),this.optionsManager.unwatch("settingBusinessHourGenerator"),this.el.off(".fc"),this.windowResizeProxy&&(r(window).unbind("resize",this.windowResizeProxy),this.windowResizeProxy=null),u.default.unneeded()},t.prototype.elementVisible=function(){return this.el.is(":visible")},t.prototype.bindViewHandlers=function(t){var e=this;t.watch("titleForCalendar",["title"],function(n){t===e.view&&e.setToolbarsTitle(n.title)}),t.watch("dateProfileForCalendar",["dateProfile"],function(n){t===e.view&&(e.currentDate=n.dateProfile.date,e.updateToolbarButtons(n.dateProfile))})},t.prototype.unbindViewHandlers=function(t){t.unwatch("titleForCalendar"),t.unwatch("dateProfileForCalendar")},t.prototype.renderView=function(t){var e,n=this.view;this.freezeContentHeight(),n&&t&&n.type!==t&&this.clearView(),!this.view&&t&&(e=this.view=this.viewsByType[t]||(this.viewsByType[t]=this.instantiateView(t)),this.bindViewHandlers(e),e.startBatchRender(),e.setElement(r("<div class='fc-view fc-"+t+"-view' />").appendTo(this.contentEl)),this.toolbarsManager.proxyCall("activateButton",t)),this.view&&(this.view.get("businessHourGenerator")!==this.businessHourGenerator&&this.view.set("businessHourGenerator",this.businessHourGenerator),this.view.setDate(this.currentDate),e&&e.stopBatchRender()),this.thawContentHeight()},t.prototype.clearView=function(){var t=this.view;this.toolbarsManager.proxyCall("deactivateButton",t.type),this.unbindViewHandlers(t),t.removeElement(),t.unsetDate(),this.view=null},t.prototype.reinitView=function(){var t=this.view,e=t.queryScroll();this.freezeContentHeight(),this.clearView(),this.calcSize(),this.renderView(t.type),this.view.applyScroll(e),this.thawContentHeight()},t.prototype.getSuggestedViewHeight=function(){return null==this.suggestedViewHeight&&this.calcSize(),this.suggestedViewHeight},t.prototype.isHeightAuto=function(){return"auto"===this.opt("contentHeight")||"auto"===this.opt("height")},t.prototype.updateViewSize=function(t){void 0===t&&(t=!1);var e,n=this.view;if(!this.ignoreUpdateViewSize&&n)return t&&(this.calcSize(),e=n.queryScroll()),this.ignoreUpdateViewSize++,n.updateSize(this.getSuggestedViewHeight(),this.isHeightAuto(),t),this.ignoreUpdateViewSize--,t&&n.applyScroll(e),!0},t.prototype.calcSize=function(){this.elementVisible()&&this._calcSize()},t.prototype._calcSize=function(){var t=this.opt("contentHeight"),e=this.opt("height");this.suggestedViewHeight="number"==typeof t?t:"function"==typeof t?t():"number"==typeof e?e-this.queryToolbarsHeight():"function"==typeof e?e()-this.queryToolbarsHeight():"parent"===e?this.el.parent().height()-this.queryToolbarsHeight():Math.round(this.contentEl.width()/Math.max(this.opt("aspectRatio"),.5))},t.prototype.windowResize=function(t){t.target===window&&this.view&&this.view.isDatesRendered&&this.updateViewSize(!0)&&this.publiclyTrigger("windowResize",[this.view])},t.prototype.freezeContentHeight=function(){this.freezeContentHeightDepth++||this.forceFreezeContentHeight()},t.prototype.forceFreezeContentHeight=function(){this.contentEl.css({width:"100%",height:this.contentEl.height(),overflow:"hidden"})},t.prototype.thawContentHeight=function(){this.freezeContentHeightDepth--,this.contentEl.css({width:"",height:"",overflow:""}),this.freezeContentHeightDepth&&this.forceFreezeContentHeight()},t.prototype.initToolbars=function(){this.header=new p.default(this,this.computeHeaderOptions()),this.footer=new p.default(this,this.computeFooterOptions()),this.toolbarsManager=new l.default([this.header,this.footer])},t.prototype.computeHeaderOptions=function(){return{extraClasses:"fc-header-toolbar",layout:this.opt("header")}},t.prototype.computeFooterOptions=function(){return{extraClasses:"fc-footer-toolbar",layout:this.opt("footer")}},t.prototype.renderHeader=function(){var t=this.header;t.setToolbarOptions(this.computeHeaderOptions()),t.render(),t.el&&this.el.prepend(t.el)},t.prototype.renderFooter=function(){var t=this.footer;t.setToolbarOptions(this.computeFooterOptions()),t.render(),t.el&&this.el.append(t.el)},t.prototype.setToolbarsTitle=function(t){this.toolbarsManager.proxyCall("updateTitle",t)},t.prototype.updateToolbarButtons=function(t){var e=this.getNow(),n=this.view,i=n.dateProfileGenerator.build(e),r=n.dateProfileGenerator.buildPrev(n.get("dateProfile")),o=n.dateProfileGenerator.buildNext(n.get("dateProfile"));this.toolbarsManager.proxyCall(i.isValid&&!t.currentUnzonedRange.containsDate(e)?"enableButton":"disableButton","today"),this.toolbarsManager.proxyCall(r.isValid?"enableButton":"disableButton","prev"),this.toolbarsManager.proxyCall(o.isValid?"enableButton":"disableButton","next")},t.prototype.queryToolbarsHeight=function(){return this.toolbarsManager.items.reduce(function(t,e){return t+(e.el?e.el.outerHeight(!0):0)},0)},t.prototype.select=function(t,e){this.view.select(this.buildSelectFootprint.apply(this,arguments))},t.prototype.unselect=function(){this.view&&this.view.unselect()},t.prototype.buildSelectFootprint=function(t,e){var n,i=this.moment(t).stripZone();return n=e?this.moment(e).stripZone():i.hasTime()?i.clone().add(this.defaultTimedEventDuration):i.clone().add(this.defaultAllDayEventDuration),new b.default(new m.default(i,n),!i.hasTime())},t.prototype.initMomentInternals=function(){var t=this;this.defaultAllDayEventDuration=o.duration(this.opt("defaultAllDayEventDuration")),this.defaultTimedEventDuration=o.duration(this.opt("defaultTimedEventDuration")),this.optionsManager.watch("buildingMomentLocale",["?locale","?monthNames","?monthNamesShort","?dayNames","?dayNamesShort","?firstDay","?weekNumberCalculation"],function(e){var n,i=e.weekNumberCalculation,r=e.firstDay;"iso"===i&&(i="ISO");var o=Object.create(v.getMomentLocaleData(e.locale));e.monthNames&&(o._months=e.monthNames),e.monthNamesShort&&(o._monthsShort=e.monthNamesShort),e.dayNames&&(o._weekdays=e.dayNames),e.dayNamesShort&&(o._weekdaysShort=e.dayNamesShort),null==r&&"ISO"===i&&(r=1),null!=r&&(n=Object.create(o._week),n.dow=r,o._week=n),"ISO"!==i&&"local"!==i&&"function"!=typeof i||(o._fullCalendar_weekCalc=i),t.localeData=o,t.currentDate&&t.localizeMoment(t.currentDate)})},t.prototype.moment=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];var n;return"local"===this.opt("timezone")?(n=y.default.apply(null,t),n.hasTime()&&n.local()):n="UTC"===this.opt("timezone")?y.default.utc.apply(null,t):y.default.parseZone.apply(null,t),this.localizeMoment(n),n},t.prototype.msToMoment=function(t,e){var n=y.default.utc(t);return e?n.stripTime():n=this.applyTimezone(n),this.localizeMoment(n),n},t.prototype.msToUtcMoment=function(t,e){var n=y.default.utc(t);return e&&n.stripTime(),this.localizeMoment(n),n},t.prototype.localizeMoment=function(t){t._locale=this.localeData},t.prototype.getIsAmbigTimezone=function(){return"local"!==this.opt("timezone")&&"UTC"!==this.opt("timezone")},t.prototype.applyTimezone=function(t){if(!t.hasTime())return t.clone();var e,n=this.moment(t.toArray()),i=t.time().asMilliseconds()-n.time().asMilliseconds();return i&&(e=n.clone().add(i),t.time().asMilliseconds()-e.time().asMilliseconds()==0&&(n=e)),n},t.prototype.footprintToDateProfile=function(t,e){void 0===e&&(e=!1);var n,i=y.default.utc(t.unzonedRange.startMs);return e||(n=y.default.utc(t.unzonedRange.endMs)),t.isAllDay?(i.stripTime(),n&&n.stripTime()):(i=this.applyTimezone(i),n&&(n=this.applyTimezone(n))),new w.default(i,n,this)},t.prototype.getNow=function(){var t=this.opt("now");return"function"==typeof t&&(t=t()),this.moment(t).stripZone()},t.prototype.humanizeDuration=function(t){return t.locale(this.opt("locale")).humanize()},t.prototype.parseUnzonedRange=function(t){var e=null,n=null;return t.start&&(e=this.moment(t.start).stripZone()),t.end&&(n=this.moment(t.end).stripZone()),e||n?e&&n&&n.isBefore(e)?null:new m.default(e,n):null},t.prototype.initEventManager=function(){var t=this,e=new D.default(this),n=this.opt("eventSources")||[],i=this.opt("events");this.eventManager=e,i&&n.unshift(i),e.on("release",function(e){t.trigger("eventsReset",e)}),e.freeze(),n.forEach(function(n){var i=S.default.parse(n,t);i&&e.addSource(i)}),e.thaw()},t.prototype.requestEvents=function(t,e){return this.eventManager.requestEvents(t,e,this.opt("timezone"),!this.opt("lazyFetching"))},t.prototype.getEventEnd=function(t){return t.end?t.end.clone():this.getDefaultEventEnd(t.allDay,t.start)},t.prototype.getDefaultEventEnd=function(t,e){var n=e.clone();return t?n.stripTime().add(this.defaultAllDayEventDuration):n.add(this.defaultTimedEventDuration),this.getIsAmbigTimezone()&&n.stripZone(),n},t.prototype.rerenderEvents=function(){this.view.flash("displayingEvents")},t.prototype.refetchEvents=function(){this.eventManager.refetchAllSources()},t.prototype.renderEvents=function(t,e){this.eventManager.freeze();for(var n=0;n<t.length;n++)this.renderEvent(t[n],e);this.eventManager.thaw()},t.prototype.renderEvent=function(t,e){void 0===e&&(e=!1);var n=this.eventManager,i=C.default.parse(t,t.source||n.stickySource);i&&n.addEventDef(i,e)},t.prototype.removeEvents=function(t){var e,n,r=this.eventManager,o=[],s={};if(null==t)r.removeAllEventDefs();else{for(r.getEventInstances().forEach(function(t){o.push(t.toLegacy())}),o=i(o,t),n=0;n<o.length;n++)e=this.eventManager.getEventDefByUid(o[n]._id),s[e.id]=!0;r.freeze();for(n in s)r.removeEventDefsById(n);r.thaw()}},t.prototype.clientEvents=function(t){var e=[];return this.eventManager.getEventInstances().forEach(function(t){e.push(t.toLegacy())}),i(e,t)},t.prototype.updateEvents=function(t){this.eventManager.freeze();for(var e=0;e<t.length;e++)this.updateEvent(t[e]);this.eventManager.thaw()},t.prototype.updateEvent=function(t){var e,n,i=this.eventManager.getEventDefByUid(t._id);i instanceof R.default&&(e=i.buildInstance(),n=T.default.createFromRawProps(e,t,null),this.eventManager.mutateEventsWithId(i.id,n))},t.prototype.getEventSources=function(){return this.eventManager.otherSources.slice()},t.prototype.getEventSourceById=function(t){return this.eventManager.getSourceById(M.default.normalizeId(t))},t.prototype.addEventSource=function(t){var e=S.default.parse(t,this);e&&this.eventManager.addSource(e)},t.prototype.removeEventSources=function(t){var e,n,i=this.eventManager;if(null==t)this.eventManager.removeAllSources();else{for(e=i.multiQuerySources(t),i.freeze(),n=0;n<e.length;n++)i.removeSource(e[n]);i.thaw()}},t.prototype.removeEventSource=function(t){var e,n=this.eventManager,i=n.querySources(t);for(n.freeze(),e=0;e<i.length;e++)n.removeSource(i[e]);n.thaw()},t.prototype.refetchEventSources=function(t){var e,n=this.eventManager,i=n.multiQuerySources(t);for(n.freeze(),e=0;e<i.length;e++)n.refetchSource(i[e]);n.thaw()},t.defaults=a.globalDefaults,t.englishDefaults=a.englishDefaults,t.rtlDefaults=a.rtlDefaults,t}();e.default=H,d.default.mixInto(H),c.default.mixInto(H)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(0),r=n(4),o=n(5),s=function(){function t(t){this._view=t}return t.prototype.opt=function(t){return this._view.opt(t)},t.prototype.trimHiddenDays=function(t){return this._view.trimHiddenDays(t)},t.prototype.msToUtcMoment=function(t,e){return this._view.calendar.msToUtcMoment(t,e)},t.prototype.buildPrev=function(t){var e=t.date.clone().startOf(t.currentRangeUnit).subtract(t.dateIncrement);return this.build(e,-1)},t.prototype.buildNext=function(t){var e=t.date.clone().startOf(t.currentRangeUnit).add(t.dateIncrement);return this.build(e,1)},t.prototype.build=function(t,e,n){void 0===n&&(n=!1);var r,o,s,a,l,u,d=!t.hasTime(),c=null,p=null;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(t=this.msToUtcMoment(r.constrainDate(t),d)),o=this.buildCurrentRangeInfo(t,e),s=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.unzonedRange),o.unit,s),a=this.trimHiddenDays(a),l=a.clone(),this.opt("showNonCurrentDates")||(l=l.intersect(o.unzonedRange)),c=i.duration(this.opt("minTime")),p=i.duration(this.opt("maxTime")),l=this.adjustActiveRange(l,c,p),l=l.intersect(r),l&&(t=this.msToUtcMoment(l.constrainDate(t),d)),u=o.unzonedRange.intersectsWith(r),{validUnzonedRange:r,currentUnzonedRange:o.unzonedRange,currentRangeUnit:o.unit,isRangeAllDay:s,activeUnzonedRange:l,renderUnzonedRange:a,minTime:c,maxTime:p,isValid:u,date:t,dateIncrement:this.buildDateIncrement(o.duration)}},t.prototype.buildValidRange=function(){return this._view.getUnzonedRangeOption("validRange",this._view.calendar.getNow())||new o.default},t.prototype.buildCurrentRangeInfo=function(t,e){var n,i=this._view.viewSpec,o=null,s=null,a=null;return i.duration?(o=i.duration,s=i.durationUnit,a=this.buildRangeFromDuration(t,e,o,s)):(n=this.opt("dayCount"))?(s="day",a=this.buildRangeFromDayCount(t,e,n)):(a=this.buildCustomVisibleRange(t))?s=r.computeGreatestUnit(a.getStart(),a.getEnd()):(o=this.getFallbackDuration(),s=r.computeGreatestUnit(o),a=this.buildRangeFromDuration(t,e,o,s)),{duration:o,unit:s,unzonedRange:a}},t.prototype.getFallbackDuration=function(){return i.duration({days:1})},t.prototype.adjustActiveRange=function(t,e,n){var i=t.getStart(),r=t.getEnd();return this._view.usesMinMaxTime&&(e<0&&i.time(0).add(e),n>864e5&&r.time(n-864e5)),new o.default(i,r)},t.prototype.buildRangeFromDuration=function(t,e,n,s){function a(){d=t.clone().startOf(h),c=d.clone().add(n),p=new o.default(d,c)}var l,u,d,c,p,h=this.opt("dateAlignment");return h||(l=this.opt("dateIncrement"),l?(u=i.duration(l),h=u<n?r.computeDurationGreatestUnit(u,l):s):h=s),n.as("days")<=1&&this._view.isHiddenDay(d)&&(d=this._view.skipHiddenDays(d,e),d.startOf("day")),a(),this.trimHiddenDays(p)||(t=this._view.skipHiddenDays(t,e),a()),p},t.prototype.buildRangeFromDayCount=function(t,e,n){var i,r=this.opt("dateAlignment"),s=0,a=t.clone();r&&a.startOf(r),a.startOf("day"),a=this._view.skipHiddenDays(a,e),i=a.clone();do{i.add(1,"day"),this._view.isHiddenDay(i)||s++}while(s<n);return new o.default(a,i)},t.prototype.buildCustomVisibleRange=function(t){var e=this._view.getUnzonedRangeOption("visibleRange",this._view.calendar.applyTimezone(t));return!e||null!=e.startMs&&null!=e.endMs?e:null},t.prototype.buildRenderRange=function(t,e,n){return t.clone()},t.prototype.buildDateIncrement=function(t){var e,n=this.opt("dateIncrement");return n?i.duration(n):(e=this.opt("dateAlignment"))?i.duration(1,e):t||i.duration({days:1})},t}();e.default=s},function(t,e,n){function i(t){var e,n,i,r,l=a.dataAttrPrefix;return l&&(l+="-"),e=t.data(l+"event")||null,e&&(e="object"==typeof e?o.extend({},e):{},n=e.start,null==n&&(n=e.time),i=e.duration,r=e.stick,delete e.start,delete e.time,delete e.duration,delete e.stick),null==n&&(n=t.data(l+"start")),null==n&&(n=t.data(l+"time")),null==i&&(i=t.data(l+"duration")),null==r&&(r=t.data(l+"stick")),n=null!=n?s.duration(n):null,i=null!=i?s.duration(i):null,r=Boolean(r),{eventProps:e,startTime:n,duration:i,stick:r}}Object.defineProperty(e,"__esModule",{value:!0});var r=n(2),o=n(3),s=n(0),a=n(16),l=n(4),u=n(10),d=n(7),c=n(23),p=n(13),h=n(18),f=n(6),g=n(15),v=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.isDragging=!1,e}return r.__extends(e,t),e.prototype.end=function(){this.dragListener&&this.dragListener.endInteraction()},e.prototype.bindToDocument=function(){this.listenTo(o(document),{dragstart:this.handleDragStart,sortstart:this.handleDragStart})},e.prototype.unbindFromDocument=function(){this.stopListeningTo(o(document))},e.prototype.handleDragStart=function(t,e){var n,i;this.opt("droppable")&&(n=o((e?e.item:null)||t.target),i=this.opt("dropAccept"),(o.isFunction(i)?i.call(n[0],n):n.is(i))&&(this.isDragging||this.listenToExternalDrag(n,t,e)))},e.prototype.listenToExternalDrag=function(t,e,n){var r,o=this,s=this.component,a=this.view,u=i(t);(this.dragListener=new c.default(s,{interactionStart:function(){o.isDragging=!0},hitOver:function(t){var e,n=!0,i=t.component.getSafeHitFootprint(t);i?(r=o.computeExternalDrop(i,u),r?(e=new h.default(r.buildInstances()),n=u.eventProps?s.isEventInstanceGroupAllowed(e):s.isExternalInstanceGroupAllowed(e)):n=!1):n=!1,n||(r=null,l.disableCursor()),r&&s.renderDrag(s.eventRangesToEventFootprints(e.sliceRenderRanges(s.dateProfile.renderUnzonedRange,a.calendar)))},hitOut:function(){r=null},hitDone:function(){l.enableCursor(),s.unrenderDrag()},interactionEnd:function(e){r&&a.reportExternalDrop(r,Boolean(u.eventProps),Boolean(u.stick),t,e,n),o.isDragging=!1,o.dragListener=null}})).startDrag(e)},e.prototype.computeExternalDrop=function(t,e){var n,i=this.view.calendar,r=u.default.utc(t.unzonedRange.startMs).stripZone();return t.isAllDay&&(e.startTime?r.time(e.startTime):r.stripTime()),e.duration&&(n=r.clone().add(e.duration)),r=i.applyTimezone(r),n&&(n=i.applyTimezone(n)),p.default.parse(o.extend({},e.eventProps,{start:r,end:n}),new f.default(i))},e}(g.default);e.default=v,d.default.mixInto(v),a.dataAttrPrefix=""},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(37),a=n(50),l=n(23),u=n(15),d=function(t){function e(e,n){var i=t.call(this,e)||this;return i.isResizing=!1,i.eventPointing=n,i}return i.__extends(e,t),e.prototype.end=function(){this.dragListener&&this.dragListener.endInteraction()},e.prototype.bindToEl=function(t){var e=this.component;e.bindSegHandlerToEl(t,"mousedown",this.handleMouseDown.bind(this)),e.bindSegHandlerToEl(t,"touchstart",this.handleTouchStart.bind(this))},e.prototype.handleMouseDown=function(t,e){this.component.canStartResize(t,e)&&this.buildDragListener(t,r(e.target).is(".fc-start-resizer")).startInteraction(e,{distance:5})},e.prototype.handleTouchStart=function(t,e){this.component.canStartResize(t,e)&&this.buildDragListener(t,r(e.target).is(".fc-start-resizer")).startInteraction(e)},e.prototype.buildDragListener=function(t,e){var n,i,r=this,s=this.component,a=this.view,u=a.calendar,d=u.eventManager,c=t.el,p=t.footprint.eventDef,h=t.footprint.eventInstance;return this.dragListener=new l.default(s,{scroll:this.opt("dragScroll"),subjectEl:c,interactionStart:function(){n=!1},dragStart:function(e){n=!0,r.eventPointing.handleMouseout(t,e),r.segResizeStart(t,e)},hitOver:function(n,l,c){var h,f=!0,g=s.getSafeHitFootprint(c),v=s.getSafeHitFootprint(n);g&&v?(i=e?r.computeEventStartResizeMutation(g,v,t.footprint):r.computeEventEndResizeMutation(g,v,t.footprint),i?(h=d.buildMutatedEventInstanceGroup(p.id,i),f=s.isEventInstanceGroupAllowed(h)):f=!1):f=!1,f?i.isEmpty()&&(i=null):(i=null,o.disableCursor()),i&&(a.hideEventsWithId(t.footprint.eventDef.id),a.renderEventResize(s.eventRangesToEventFootprints(h.sliceRenderRanges(s.dateProfile.renderUnzonedRange,u)),t))},hitOut:function(){i=null},hitDone:function(){a.unrenderEventResize(t),a.showEventsWithId(t.footprint.eventDef.id),o.enableCursor()},interactionEnd:function(e){n&&r.segResizeStop(t,e),i&&a.reportEventResize(h,i,c,e),r.dragListener=null}})},e.prototype.segResizeStart=function(t,e){this.isResizing=!0,this.component.publiclyTrigger("eventResizeStart",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.segResizeStop=function(t,e){this.isResizing=!1,this.component.publiclyTrigger("eventResizeStop",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.computeEventStartResizeMutation=function(t,e,n){var i,r,o=n.componentFootprint.unzonedRange,l=this.component.diffDates(e.unzonedRange.getStart(),t.unzonedRange.getStart());return o.getStart().add(l)<o.getEnd()&&(i=new a.default,i.setStartDelta(l),r=new s.default,r.setDateMutation(i),r)},e.prototype.computeEventEndResizeMutation=function(t,e,n){var i,r,o=n.componentFootprint.unzonedRange,l=this.component.diffDates(e.unzonedRange.getEnd(),t.unzonedRange.getEnd());return o.getEnd().add(l)>o.getStart()&&(i=new a.default,i.setEndDelta(l),r=new s.default,r.setDateMutation(i),r)},e}(u.default);e.default=d},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),o=n(37),s=n(50),a=n(54),l=n(23),u=n(244),d=n(15),c=function(t){function e(e,n){var i=t.call(this,e)||this;return i.isDragging=!1,i.eventPointing=n,i}return i.__extends(e,t),e.prototype.end=function(){this.dragListener&&this.dragListener.endInteraction()},e.prototype.getSelectionDelay=function(){var t=this.opt("eventLongPressDelay");return null==t&&(t=this.opt("longPressDelay")),t},e.prototype.bindToEl=function(t){var e=this.component;e.bindSegHandlerToEl(t,"mousedown",this.handleMousedown.bind(this)),e.bindSegHandlerToEl(t,"touchstart",this.handleTouchStart.bind(this))},e.prototype.handleMousedown=function(t,e){!this.component.shouldIgnoreMouse()&&this.component.canStartDrag(t,e)&&this.buildDragListener(t).startInteraction(e,{distance:5})},e.prototype.handleTouchStart=function(t,e){var n=this.component,i={delay:this.view.isEventDefSelected(t.footprint.eventDef)?0:this.getSelectionDelay()};n.canStartDrag(t,e)?this.buildDragListener(t).startInteraction(e,i):n.canStartSelection(t,e)&&this.buildSelectListener(t).startInteraction(e,i)},e.prototype.buildSelectListener=function(t){var e=this,n=this.view,i=t.footprint.eventDef,r=t.footprint.eventInstance;if(this.dragListener)return this.dragListener;var o=this.dragListener=new a.default({dragStart:function(t){o.isTouch&&!n.isEventDefSelected(i)&&r&&n.selectEventInstance(r)},interactionEnd:function(t){e.dragListener=null}});return o},e.prototype.buildDragListener=function(t){var e,n,i,o=this,s=this.component,a=this.view,d=a.calendar,c=d.eventManager,p=t.el,h=t.footprint.eventDef,f=t.footprint.eventInstance;if(this.dragListener)return this.dragListener;var g=this.dragListener=new l.default(a,{scroll:this.opt("dragScroll"),subjectEl:p,subjectCenter:!0,interactionStart:function(i){t.component=s,e=!1,n=new u.default(t.el,{additionalClass:"fc-dragging",parentEl:a.el,opacity:g.isTouch?null:o.opt("dragOpacity"),revertDuration:o.opt("dragRevertDuration"),zIndex:2}),n.hide(),n.start(i)},dragStart:function(n){g.isTouch&&!a.isEventDefSelected(h)&&f&&a.selectEventInstance(f),e=!0,o.eventPointing.handleMouseout(t,n),o.segDragStart(t,n),a.hideEventsWithId(t.footprint.eventDef.id)},hitOver:function(e,l,u){var p,f,v,y=!0;t.hit&&(u=t.hit),p=u.component.getSafeHitFootprint(u),f=e.component.getSafeHitFootprint(e),p&&f?(i=o.computeEventDropMutation(p,f,h),i?(v=c.buildMutatedEventInstanceGroup(h.id,i),y=s.isEventInstanceGroupAllowed(v)):y=!1):y=!1,y||(i=null,r.disableCursor()),i&&a.renderDrag(s.eventRangesToEventFootprints(v.sliceRenderRanges(s.dateProfile.renderUnzonedRange,d)),t,g.isTouch)?n.hide():n.show(),l&&(i=null)},hitOut:function(){a.unrenderDrag(t),n.show(),i=null},hitDone:function(){r.enableCursor()},interactionEnd:function(r){delete t.component,n.stop(!i,function(){e&&(a.unrenderDrag(t),o.segDragStop(t,r)),a.showEventsWithId(t.footprint.eventDef.id),i&&a.reportEventDrop(f,i,p,r)}),o.dragListener=null}});return g},e.prototype.segDragStart=function(t,e){this.isDragging=!0,this.component.publiclyTrigger("eventDragStart",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.segDragStop=function(t,e){this.isDragging=!1,this.component.publiclyTrigger("eventDragStop",{context:t.el[0],args:[t.footprint.getEventLegacy(),e,{},this.view]})},e.prototype.computeEventDropMutation=function(t,e,n){var i=new o.default;return i.setDateMutation(this.computeEventDateMutation(t,e)),i},e.prototype.computeEventDateMutation=function(t,e){var n,i,r=t.unzonedRange.getStart(),o=e.unzonedRange.getStart(),a=!1,l=!1,u=!1;return t.isAllDay!==e.isAllDay&&(a=!0,e.isAllDay?(u=!0,r.stripTime()):l=!0),n=this.component.diffDates(o,r),i=new s.default,i.clearEnd=a,i.forceTimed=l,i.forceAllDay=u,i.setDateDelta(n),i},e}(d.default);e.default=c},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),o=n(23),s=n(12),a=n(5),l=n(15),u=function(t){function e(e){var n=t.call(this,e)||this;return n.dragListener=n.buildDragListener(),n}return i.__extends(e,t),e.prototype.end=function(){this.dragListener.endInteraction()},e.prototype.getDelay=function(){var t=this.opt("selectLongPressDelay");return null==t&&(t=this.opt("longPressDelay")),t},e.prototype.bindToEl=function(t){var e=this,n=this.component,i=this.dragListener;n.bindDateHandlerToEl(t,"mousedown",function(t){e.opt("selectable")&&!n.shouldIgnoreMouse()&&i.startInteraction(t,{distance:e.opt("selectMinDistance")})}),n.bindDateHandlerToEl(t,"touchstart",function(t){e.opt("selectable")&&!n.shouldIgnoreTouch()&&i.startInteraction(t,{delay:e.getDelay()})}),r.preventSelection(t)},e.prototype.buildDragListener=function(){var t,e=this,n=this.component;return new o.default(n,{scroll:this.opt("dragScroll"),interactionStart:function(){t=null},dragStart:function(t){e.view.unselect(t)},hitOver:function(i,o,s){var a,l;s&&(a=n.getSafeHitFootprint(s),l=n.getSafeHitFootprint(i),t=a&&l?e.computeSelection(a,l):null,t?n.renderSelectionFootprint(t):!1===t&&r.disableCursor())},hitOut:function(){t=null,n.unrenderSelection()},hitDone:function(){r.enableCursor()},interactionEnd:function(n,i){!i&&t&&e.view.reportSelection(t,n)}})},e.prototype.computeSelection=function(t,e){var n=this.computeSelectionFootprint(t,e);return!(n&&!this.isSelectionFootprintAllowed(n))&&n},e.prototype.computeSelectionFootprint=function(t,e){var n=[t.unzonedRange.startMs,t.unzonedRange.endMs,e.unzonedRange.startMs,e.unzonedRange.endMs];return n.sort(r.compareNumbers),new s.default(new a.default(n[0],n[3]),t.isAllDay)},e.prototype.isSelectionFootprintAllowed=function(t){return this.component.dateProfile.validUnzonedRange.containsRange(t.unzonedRange)&&this.view.calendar.constraints.isSelectionFootprintAllowed(t)},e}(l.default);e.default=u},function(t,e,n){function i(t){var e,n=[],i=[];for(e=0;e<t.length;e++)t[e].componentFootprint.isAllDay?n.push(t[e]):i.push(t[e]);return{allDay:n,timed:i}}Object.defineProperty(e,"__esModule",{value:!0});var r,o,s=n(2),a=n(0),l=n(3),u=n(4),d=n(39),c=n(41),p=n(227),h=n(61),f=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.usesMinMaxTime=!0,i.timeGrid=i.instantiateTimeGrid(),i.addChild(i.timeGrid),i.opt("allDaySlot")&&(i.dayGrid=i.instantiateDayGrid(),i.addChild(i.dayGrid)),i.scroller=new d.default({overflowX:"hidden",overflowY:"auto"}),i}
-return s.__extends(e,t),e.prototype.instantiateTimeGrid=function(){var t=new this.timeGridClass(this);return u.copyOwnProps(r,t),t},e.prototype.instantiateDayGrid=function(){var t=new this.dayGridClass(this);return u.copyOwnProps(o,t),t},e.prototype.renderSkeleton=function(){var t,e;this.el.addClass("fc-agenda-view").html(this.renderSkeletonHtml()),this.scroller.render(),t=this.scroller.el.addClass("fc-time-grid-container"),e=l('<div class="fc-time-grid" />').appendTo(t),this.el.find(".fc-body > tr > td").append(t),this.timeGrid.headContainerEl=this.el.find(".fc-head-container"),this.timeGrid.setElement(e),this.dayGrid&&(this.dayGrid.setElement(this.el.find(".fc-day-grid")),this.dayGrid.bottomCoordPadding=this.dayGrid.el.next("hr").outerHeight())},e.prototype.unrenderSkeleton=function(){this.timeGrid.removeElement(),this.dayGrid&&this.dayGrid.removeElement(),this.scroller.destroy()},e.prototype.renderSkeletonHtml=function(){var t=this.calendar.theme;return'<table class="'+t.getClass("tableGrid")+'">'+(this.opt("columnHeader")?'<thead class="fc-head"><tr><td class="fc-head-container '+t.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+t.getClass("widgetContent")+'">'+(this.dayGrid?'<div class="fc-day-grid"/><hr class="fc-divider '+t.getClass("widgetHeader")+'"/>':"")+"</td></tr></tbody></table>"},e.prototype.axisStyleAttr=function(){return null!=this.axisWidth?'style="width:'+this.axisWidth+'px"':""},e.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},e.prototype.updateSize=function(e,n,i){var r,o,s;if(t.prototype.updateSize.call(this,e,n,i),this.axisWidth=u.matchCellWidths(this.el.find(".fc-axis")),!this.timeGrid.colEls)return void(n||(o=this.computeScrollerHeight(e),this.scroller.setHeight(o)));var a=this.el.find(".fc-row:not(.fc-scroller *)");this.timeGrid.bottomRuleEl.hide(),this.scroller.clear(),u.uncompensateScroll(a),this.dayGrid&&(this.dayGrid.removeSegPopover(),r=this.opt("eventLimit"),r&&"number"!=typeof r&&(r=5),r&&this.dayGrid.limitRows(r)),n||(o=this.computeScrollerHeight(e),this.scroller.setHeight(o),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(u.compensateScroll(a,s),o=this.computeScrollerHeight(e),this.scroller.setHeight(o)),this.scroller.lockOverflow(s),this.timeGrid.getTotalSlatHeight()<o&&this.timeGrid.bottomRuleEl.show())},e.prototype.computeScrollerHeight=function(t){return t-u.subtractInnerElHeight(this.el,this.scroller.el)},e.prototype.computeInitialDateScroll=function(){var t=a.duration(this.opt("scrollTime")),e=this.timeGrid.computeTimeTop(t);return e=Math.ceil(e),e&&e++,{top:e}},e.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},e.prototype.applyDateScroll=function(t){void 0!==t.top&&this.scroller.setScrollTop(t.top)},e.prototype.getHitFootprint=function(t){return t.component.getHitFootprint(t)},e.prototype.getHitEl=function(t){return t.component.getHitEl(t)},e.prototype.executeEventRender=function(t){var e,n,i={},r={};for(e in t)n=t[e],n.getEventDef().isAllDay()?i[e]=n:r[e]=n;this.timeGrid.executeEventRender(r),this.dayGrid&&this.dayGrid.executeEventRender(i)},e.prototype.renderDrag=function(t,e,n){var r=i(t),o=!1;return o=this.timeGrid.renderDrag(r.timed,e,n),this.dayGrid&&(o=this.dayGrid.renderDrag(r.allDay,e,n)||o),o},e.prototype.renderEventResize=function(t,e,n){var r=i(t);this.timeGrid.renderEventResize(r.timed,e,n),this.dayGrid&&this.dayGrid.renderEventResize(r.allDay,e,n)},e.prototype.renderSelectionFootprint=function(t){t.isAllDay?this.dayGrid&&this.dayGrid.renderSelectionFootprint(t):this.timeGrid.renderSelectionFootprint(t)},e}(c.default);e.default=f,f.prototype.timeGridClass=p.default,f.prototype.dayGridClass=h.default,r={renderHeadIntroHtml:function(){var t,e=this.view,n=e.calendar,i=n.msToUtcMoment(this.dateProfile.renderUnzonedRange.startMs,!0);return this.opt("weekNumbers")?(t=i.format(this.opt("smallWeekFormat")),'<th class="fc-axis fc-week-number '+n.theme.getClass("widgetHeader")+'" '+e.axisStyleAttr()+">"+e.buildGotoAnchorHtml({date:i,type:"week",forceOff:this.colCnt>1},u.htmlEscape(t))+"</th>"):'<th class="fc-axis '+n.theme.getClass("widgetHeader")+'" '+e.axisStyleAttr()+"></th>"},renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.calendar.theme.getClass("widgetContent")+'" '+t.axisStyleAttr()+"></td>"},renderIntroHtml:function(){return'<td class="fc-axis" '+this.view.axisStyleAttr()+"></td>"}},o={renderBgIntroHtml:function(){var t=this.view;return'<td class="fc-axis '+t.calendar.theme.getClass("widgetContent")+'" '+t.axisStyleAttr()+"><span>"+t.getAllDayHtml()+"</span></td>"},renderIntroHtml:function(){return'<td class="fc-axis" '+this.view.axisStyleAttr()+"></td>"}}},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(0),s=n(4),a=n(40),l=n(56),u=n(60),d=n(55),c=n(53),p=n(5),h=n(12),f=n(246),g=n(247),v=n(248),y=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],m=function(t){function e(e){var n=t.call(this,e)||this;return n.processOptions(),n}return i.__extends(e,t),e.prototype.componentFootprintToSegs=function(t){var e,n=this.sliceRangeByTimes(t.unzonedRange);for(e=0;e<n.length;e++)this.isRTL?n[e].col=this.daysPerRow-1-n[e].dayIndex:n[e].col=n[e].dayIndex;return n},e.prototype.sliceRangeByTimes=function(t){var e,n,i=[];for(n=0;n<this.daysPerRow;n++)(e=t.intersect(this.dayRanges[n]))&&i.push({startMs:e.startMs,endMs:e.endMs,isStart:e.isStart,isEnd:e.isEnd,dayIndex:n});return i},e.prototype.processOptions=function(){var t,e=this.opt("slotDuration"),n=this.opt("snapDuration");e=o.duration(e),n=n?o.duration(n):e,this.slotDuration=e,this.snapDuration=n,this.snapsPerSlot=e/n,t=this.opt("slotLabelFormat"),r.isArray(t)&&(t=t[t.length-1]),this.labelFormat=t||this.opt("smallTimeFormat"),t=this.opt("slotLabelInterval"),this.labelInterval=t?o.duration(t):this.computeLabelInterval(e)},e.prototype.computeLabelInterval=function(t){var e,n,i;for(e=y.length-1;e>=0;e--)if(n=o.duration(y[e]),i=s.divideDurationByDuration(n,t),s.isInt(i)&&i>1)return n;return o.duration(t)},e.prototype.renderDates=function(t){this.dateProfile=t,this.updateDayTable(),this.renderSlats(),this.renderColumns()},e.prototype.unrenderDates=function(){this.unrenderColumns()},e.prototype.renderSkeleton=function(){var t=this.view.calendar.theme;this.el.html('<div class="fc-bg"></div><div class="fc-slats"></div><hr class="fc-divider '+t.getClass("widgetHeader")+'" style="display:none" />'),this.bottomRuleEl=this.el.find("hr")},e.prototype.renderSlats=function(){var t=this.view.calendar.theme;this.slatContainerEl=this.el.find("> .fc-slats").html('<table class="'+t.getClass("tableGrid")+'">'+this.renderSlatRowHtml()+"</table>"),this.slatEls=this.slatContainerEl.find("tr"),this.slatCoordCache=new c.default({els:this.slatEls,isVertical:!0})},e.prototype.renderSlatRowHtml=function(){for(var t,e,n,i=this.view,r=i.calendar,a=r.theme,l=this.isRTL,u=this.dateProfile,d="",c=o.duration(+u.minTime),p=o.duration(0);c<u.maxTime;)t=r.msToUtcMoment(u.renderUnzonedRange.startMs).time(c),e=s.isInt(s.divideDurationByDuration(p,this.labelInterval)),n='<td class="fc-axis fc-time '+a.getClass("widgetContent")+'" '+i.axisStyleAttr()+">"+(e?"<span>"+s.htmlEscape(t.format(this.labelFormat))+"</span>":"")+"</td>",d+='<tr data-time="'+t.format("HH:mm:ss")+'"'+(e?"":' class="fc-minor"')+">"+(l?"":n)+'<td class="'+a.getClass("widgetContent")+'"/>'+(l?n:"")+"</tr>",c.add(this.slotDuration),p.add(this.slotDuration);return d},e.prototype.renderColumns=function(){var t=this.dateProfile,e=this.view.calendar.theme;this.dayRanges=this.dayDates.map(function(e){return new p.default(e.clone().add(t.minTime),e.clone().add(t.maxTime))}),this.headContainerEl&&this.headContainerEl.html(this.renderHeadHtml()),this.el.find("> .fc-bg").html('<table class="'+e.getClass("tableGrid")+'">'+this.renderBgTrHtml(0)+"</table>"),this.colEls=this.el.find(".fc-day, .fc-disabled-day"),this.colCoordCache=new c.default({els:this.colEls,isHorizontal:!0}),this.renderContentSkeleton()},e.prototype.unrenderColumns=function(){this.unrenderContentSkeleton()},e.prototype.renderContentSkeleton=function(){var t,e,n="";for(t=0;t<this.colCnt;t++)n+='<td><div class="fc-content-col"><div class="fc-event-container fc-helper-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>';e=this.contentSkeletonEl=r('<div class="fc-content-skeleton"><table><tr>'+n+"</tr></table></div>"),this.colContainerEls=e.find(".fc-content-col"),this.helperContainerEls=e.find(".fc-helper-container"),this.fgContainerEls=e.find(".fc-event-container:not(.fc-helper-container)"),this.bgContainerEls=e.find(".fc-bgevent-container"),this.highlightContainerEls=e.find(".fc-highlight-container"),this.businessContainerEls=e.find(".fc-business-container"),this.bookendCells(e.find("tr")),this.el.append(e)},e.prototype.unrenderContentSkeleton=function(){this.contentSkeletonEl&&(this.contentSkeletonEl.remove(),this.contentSkeletonEl=null,this.colContainerEls=null,this.helperContainerEls=null,this.fgContainerEls=null,this.bgContainerEls=null,this.highlightContainerEls=null,this.businessContainerEls=null)},e.prototype.groupSegsByCol=function(t){var e,n=[];for(e=0;e<this.colCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].col].push(t[e]);return n},e.prototype.attachSegsByCol=function(t,e){var n,i,r;for(n=0;n<this.colCnt;n++)for(i=t[n],r=0;r<i.length;r++)e.eq(n).append(i[r].el)},e.prototype.getNowIndicatorUnit=function(){return"minute"},e.prototype.renderNowIndicator=function(t){if(this.colContainerEls){var e,n=this.componentFootprintToSegs(new h.default(new p.default(t,t.valueOf()+1),!1)),i=this.computeDateTop(t,t),o=[];for(e=0;e<n.length;e++)o.push(r('<div class="fc-now-indicator fc-now-indicator-line"></div>').css("top",i).appendTo(this.colContainerEls.eq(n[e].col))[0]);n.length>0&&o.push(r('<div class="fc-now-indicator fc-now-indicator-arrow"></div>').css("top",i).appendTo(this.el.find(".fc-content-skeleton"))[0]),this.nowIndicatorEls=r(o)}},e.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.remove(),this.nowIndicatorEls=null)},e.prototype.updateSize=function(e,n,i){t.prototype.updateSize.call(this,e,n,i),this.slatCoordCache.build(),i&&this.updateSegVerticals([].concat(this.eventRenderer.getSegs(),this.businessSegs||[]))},e.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.outerHeight()},e.prototype.computeDateTop=function(t,e){return this.computeTimeTop(o.duration(t-e.clone().stripTime()))},e.prototype.computeTimeTop=function(t){var e,n,i=this.slatEls.length,r=this.dateProfile,o=(t-r.minTime)/this.slotDuration;return o=Math.max(0,o),o=Math.min(i,o),e=Math.floor(o),e=Math.min(e,i-1),n=o-e,this.slatCoordCache.getTopPosition(e)+this.slatCoordCache.getHeight(e)*n},e.prototype.updateSegVerticals=function(t){this.computeSegVerticals(t),this.assignSegVerticals(t)},e.prototype.computeSegVerticals=function(t){var e,n,i,r=this.opt("agendaEventMinHeight");for(e=0;e<t.length;e++)n=t[e],i=this.dayDates[n.dayIndex],n.top=this.computeDateTop(n.startMs,i),n.bottom=Math.max(n.top+r,this.computeDateTop(n.endMs,i))},e.prototype.assignSegVerticals=function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateSegVerticalCss(n))},e.prototype.generateSegVerticalCss=function(t){return{top:t.top,bottom:-t.bottom}},e.prototype.prepareHits=function(){this.colCoordCache.build(),this.slatCoordCache.build()},e.prototype.releaseHits=function(){this.colCoordCache.clear()},e.prototype.queryHit=function(t,e){var n=this.snapsPerSlot,i=this.colCoordCache,r=this.slatCoordCache;if(i.isLeftInBounds(t)&&r.isTopInBounds(e)){var o=i.getHorizontalIndex(t),s=r.getVerticalIndex(e);if(null!=o&&null!=s){var a=r.getTopOffset(s),l=r.getHeight(s),u=(e-a)/l,d=Math.floor(u*n),c=s*n+d,p=a+d/n*l,h=a+(d+1)/n*l;return{col:o,snap:c,component:this,left:i.getLeftOffset(o),right:i.getRightOffset(o),top:p,bottom:h}}}},e.prototype.getHitFootprint=function(t){var e,n=this.getCellDate(0,t.col),i=this.computeSnapTime(t.snap);return n.time(i),e=n.clone().add(this.snapDuration),new h.default(new p.default(n,e),!1)},e.prototype.computeSnapTime=function(t){return o.duration(this.dateProfile.minTime+this.snapDuration*t)},e.prototype.getHitEl=function(t){return this.colEls.eq(t.col)},e.prototype.renderDrag=function(t,e,n){var i;if(e){if(t.length)return this.helperRenderer.renderEventDraggingFootprints(t,e,n),!0}else for(i=0;i<t.length;i++)this.renderHighlight(t[i].componentFootprint)},e.prototype.unrenderDrag=function(){this.unrenderHighlight(),this.helperRenderer.unrender()},e.prototype.renderEventResize=function(t,e,n){this.helperRenderer.renderEventResizingFootprints(t,e,n)},e.prototype.unrenderEventResize=function(){this.helperRenderer.unrender()},e.prototype.renderSelectionFootprint=function(t){this.opt("selectHelper")?this.helperRenderer.renderComponentFootprint(t):this.renderHighlight(t)},e.prototype.unrenderSelection=function(){this.helperRenderer.unrender(),this.unrenderHighlight()},e}(a.default);e.default=m,m.prototype.eventRendererClass=f.default,m.prototype.businessHourRendererClass=l.default,m.prototype.helperRendererClass=g.default,m.prototype.fillRendererClass=v.default,u.default.mixInto(m),d.default.mixInto(m)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(5),o=n(221),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildRenderRange=function(e,n,i){var o=t.prototype.buildRenderRange.call(this,e,n,i),s=this.msToUtcMoment(o.startMs,i),a=this.msToUtcMoment(o.endMs,i);return/^(year|month)$/.test(n)&&(s.startOf("week"),a.weekday()&&a.add(1,"week").startOf("week")),new r.default(s,a)},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(0),o=n(4),s=n(62),a=n(253),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.setGridHeight=function(t,e){e&&(t*=this.dayGrid.rowCnt/6),o.distributeHeight(this.dayGrid.rowEls,t,!e)},e.prototype.isDateInOtherMonth=function(t,e){return t.month()!==r.utc(e.currentUnzonedRange.startMs).month()},e}(s.default);e.default=l,l.prototype.dateProfileGeneratorClass=a.default},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(5),a=n(41),l=n(39),u=n(254),d=n(255),c=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.segSelector=".fc-list-item",i.scroller=new l.default({overflowX:"hidden",overflowY:"auto"}),i}return i.__extends(e,t),e.prototype.renderSkeleton=function(){this.el.addClass("fc-list-view "+this.calendar.theme.getClass("listView")),this.scroller.render(),this.scroller.el.appendTo(this.el),this.contentEl=this.scroller.scrollEl},e.prototype.unrenderSkeleton=function(){this.scroller.destroy()},e.prototype.updateSize=function(e,n,i){t.prototype.updateSize.call(this,e,n,i),this.scroller.clear(),n||this.scroller.setHeight(this.computeScrollerHeight(e))},e.prototype.computeScrollerHeight=function(t){return t-o.subtractInnerElHeight(this.el,this.scroller.el)},e.prototype.renderDates=function(t){for(var e=this.calendar,n=e.msToUtcMoment(t.renderUnzonedRange.startMs,!0),i=e.msToUtcMoment(t.renderUnzonedRange.endMs,!0),r=[],o=[];n<i;)r.push(n.clone()),o.push(new s.default(n,n.clone().add(1,"day"))),n.add(1,"day");this.dayDates=r,this.dayRanges=o},e.prototype.componentFootprintToSegs=function(t){var e,n,i,r=this.dayRanges,o=[];for(e=0;e<r.length;e++)if((n=t.unzonedRange.intersect(r[e]))&&(i={startMs:n.startMs,endMs:n.endMs,isStart:n.isStart,isEnd:n.isEnd,dayIndex:e},o.push(i),!i.isEnd&&!t.isAllDay&&e+1<r.length&&t.unzonedRange.endMs<r[e+1].startMs+this.nextDayThreshold)){i.endMs=t.unzonedRange.endMs,i.isEnd=!0;break}return o},e.prototype.renderEmptyMessage=function(){this.contentEl.html('<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+o.htmlEscape(this.opt("noEventsMessage"))+"</div></div></div>")},e.prototype.renderSegList=function(t){var e,n,i,o=this.groupSegsByDay(t),s=r('<table class="fc-list-table '+this.calendar.theme.getClass("tableList")+'"><tbody/></table>'),a=s.find("tbody");for(e=0;e<o.length;e++)if(n=o[e])for(a.append(this.dayHeaderHtml(this.dayDates[e])),this.eventRenderer.sortEventSegs(n),i=0;i<n.length;i++)a.append(n[i].el);this.contentEl.empty().append(s)},e.prototype.groupSegsByDay=function(t){var e,n,i=[];for(e=0;e<t.length;e++)n=t[e],(i[n.dayIndex]||(i[n.dayIndex]=[])).push(n);return i},e.prototype.dayHeaderHtml=function(t){var e=this.opt("listDayFormat"),n=this.opt("listDayAltFormat");return'<tr class="fc-list-heading" data-date="'+t.format("YYYY-MM-DD")+'"><td class="'+(this.calendar.theme.getClass("tableListHeading")||this.calendar.theme.getClass("widgetHeader"))+'" colspan="3">'+(e?this.buildGotoAnchorHtml(t,{class:"fc-list-heading-main"},o.htmlEscape(t.format(e))):"")+(n?this.buildGotoAnchorHtml(t,{class:"fc-list-heading-alt"},o.htmlEscape(t.format(n))):"")+"</td></tr>"},e}(a.default);e.default=c,c.prototype.eventRendererClass=u.default,c.prototype.eventPointingClass=d.default},,,,,,function(t,e,n){var i=n(3),r=n(16),o=n(4),s=n(220);n(10),n(47),n(256),n(257),n(260),n(261),n(262),n(263),i.fullCalendar=r,i.fn.fullCalendar=function(t){var e=Array.prototype.slice.call(arguments,1),n=this;return this.each(function(r,a){var l,u=i(a),d=u.data("fullCalendar");"string"==typeof t?"getCalendar"===t?r||(n=d):"destroy"===t?d&&(d.destroy(),u.removeData("fullCalendar")):d?i.isFunction(d[t])?(l=d[t].apply(d,e),r||(n=l),"destroy"===t&&u.removeData("fullCalendar")):o.warn("'"+t+"' is an unknown FullCalendar method."):o.warn("Attempting to call a FullCalendar method on an element with no calendar."):d||(d=new s.default(u,t),u.data("fullCalendar",d),d.render())}),n},t.exports=r},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(48),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.setElement=function(t){this.el=t,this.bindGlobalHandlers(),this.renderSkeleton(),this.set("isInDom",!0)},e.prototype.removeElement=function(){this.unset("isInDom"),this.unrenderSkeleton(),this.unbindGlobalHandlers(),this.el.remove()},e.prototype.bindGlobalHandlers=function(){},e.prototype.unbindGlobalHandlers=function(){},e.prototype.renderSkeleton=function(){},e.prototype.unrenderSkeleton=function(){},e}(r.default);e.default=o},function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var n=function(){function t(t){this.items=t||[]}return t.prototype.proxyCall=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];var i=[];return this.items.forEach(function(n){i.push(n[t].apply(n,e))}),i},t}();e.default=n},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=function(){function t(t,e){this.el=null,this.viewsWithButtons=[],this.calendar=t,this.toolbarOptions=e}return t.prototype.setToolbarOptions=function(t){this.toolbarOptions=t},t.prototype.render=function(){var t=this.toolbarOptions.layout,e=this.el;t?(e?e.empty():e=this.el=i("<div class='fc-toolbar "+this.toolbarOptions.extraClasses+"'/>"),e.append(this.renderSection("left")).append(this.renderSection("right")).append(this.renderSection("center")).append('<div class="fc-clear"/>')):this.removeElement()},t.prototype.removeElement=function(){this.el&&(this.el.remove(),this.el=null)},t.prototype.renderSection=function(t){var e=this,n=this.calendar,o=n.theme,s=n.optionsManager,a=n.viewSpecManager,l=i('<div class="fc-'+t+'"/>'),u=this.toolbarOptions.layout[t],d=s.get("customButtons")||{},c=s.overrides.buttonText||{},p=s.get("buttonText")||{};return u&&i.each(u.split(" "),function(t,s){var u,h=i(),f=!0;i.each(s.split(","),function(t,s){var l,u,g,v,y,m,b,w,D;"title"===s?(h=h.add(i("<h2>&nbsp;</h2>")),f=!1):((l=d[s])?(g=function(t){l.click&&l.click.call(w[0],t)},(v=o.getCustomButtonIconClass(l))||(v=o.getIconClass(s))||(y=l.text)):(u=a.getViewSpec(s))?(e.viewsWithButtons.push(s),g=function(){n.changeView(s)},(y=u.buttonTextOverride)||(v=o.getIconClass(s))||(y=u.buttonTextDefault)):n[s]&&(g=function(){n[s]()},(y=c[s])||(v=o.getIconClass(s))||(y=p[s])),g&&(b=["fc-"+s+"-button",o.getClass("button"),o.getClass("stateDefault")],y?(m=r.htmlEscape(y),D=""):v&&(m="<span class='"+v+"'></span>",D=' aria-label="'+s+'"'),w=i('<button type="button" class="'+b.join(" ")+'"'+D+">"+m+"</button>").click(function(t){w.hasClass(o.getClass("stateDisabled"))||(g(t),(w.hasClass(o.getClass("stateActive"))||w.hasClass(o.getClass("stateDisabled")))&&w.removeClass(o.getClass("stateHover")))}).mousedown(function(){w.not("."+o.getClass("stateActive")).not("."+o.getClass("stateDisabled")).addClass(o.getClass("stateDown"))}).mouseup(function(){w.removeClass(o.getClass("stateDown"))}).hover(function(){w.not("."+o.getClass("stateActive")).not("."+o.getClass("stateDisabled")).addClass(o.getClass("stateHover"))},function(){w.removeClass(o.getClass("stateHover")).removeClass(o.getClass("stateDown"))}),h=h.add(w)))}),f&&h.first().addClass(o.getClass("cornerLeft")).end().last().addClass(o.getClass("cornerRight")).end(),h.length>1?(u=i("<div/>"),f&&u.addClass(o.getClass("buttonGroup")),u.append(h),l.append(u)):l.append(h)}),l},t.prototype.updateTitle=function(t){this.el&&this.el.find("h2").text(t)},t.prototype.activateButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").addClass(this.calendar.theme.getClass("stateActive"))},t.prototype.deactivateButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").removeClass(this.calendar.theme.getClass("stateActive"))},t.prototype.disableButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").prop("disabled",!0).addClass(this.calendar.theme.getClass("stateDisabled"))},t.prototype.enableButton=function(t){this.el&&this.el.find(".fc-"+t+"-button").prop("disabled",!1).removeClass(this.calendar.theme.getClass("stateDisabled"))},t.prototype.getViewsWithButtons=function(){return this.viewsWithButtons},t}();e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(4),s=n(32),a=n(31),l=n(48),u=function(t){function e(e,n){var i=t.call(this)||this;return i._calendar=e,i.overrides=r.extend({},n),i.dynamicOverrides={},i.compute(),i}return i.__extends(e,t),e.prototype.add=function(t){var e,n=0;this.recordOverrides(t);for(e in t)n++;if(1===n){if("height"===e||"contentHeight"===e||"aspectRatio"===e)return void this._calendar.updateViewSize(!0);if("defaultDate"===e)return;if("businessHours"===e)return;if(/^(event|select)(Overlap|Constraint|Allow)$/.test(e))return;if("timezone"===e)return void this._calendar.view.flash("initialEvents")}this._calendar.renderHeader(),this._calendar.renderFooter(),this._calendar.viewsByType={},this._calendar.reinitView()},e.prototype.compute=function(){var t,e,n,i,r;t=o.firstDefined(this.dynamicOverrides.locale,this.overrides.locale),e=a.localeOptionHash[t],e||(t=s.globalDefaults.locale,e=a.localeOptionHash[t]||{}),n=o.firstDefined(this.dynamicOverrides.isRTL,this.overrides.isRTL,e.isRTL,s.globalDefaults.isRTL),i=n?s.rtlDefaults:{},this.dirDefaults=i,this.localeDefaults=e,r=s.mergeOptions([s.globalDefaults,i,e,this.overrides,this.dynamicOverrides]),a.populateInstanceComputableOptions(r),this.reset(r)},e.prototype.recordOverrides=function(t){var e;for(e in t)this.dynamicOverrides[e]=t[e];this._calendar.viewSpecManager.clearCache(),this.compute()},e}(l.default);e.default=u},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(0),r=n(3),o=n(22),s=n(4),a=n(32),l=n(31),u=function(){function t(t,e){this.optionsManager=t,this._calendar=e,this.clearCache()}return t.prototype.clearCache=function(){this.viewSpecCache={}},t.prototype.getViewSpec=function(t){var e=this.viewSpecCache;return e[t]||(e[t]=this.buildViewSpec(t))},t.prototype.getUnitViewSpec=function(t){var e,n,i;if(-1!==r.inArray(t,s.unitsDesc))for(e=this._calendar.header.getViewsWithButtons(),r.each(o.viewHash,function(t){e.push(t)}),n=0;n<e.length;n++)if((i=this.getViewSpec(e[n]))&&i.singleUnit===t)return i},t.prototype.buildViewSpec=function(t){for(var e,n,r,l,u,d=this.optionsManager.overrides.views||{},c=[],p=[],h=[],f=t;f;)e=o.viewHash[f],n=d[f],f=null,"function"==typeof e&&(e={class:e}),e&&(c.unshift(e),p.unshift(e.defaults||{}),r=r||e.duration,f=f||e.type),n&&(h.unshift(n),r=r||n.duration,f=f||n.type);return e=s.mergeProps(c),e.type=t,!!e.class&&(r=r||this.optionsManager.dynamicOverrides.duration||this.optionsManager.overrides.duration,r&&(l=i.duration(r),l.valueOf()&&(u=s.computeDurationGreatestUnit(l,r),e.duration=l,e.durationUnit=u,1===l.as(u)&&(e.singleUnit=u,h.unshift(d[u]||{})))),e.defaults=a.mergeOptions(p),e.overrides=a.mergeOptions(h),this.buildViewSpecOptions(e),this.buildViewSpecButtonText(e,t),e)},t.prototype.buildViewSpecOptions=function(t){var e=this.optionsManager;t.options=a.mergeOptions([a.globalDefaults,t.defaults,e.dirDefaults,e.localeDefaults,e.overrides,t.overrides,e.dynamicOverrides]),l.populateInstanceComputableOptions(t.options)},t.prototype.buildViewSpecButtonText=function(t,e){function n(n){var i=n.buttonText||{};return i[e]||(t.buttonTextKey?i[t.buttonTextKey]:null)||(t.singleUnit?i[t.singleUnit]:null)}var i=this.optionsManager;t.buttonTextOverride=n(i.dynamicOverrides)||n(i.overrides)||t.overrides.buttonText,t.buttonTextDefault=n(i.localeDefaults)||n(i.dirDefaults)||t.defaults.buttonText||n(a.globalDefaults)||(t.duration?this._calendar.humanizeDuration(t.duration):null)||e},t}();e.default=u},function(t,e,n){function i(t,e){return t.getPrimitive()===e.getPrimitive()}Object.defineProperty(e,"__esModule",{value:!0});var r=n(3),o=n(4),s=n(243),a=n(52),l=n(6),u=n(38),d=n(13),c=n(18),p=n(11),h=n(7),f=function(){function t(t){this.calendar=t,this.stickySource=new a.default(t),this.otherSources=[]}return t.prototype.requestEvents=function(t,e,n,i){return!i&&this.currentPeriod&&this.currentPeriod.isWithinRange(t,e)&&n===this.currentPeriod.timezone||this.setPeriod(new s.default(t,e,n)),this.currentPeriod.whenReleased()},t.prototype.addSource=function(t){this.otherSources.push(t),this.currentPeriod&&this.currentPeriod.requestSource(t)},t.prototype.removeSource=function(t){o.removeExact(this.otherSources,t),this.currentPeriod&&this.currentPeriod.purgeSource(t)},t.prototype.removeAllSources=function(){this.otherSources=[],this.currentPeriod&&this.currentPeriod.purgeAllSources()},t.prototype.refetchSource=function(t){var e=this.currentPeriod;e&&(e.freeze(),e.purgeSource(t),e.requestSource(t),e.thaw())},t.prototype.refetchAllSources=function(){var t=this.currentPeriod;t&&(t.freeze(),t.purgeAllSources(),t.requestSources(this.getSources()),t.thaw())},t.prototype.getSources=function(){return[this.stickySource].concat(this.otherSources)},t.prototype.multiQuerySources=function(t){t?r.isArray(t)||(t=[t]):t=[];var e,n=[];for(e=0;e<t.length;e++)n.push.apply(n,this.querySources(t[e]));return n},t.prototype.querySources=function(t){var e,n,o=this.otherSources;for(e=0;e<o.length;e++)if((n=o[e])===t)return[n];return(n=this.getSourceById(l.default.normalizeId(t)))?[n]:(t=u.default.parse(t,this.calendar),t?r.grep(o,function(e){return i(t,e)}):void 0)},t.prototype.getSourceById=function(t){return r.grep(this.otherSources,function(e){return e.id&&e.id===t})[0]},t.prototype.setPeriod=function(t){this.currentPeriod&&(this.unbindPeriod(this.currentPeriod),this.currentPeriod=null),this.currentPeriod=t,this.bindPeriod(t),t.requestSources(this.getSources())},t.prototype.bindPeriod=function(t){this.listenTo(t,"release",function(t){this.trigger("release",t)})},t.prototype.unbindPeriod=function(t){this.stopListeningTo(t)},t.prototype.getEventDefByUid=function(t){if(this.currentPeriod)return this.currentPeriod.getEventDefByUid(t)},t.prototype.addEventDef=function(t,e){e&&this.stickySource.addEventDef(t),this.currentPeriod&&this.currentPeriod.addEventDef(t)},t.prototype.removeEventDefsById=function(t){this.getSources().forEach(function(e){e.removeEventDefsById(t)}),this.currentPeriod&&this.currentPeriod.removeEventDefsById(t)},t.prototype.removeAllEventDefs=function(){this.getSources().forEach(function(t){t.removeAllEventDefs()}),this.currentPeriod&&this.currentPeriod.removeAllEventDefs()},t.prototype.mutateEventsWithId=function(t,e){var n,i=this.currentPeriod,r=[];return i?(i.freeze(),n=i.getEventDefsById(t),n.forEach(function(t){i.removeEventDef(t),r.push(e.mutateSingle(t)),i.addEventDef(t)}),i.thaw(),function(){i.freeze();for(var t=0;t<n.length;t++)i.removeEventDef(n[t]),r[t](),i.addEventDef(n[t]);i.thaw()}):function(){}},t.prototype.buildMutatedEventInstanceGroup=function(t,e){var n,i,r=this.getEventDefsById(t),o=[];for(n=0;n<r.length;n++)(i=r[n].clone())instanceof d.default&&(e.mutateSingle(i),o.push.apply(o,i.buildInstances()));return new c.default(o)},t.prototype.freeze=function(){this.currentPeriod&&this.currentPeriod.freeze()},t.prototype.thaw=function(){this.currentPeriod&&this.currentPeriod.thaw()},t.prototype.getEventDefsById=function(t){return this.currentPeriod.getEventDefsById(t)},t.prototype.getEventInstances=function(){return this.currentPeriod.getEventInstances()},t.prototype.getEventInstancesWithId=function(t){return this.currentPeriod.getEventInstancesWithId(t)},t.prototype.getEventInstancesWithoutId=function(t){return this.currentPeriod.getEventInstancesWithoutId(t)},t}();e.default=f,p.default.mixInto(f),h.default.mixInto(f)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=n(20),s=n(11),a=n(5),l=n(18),u=function(){function t(t,e,n){this.pendingCnt=0,this.freezeDepth=0,this.stuntedReleaseCnt=0,this.releaseCnt=0,this.start=t,this.end=e,this.timezone=n,this.unzonedRange=new a.default(t.clone().stripZone(),e.clone().stripZone()),this.requestsByUid={},this.eventDefsByUid={},this.eventDefsById={},this.eventInstanceGroupsById={}}return t.prototype.isWithinRange=function(t,e){return!t.isBefore(this.start)&&!e.isAfter(this.end)},t.prototype.requestSources=function(t){this.freeze();for(var e=0;e<t.length;e++)this.requestSource(t[e]);this.thaw()},t.prototype.requestSource=function(t){var e=this,n={source:t,status:"pending",eventDefs:null};this.requestsByUid[t.uid]=n,this.pendingCnt+=1,t.fetch(this.start,this.end,this.timezone).then(function(t){"cancelled"!==n.status&&(n.status="completed",n.eventDefs=t,e.addEventDefs(t),e.pendingCnt--,e.tryRelease())},function(){"cancelled"!==n.status&&(n.status="failed",e.pendingCnt--,e.tryRelease())})},t.prototype.purgeSource=function(t){var e=this.requestsByUid[t.uid];e&&(delete this.requestsByUid[t.uid],"pending"===e.status?(e.status="cancelled",this.pendingCnt--,this.tryRelease()):"completed"===e.status&&e.eventDefs.forEach(this.removeEventDef.bind(this)))},t.prototype.purgeAllSources=function(){var t,e,n=this.requestsByUid,i=0;for(t in n)e=n[t],"pending"===e.status?e.status="cancelled":"completed"===e.status&&i++;this.requestsByUid={},this.pendingCnt=0,i&&this.removeAllEventDefs()},t.prototype.getEventDefByUid=function(t){return this.eventDefsByUid[t]},t.prototype.getEventDefsById=function(t){var e=this.eventDefsById[t];return e?e.slice():[]},t.prototype.addEventDefs=function(t){for(var e=0;e<t.length;e++)this.addEventDef(t[e])},t.prototype.addEventDef=function(t){var e,n=this.eventDefsById,i=t.id,r=n[i]||(n[i]=[]),o=t.buildInstances(this.unzonedRange);for(r.push(t),this.eventDefsByUid[t.uid]=t,e=0;e<o.length;e++)this.addEventInstance(o[e],i)},t.prototype.removeEventDefsById=function(t){var e=this;this.getEventDefsById(t).forEach(function(t){e.removeEventDef(t)})},t.prototype.removeAllEventDefs=function(){var t=i.isEmptyObject(this.eventDefsByUid);this.eventDefsByUid={},this.eventDefsById={},this.eventInstanceGroupsById={},t||this.tryRelease()},t.prototype.removeEventDef=function(t){var e=this.eventDefsById,n=e[t.id]
-;delete this.eventDefsByUid[t.uid],n&&(r.removeExact(n,t),n.length||delete e[t.id],this.removeEventInstancesForDef(t))},t.prototype.getEventInstances=function(){var t,e=this.eventInstanceGroupsById,n=[];for(t in e)n.push.apply(n,e[t].eventInstances);return n},t.prototype.getEventInstancesWithId=function(t){var e=this.eventInstanceGroupsById[t];return e?e.eventInstances.slice():[]},t.prototype.getEventInstancesWithoutId=function(t){var e,n=this.eventInstanceGroupsById,i=[];for(e in n)e!==t&&i.push.apply(i,n[e].eventInstances);return i},t.prototype.addEventInstance=function(t,e){var n=this.eventInstanceGroupsById;(n[e]||(n[e]=new l.default)).eventInstances.push(t),this.tryRelease()},t.prototype.removeEventInstancesForDef=function(t){var e,n=this.eventInstanceGroupsById,i=n[t.id];i&&(e=r.removeMatching(i.eventInstances,function(e){return e.def===t}),i.eventInstances.length||delete n[t.id],e&&this.tryRelease())},t.prototype.tryRelease=function(){this.pendingCnt||(this.freezeDepth?this.stuntedReleaseCnt++:this.release())},t.prototype.release=function(){this.releaseCnt++,this.trigger("release",this.eventInstanceGroupsById)},t.prototype.whenReleased=function(){var t=this;return this.releaseCnt?o.default.resolve(this.eventInstanceGroupsById):o.default.construct(function(e){t.one("release",e)})},t.prototype.freeze=function(){this.freezeDepth++||(this.stuntedReleaseCnt=0)},t.prototype.thaw=function(){--this.freezeDepth||!this.stuntedReleaseCnt||this.pendingCnt||this.release()},t}();e.default=u,s.default.mixInto(u)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=n(7),s=function(){function t(t,e){this.isFollowing=!1,this.isHidden=!1,this.isAnimating=!1,this.options=e=e||{},this.sourceEl=t,this.parentEl=e.parentEl?i(e.parentEl):t.parent()}return t.prototype.start=function(t){this.isFollowing||(this.isFollowing=!0,this.y0=r.getEvY(t),this.x0=r.getEvX(t),this.topDelta=0,this.leftDelta=0,this.isHidden||this.updatePosition(),r.getEvIsTouch(t)?this.listenTo(i(document),"touchmove",this.handleMove):this.listenTo(i(document),"mousemove",this.handleMove))},t.prototype.stop=function(t,e){var n=this,r=this.options.revertDuration,o=function(){n.isAnimating=!1,n.removeElement(),n.top0=n.left0=null,e&&e()};this.isFollowing&&!this.isAnimating&&(this.isFollowing=!1,this.stopListeningTo(i(document)),t&&r&&!this.isHidden?(this.isAnimating=!0,this.el.animate({top:this.top0,left:this.left0},{duration:r,complete:o})):o())},t.prototype.getEl=function(){var t=this.el;return t||(t=this.el=this.sourceEl.clone().addClass(this.options.additionalClass||"").css({position:"absolute",visibility:"",display:this.isHidden?"none":"",margin:0,right:"auto",bottom:"auto",width:this.sourceEl.width(),height:this.sourceEl.height(),opacity:this.options.opacity||"",zIndex:this.options.zIndex}),t.addClass("fc-unselectable"),t.appendTo(this.parentEl)),t},t.prototype.removeElement=function(){this.el&&(this.el.remove(),this.el=null)},t.prototype.updatePosition=function(){var t,e;this.getEl(),null==this.top0&&(t=this.sourceEl.offset(),e=this.el.offsetParent().offset(),this.top0=t.top-e.top,this.left0=t.left-e.left),this.el.css({top:this.top0+this.topDelta,left:this.left0+this.leftDelta})},t.prototype.handleMove=function(t){this.topDelta=r.getEvY(t)-this.y0,this.leftDelta=r.getEvX(t)-this.x0,this.isHidden||this.updatePosition()},t.prototype.hide=function(){this.isHidden||(this.isHidden=!0,this.el&&this.el.hide())},t.prototype.show=function(){this.isHidden&&(this.isHidden=!1,this.updatePosition(),this.getEl().show())},t}();e.default=s,o.default.mixInto(s)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(23),o=n(15),s=function(t){function e(e){var n=t.call(this,e)||this;return n.dragListener=n.buildDragListener(),n}return i.__extends(e,t),e.prototype.end=function(){this.dragListener.endInteraction()},e.prototype.bindToEl=function(t){var e=this.component,n=this.dragListener;e.bindDateHandlerToEl(t,"mousedown",function(t){e.shouldIgnoreMouse()||n.startInteraction(t)}),e.bindDateHandlerToEl(t,"touchstart",function(t){e.shouldIgnoreTouch()||n.startInteraction(t)})},e.prototype.buildDragListener=function(){var t,e=this,n=this.component,i=new r.default(n,{scroll:this.opt("dragScroll"),interactionStart:function(){t=i.origHit},hitOver:function(e,n,i){n||(t=null)},hitOut:function(){t=null},interactionEnd:function(i,r){var o;!r&&t&&(o=n.getSafeHitFootprint(t))&&e.view.triggerDayClick(o,n.getHitEl(t),i)}});return i.shouldCancelTouchScroll=!1,i.scrollAlwaysKills=!0,i},e}(o.default);e.default=s},function(t,e,n){function i(t){var e,n,i,r=[];for(e=0;e<t.length;e++){for(n=t[e],i=0;i<r.length&&s(n,r[i]).length;i++);n.level=i,(r[i]||(r[i]=[])).push(n)}return r}function r(t){var e,n,i,r,o;for(e=0;e<t.length;e++)for(n=t[e],i=0;i<n.length;i++)for(r=n[i],r.forwardSegs=[],o=e+1;o<t.length;o++)s(r,t[o],r.forwardSegs)}function o(t){var e,n,i=t.forwardSegs,r=0;if(void 0===t.forwardPressure){for(e=0;e<i.length;e++)n=i[e],o(n),r=Math.max(r,1+n.forwardPressure);t.forwardPressure=r}}function s(t,e,n){void 0===n&&(n=[]);for(var i=0;i<e.length;i++)a(t,e[i])&&n.push(e[i]);return n}function a(t,e){return t.bottom>e.top&&t.top<e.bottom}Object.defineProperty(e,"__esModule",{value:!0});var l=n(2),u=n(4),d=n(42),c=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.timeGrid=e,i}return l.__extends(e,t),e.prototype.renderFgSegs=function(t){this.renderFgSegsIntoContainers(t,this.timeGrid.fgContainerEls)},e.prototype.renderFgSegsIntoContainers=function(t,e){var n,i;for(n=this.timeGrid.groupSegsByCol(t),i=0;i<this.timeGrid.colCnt;i++)this.updateFgSegCoords(n[i]);this.timeGrid.attachSegsByCol(n,e)},e.prototype.unrenderFgSegs=function(){this.fgSegs&&this.fgSegs.forEach(function(t){t.el.remove()})},e.prototype.computeEventTimeFormat=function(){return this.opt("noMeridiemTimeFormat")},e.prototype.computeDisplayEventEnd=function(){return!0},e.prototype.fgSegHtml=function(t,e){var n,i,r,o=this.view,s=o.calendar,a=t.footprint.componentFootprint,l=a.isAllDay,d=t.footprint.eventDef,c=o.isEventDefDraggable(d),p=!e&&t.isStart&&o.isEventDefResizableFromStart(d),h=!e&&t.isEnd&&o.isEventDefResizableFromEnd(d),f=this.getSegClasses(t,c,p||h),g=u.cssToStr(this.getSkinCss(d));if(f.unshift("fc-time-grid-event","fc-v-event"),o.isMultiDayRange(a.unzonedRange)){if(t.isStart||t.isEnd){var v=s.msToMoment(t.startMs),y=s.msToMoment(t.endMs);n=this._getTimeText(v,y,l),i=this._getTimeText(v,y,l,"LT"),r=this._getTimeText(v,y,l,null,!1)}}else n=this.getTimeText(t.footprint),i=this.getTimeText(t.footprint,"LT"),r=this.getTimeText(t.footprint,null,!1);return'<a class="'+f.join(" ")+'"'+(d.url?' href="'+u.htmlEscape(d.url)+'"':"")+(g?' style="'+g+'"':"")+'><div class="fc-content">'+(n?'<div class="fc-time" data-start="'+u.htmlEscape(r)+'" data-full="'+u.htmlEscape(i)+'"><span>'+u.htmlEscape(n)+"</span></div>":"")+(d.title?'<div class="fc-title">'+u.htmlEscape(d.title)+"</div>":"")+'</div><div class="fc-bg"/>'+(h?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},e.prototype.updateFgSegCoords=function(t){this.timeGrid.computeSegVerticals(t),this.computeFgSegHorizontals(t),this.timeGrid.assignSegVerticals(t),this.assignFgSegHorizontals(t)},e.prototype.computeFgSegHorizontals=function(t){var e,n,s;if(this.sortEventSegs(t),e=i(t),r(e),n=e[0]){for(s=0;s<n.length;s++)o(n[s]);for(s=0;s<n.length;s++)this.computeFgSegForwardBack(n[s],0,0)}},e.prototype.computeFgSegForwardBack=function(t,e,n){var i,r=t.forwardSegs;if(void 0===t.forwardCoord)for(r.length?(this.sortForwardSegs(r),this.computeFgSegForwardBack(r[0],e+1,n),t.forwardCoord=r[0].backwardCoord):t.forwardCoord=1,t.backwardCoord=t.forwardCoord-(t.forwardCoord-n)/(e+1),i=0;i<r.length;i++)this.computeFgSegForwardBack(r[i],0,t.forwardCoord)},e.prototype.sortForwardSegs=function(t){t.sort(u.proxy(this,"compareForwardSegs"))},e.prototype.compareForwardSegs=function(t,e){return e.forwardPressure-t.forwardPressure||(t.backwardCoord||0)-(e.backwardCoord||0)||this.compareEventSegs(t,e)},e.prototype.assignFgSegHorizontals=function(t){var e,n;for(e=0;e<t.length;e++)n=t[e],n.el.css(this.generateFgSegHorizontalCss(n)),n.bottom-n.top<30&&n.el.addClass("fc-short")},e.prototype.generateFgSegHorizontalCss=function(t){var e,n,i=this.opt("slotEventOverlap"),r=t.backwardCoord,o=t.forwardCoord,s=this.timeGrid.generateSegVerticalCss(t),a=this.timeGrid.isRTL;return i&&(o=Math.min(1,r+2*(o-r))),a?(e=1-o,n=r):(e=r,n=1-o),s.zIndex=t.level+1,s.left=100*e+"%",s.right=100*n+"%",i&&t.forwardPressure&&(s[a?"marginLeft":"marginRight"]=20),s},e}(d.default);e.default=c},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(58),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderSegs=function(t,e){var n,i,o,s=[];for(this.eventRenderer.renderFgSegsIntoContainers(t,this.component.helperContainerEls),n=0;n<t.length;n++)i=t[n],e&&e.col===i.col&&(o=e.el,i.el.css({left:o.css("left"),right:o.css("right"),"margin-left":o.css("margin-left"),"margin-right":o.css("margin-right")})),s.push(i.el[0]);return r(s)},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(57),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.attachSegEls=function(t,e){var n,i=this.component;return"bgEvent"===t?n=i.bgContainerEls:"businessHours"===t?n=i.businessContainerEls:"highlight"===t&&(n=i.highlightContainerEls),i.updateSegVerticals(e),i.attachSegsByCol(i.groupSegsByCol(e),n),e.map(function(t){return t.el[0]})},e}(r.default);e.default=o},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(3),r=n(4),o=n(7),s=function(){function t(t){this.isHidden=!0,this.margin=10,this.options=t||{}}return t.prototype.show=function(){this.isHidden&&(this.el||this.render(),this.el.show(),this.position(),this.isHidden=!1,this.trigger("show"))},t.prototype.hide=function(){this.isHidden||(this.el.hide(),this.isHidden=!0,this.trigger("hide"))},t.prototype.render=function(){var t=this,e=this.options;this.el=i('<div class="fc-popover"/>').addClass(e.className||"").css({top:0,left:0}).append(e.content).appendTo(e.parentEl),this.el.on("click",".fc-close",function(){t.hide()}),e.autoHide&&this.listenTo(i(document),"mousedown",this.documentMousedown)},t.prototype.documentMousedown=function(t){this.el&&!i(t.target).closest(this.el).length&&this.hide()},t.prototype.removeElement=function(){this.hide(),this.el&&(this.el.remove(),this.el=null),this.stopListeningTo(i(document),"mousedown")},t.prototype.position=function(){var t,e,n,o,s,a=this.options,l=this.el.offsetParent().offset(),u=this.el.outerWidth(),d=this.el.outerHeight(),c=i(window),p=r.getScrollParent(this.el);o=a.top||0,s=void 0!==a.left?a.left:void 0!==a.right?a.right-u:0,p.is(window)||p.is(document)?(p=c,t=0,e=0):(n=p.offset(),t=n.top,e=n.left),t+=c.scrollTop(),e+=c.scrollLeft(),!1!==a.viewportConstrain&&(o=Math.min(o,t+p.outerHeight()-d-this.margin),o=Math.max(o,t+this.margin),s=Math.min(s,e+p.outerWidth()-u-this.margin),s=Math.max(s,e+this.margin)),this.el.css({top:o-l.top,left:s-l.left})},t.prototype.trigger=function(t){this.options[t]&&this.options[t].apply(this,Array.prototype.slice.call(arguments,1))},t}();e.default=s,o.default.mixInto(s)},function(t,e,n){function i(t,e){var n,i;for(n=0;n<e.length;n++)if(i=e[n],i.leftCol<=t.rightCol&&i.rightCol>=t.leftCol)return!0;return!1}function r(t,e){return t.leftCol-e.leftCol}Object.defineProperty(e,"__esModule",{value:!0});var o=n(2),s=n(3),a=n(4),l=n(42),u=function(t){function e(e,n){var i=t.call(this,e,n)||this;return i.dayGrid=e,i}return o.__extends(e,t),e.prototype.renderBgRanges=function(e){e=s.grep(e,function(t){return t.eventDef.isAllDay()}),t.prototype.renderBgRanges.call(this,e)},e.prototype.renderFgSegs=function(t){var e=this.rowStructs=this.renderSegRows(t);this.dayGrid.rowEls.each(function(t,n){s(n).find(".fc-content-skeleton > table").append(e[t].tbodyEl)})},e.prototype.unrenderFgSegs=function(){for(var t,e=this.rowStructs||[];t=e.pop();)t.tbodyEl.remove();this.rowStructs=null},e.prototype.renderSegRows=function(t){var e,n,i=[];for(e=this.groupSegRows(t),n=0;n<e.length;n++)i.push(this.renderSegRow(n,e[n]));return i},e.prototype.renderSegRow=function(t,e){function n(t){for(;o<t;)d=(y[i-1]||[])[o],d?d.attr("rowspan",parseInt(d.attr("rowspan")||1,10)+1):(d=s("<td/>"),a.append(d)),v[i][o]=d,y[i][o]=d,o++}var i,r,o,a,l,u,d,c=this.dayGrid.colCnt,p=this.buildSegLevels(e),h=Math.max(1,p.length),f=s("<tbody/>"),g=[],v=[],y=[];for(i=0;i<h;i++){if(r=p[i],o=0,a=s("<tr/>"),g.push([]),v.push([]),y.push([]),r)for(l=0;l<r.length;l++){for(u=r[l],n(u.leftCol),d=s('<td class="fc-event-container"/>').append(u.el),u.leftCol!==u.rightCol?d.attr("colspan",u.rightCol-u.leftCol+1):y[i][o]=d;o<=u.rightCol;)v[i][o]=d,g[i][o]=u,o++;a.append(d)}n(c),this.dayGrid.bookendCells(a),f.append(a)}return{row:t,tbodyEl:f,cellMatrix:v,segMatrix:g,segLevels:p,segs:e}},e.prototype.buildSegLevels=function(t){var e,n,o,s=[];for(this.sortEventSegs(t),e=0;e<t.length;e++){for(n=t[e],o=0;o<s.length&&i(n,s[o]);o++);n.level=o,(s[o]||(s[o]=[])).push(n)}for(o=0;o<s.length;o++)s[o].sort(r);return s},e.prototype.groupSegRows=function(t){var e,n=[];for(e=0;e<this.dayGrid.rowCnt;e++)n.push([]);for(e=0;e<t.length;e++)n[t[e].row].push(t[e]);return n},e.prototype.computeEventTimeFormat=function(){return this.opt("extraSmallTimeFormat")},e.prototype.computeDisplayEventEnd=function(){return 1===this.dayGrid.colCnt},e.prototype.fgSegHtml=function(t,e){var n,i,r=this.view,o=t.footprint.eventDef,s=t.footprint.componentFootprint.isAllDay,l=r.isEventDefDraggable(o),u=!e&&s&&t.isStart&&r.isEventDefResizableFromStart(o),d=!e&&s&&t.isEnd&&r.isEventDefResizableFromEnd(o),c=this.getSegClasses(t,l,u||d),p=a.cssToStr(this.getSkinCss(o)),h="";return c.unshift("fc-day-grid-event","fc-h-event"),t.isStart&&(n=this.getTimeText(t.footprint))&&(h='<span class="fc-time">'+a.htmlEscape(n)+"</span>"),i='<span class="fc-title">'+(a.htmlEscape(o.title||"")||"&nbsp;")+"</span>",'<a class="'+c.join(" ")+'"'+(o.url?' href="'+a.htmlEscape(o.url)+'"':"")+(p?' style="'+p+'"':"")+'><div class="fc-content">'+(this.dayGrid.isRTL?i+" "+h:h+" "+i)+"</div>"+(u?'<div class="fc-resizer fc-start-resizer" />':"")+(d?'<div class="fc-resizer fc-end-resizer" />':"")+"</a>"},e}(l.default);e.default=u},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(58),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderSegs=function(t,e){var n,i=[];return n=this.eventRenderer.renderSegRows(t),this.component.rowEls.each(function(t,o){var s,a,l=r(o),u=r('<div class="fc-helper-skeleton"><table/></div>');e&&e.row===t?a=e.el.position().top:(s=l.find(".fc-content-skeleton tbody"),s.length||(s=l.find(".fc-content-skeleton table")),a=s.position().top),u.css("top",a).find("table").append(n[t].tbodyEl),l.append(u),i.push(u[0])}),r(i)},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(57),s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.fillSegTag="td",e}return i.__extends(e,t),e.prototype.attachSegEls=function(t,e){var n,i,r,o=[];for(n=0;n<e.length;n++)i=e[n],r=this.renderFillRow(t,i),this.component.rowEls.eq(i.row).append(r),o.push(r[0]);return o},e.prototype.renderFillRow=function(t,e){var n,i,o,s=this.component.colCnt,a=e.leftCol,l=e.rightCol+1;return n="businessHours"===t?"bgevent":t.toLowerCase(),i=r('<div class="fc-'+n+'-skeleton"><table><tr/></table></div>'),o=i.find("tr"),a>0&&o.append('<td colspan="'+a+'"/>'),o.append(e.el.attr("colspan",l-a)),l<s&&o.append('<td colspan="'+(s-l)+'"/>'),this.component.bookendCells(o),i},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(228),o=n(5),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.buildRenderRange=function(e,n,i){var r,s=t.prototype.buildRenderRange.call(this,e,n,i),a=this.msToUtcMoment(s.startMs,i),l=this.msToUtcMoment(s.endMs,i);return this.opt("fixedWeekCount")&&(r=Math.ceil(l.diff(a,"weeks",!0)),l.add(6-r,"weeks")),new o.default(a,l)},e}(r.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(4),o=n(42),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.renderFgSegs=function(t){t.length?this.component.renderSegList(t):this.component.renderEmptyMessage()},e.prototype.fgSegHtml=function(t){var e,n=this.view,i=n.calendar,o=i.theme,s=t.footprint,a=s.eventDef,l=s.componentFootprint,u=a.url,d=["fc-list-item"].concat(this.getClasses(a)),c=this.getBgColor(a);return e=l.isAllDay?n.getAllDayHtml():n.isMultiDayRange(l.unzonedRange)?t.isStart||t.isEnd?r.htmlEscape(this._getTimeText(i.msToMoment(t.startMs),i.msToMoment(t.endMs),l.isAllDay)):n.getAllDayHtml():r.htmlEscape(this.getTimeText(s)),u&&d.push("fc-has-url"),'<tr class="'+d.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+o.getClass("widgetContent")+'">'+(e||"")+"</td>":"")+'<td class="fc-list-item-marker '+o.getClass("widgetContent")+'"><span class="fc-event-dot"'+(c?' style="background-color:'+c+'"':"")+'></span></td><td class="fc-list-item-title '+o.getClass("widgetContent")+'"><a'+(u?' href="'+r.htmlEscape(u)+'"':"")+">"+r.htmlEscape(a.title||"")+"</a></td></tr>"},e.prototype.computeEventTimeFormat=function(){return this.opt("mediumTimeFormat")},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(3),o=n(59),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e.prototype.handleClick=function(e,n){var i;t.prototype.handleClick.call(this,e,n),r(n.target).closest("a[href]").length||(i=e.footprint.eventDef.url)&&!n.isDefaultPrevented()&&(window.location.href=i)},e}(o.default);e.default=s},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(38),r=n(52),o=n(215),s=n(216);i.default.registerClass(r.default),i.default.registerClass(o.default),i.default.registerClass(s.default)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(51),r=n(213),o=n(214),s=n(258),a=n(259);i.defineThemeSystem("standard",r.default),i.defineThemeSystem("jquery-ui",o.default),i.defineThemeSystem("bootstrap3",s.default),i.defineThemeSystem("bootstrap4",a.default)},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=o,o.prototype.classes={widget:"fc-bootstrap3",tableGrid:"table-bordered",tableList:"table",tableListHeading:"active",buttonGroup:"btn-group",button:"btn btn-default",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"panel panel-default",popoverHeader:"panel-heading",popoverContent:"panel-body",headerRow:"panel-default",dayRow:"panel-default",listView:"panel panel-default"},o.prototype.baseIconClass="glyphicon",o.prototype.iconClasses={close:"glyphicon-remove",prev:"glyphicon-chevron-left",next:"glyphicon-chevron-right",prevYear:"glyphicon-backward",nextYear:"glyphicon-forward"},o.prototype.iconOverrideOption="bootstrapGlyphicons",o.prototype.iconOverrideCustomButtonOption="bootstrapGlyphicon",o.prototype.iconOverridePrefix="glyphicon-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(2),r=n(19),o=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i.__extends(e,t),e}(r.default);e.default=o,o.prototype.classes={widget:"fc-bootstrap4",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",stateActive:"active",stateDisabled:"disabled",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},o.prototype.baseIconClass="fa",o.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},o.prototype.iconOverrideOption="bootstrapFontAwesome",o.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",o.prototype.iconOverridePrefix="fa-"},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(62),o=n(229);i.defineView("basic",{class:r.default}),i.defineView("basicDay",{type:"basic",duration:{days:1}}),i.defineView("basicWeek",{type:"basic",duration:{weeks:1}}),i.defineView("month",{class:o.default,duration:{months:1},defaults:{fixedWeekCount:!0}})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(226);i.defineView("agenda",{class:r.default,defaults:{allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0}}),i.defineView("agendaDay",{type:"agenda",duration:{days:1}}),i.defineView("agendaWeek",{type:"agenda",duration:{weeks:1}})},function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var i=n(22),r=n(230);i.defineView("list",{class:r.default,buttonTextKey:"list",defaults:{buttonText:"list",listDayFormat:"LL",noEventsMessage:"No events to display"}}),i.defineView("listDay",{type:"list",duration:{days:1},defaults:{listDayFormat:"dddd"}}),i.defineView("listWeek",{type:"list",duration:{weeks:1},defaults:{listDayFormat:"dddd",listDayAltFormat:"LL"}}),i.defineView("listMonth",{type:"list",duration:{month:1},defaults:{listDayAltFormat:"dddd"}}),i.defineView("listYear",{type:"list",duration:{year:1},defaults:{listDayAltFormat:"dddd"}})},function(t,e){Object.defineProperty(e,"__esModule",{value:!0})}])});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.print.css b/backoffice/vendors/fullcalendar/fullcalendar.print.css
deleted file mode 100644 (file)
index fb858cd..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-/*!
- * FullCalendar v3.9.0 Print Stylesheet
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-/*
- * Include this stylesheet on your page to get a more printer-friendly calendar.
- * When including this stylesheet, use the media='print' attribute of the <link> tag.
- * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
- */
-.fc {
-  max-width: 100% !important; }
-
-/* Global Event Restyling
---------------------------------------------------------------------------------------------------*/
-.fc-event {
-  background: #fff !important;
-  color: #000 !important;
-  page-break-inside: avoid; }
-
-.fc-event .fc-resizer {
-  display: none; }
-
-/* Table & Day-Row Restyling
---------------------------------------------------------------------------------------------------*/
-.fc th,
-.fc td,
-.fc hr,
-.fc thead,
-.fc tbody,
-.fc-row {
-  border-color: #ccc !important;
-  background: #fff !important; }
-
-/* kill the overlaid, absolutely-positioned components */
-/* common... */
-.fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-helper-skeleton,
-.fc-bgevent-container,
-.fc-business-container,
-.fc-highlight-container,
-.fc-helper-container {
-  display: none; }
-
-/* don't force a min-height on rows (for DayGrid) */
-.fc tbody .fc-row {
-  height: auto !important;
-  /* undo height that JS set in distributeHeight */
-  min-height: 0 !important;
-  /* undo the min-height from each view's specific stylesheet */ }
-
-.fc tbody .fc-row .fc-content-skeleton {
-  position: static;
-  /* undo .fc-rigid */
-  padding-bottom: 0 !important;
-  /* use a more border-friendly method for this... */ }
-
-.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td {
-  /* only works in newer browsers */
-  padding-bottom: 1em;
-  /* ...gives space within the skeleton. also ensures min height in a way */ }
-
-.fc tbody .fc-row .fc-content-skeleton table {
-  /* provides a min-height for the row, but only effective for IE, which exaggerates this value,
-     making it look more like 3em. for other browers, it will already be this tall */
-  height: 1em; }
-
-/* Undo month-view event limiting. Display all events and hide the "more" links
---------------------------------------------------------------------------------------------------*/
-.fc-more-cell,
-.fc-more {
-  display: none !important; }
-
-.fc tr.fc-limited {
-  display: table-row !important; }
-
-.fc td.fc-limited {
-  display: table-cell !important; }
-
-.fc-popover {
-  display: none;
-  /* never display the "more.." popover in print mode */ }
-
-/* TimeGrid Restyling
---------------------------------------------------------------------------------------------------*/
-/* undo the min-height 100% trick used to fill the container's height */
-.fc-time-grid {
-  min-height: 0 !important; }
-
-/* don't display the side axis at all ("all-day" and time cells) */
-.fc-agenda-view .fc-axis {
-  display: none; }
-
-/* don't display the horizontal lines */
-.fc-slats,
-.fc-time-grid hr {
-  /* this hr is used when height is underused and needs to be filled */
-  display: none !important;
-  /* important overrides inline declaration */ }
-
-/* let the container that holds the events be naturally positioned and create real height */
-.fc-time-grid .fc-content-skeleton {
-  position: static; }
-
-/* in case there are no events, we still want some height */
-.fc-time-grid .fc-content-skeleton table {
-  height: 4em; }
-
-/* kill the horizontal spacing made by the event container. event margins will be done below */
-.fc-time-grid .fc-event-container {
-  margin: 0 !important; }
-
-/* TimeGrid *Event* Restyling
---------------------------------------------------------------------------------------------------*/
-/* naturally position events, vertically stacking them */
-.fc-time-grid .fc-event {
-  position: static !important;
-  margin: 3px 2px !important; }
-
-/* for events that continue to a future day, give the bottom border back */
-.fc-time-grid .fc-event.fc-not-end {
-  border-bottom-width: 1px !important; }
-
-/* indicate the event continues via "..." text */
-.fc-time-grid .fc-event.fc-not-end:after {
-  content: "..."; }
-
-/* for events that are continuations from previous days, give the top border back */
-.fc-time-grid .fc-event.fc-not-start {
-  border-top-width: 1px !important; }
-
-/* indicate the event is a continuation via "..." text */
-.fc-time-grid .fc-event.fc-not-start:before {
-  content: "..."; }
-
-/* time */
-/* undo a previous declaration and let the time text span to a second line */
-.fc-time-grid .fc-event .fc-time {
-  white-space: normal !important; }
-
-/* hide the the time that is normally displayed... */
-.fc-time-grid .fc-event .fc-time span {
-  display: none; }
-
-/* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
-.fc-time-grid .fc-event .fc-time:after {
-  content: attr(data-full); }
-
-/* Vertical Scroller & Containers
---------------------------------------------------------------------------------------------------*/
-/* kill the scrollbars and allow natural height */
-.fc-scroller,
-.fc-day-grid-container,
-.fc-time-grid-container {
-  /* */
-  overflow: visible !important;
-  height: auto !important; }
-
-/* kill the horizontal border/padding used to compensate for scrollbars */
-.fc-row {
-  border: 0 !important;
-  margin: 0 !important; }
-
-/* Button Controls
---------------------------------------------------------------------------------------------------*/
-.fc-button-group,
-.fc button {
-  display: none;
-  /* don't display any button-related controls */ }
diff --git a/backoffice/vendors/fullcalendar/fullcalendar.print.min.css b/backoffice/vendors/fullcalendar/fullcalendar.print.min.css
deleted file mode 100644 (file)
index 59a405c..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- *//*!
- * FullCalendar v3.9.0 Print Stylesheet
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-helper-container,.fc-helper-skeleton,.fc-highlight-container,.fc-highlight-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-agenda-view .fc-axis,.fc-popover{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/gcal.js b/backoffice/vendors/fullcalendar/gcal.js
deleted file mode 100644 (file)
index 14e7b02..0000000
+++ /dev/null
@@ -1,324 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-(function webpackUniversalModuleDefinition(root, factory) {
-       if(typeof exports === 'object' && typeof module === 'object')
-               module.exports = factory(require("fullcalendar"), require("jquery"));
-       else if(typeof define === 'function' && define.amd)
-               define(["fullcalendar", "jquery"], factory);
-       else if(typeof exports === 'object')
-               factory(require("fullcalendar"), require("jquery"));
-       else
-               factory(root["FullCalendar"], root["jQuery"]);
-})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE_1__, __WEBPACK_EXTERNAL_MODULE_3__) {
-return /******/ (function(modules) { // webpackBootstrap
-/******/       // The module cache
-/******/       var installedModules = {};
-/******/
-/******/       // The require function
-/******/       function __webpack_require__(moduleId) {
-/******/
-/******/               // Check if module is in cache
-/******/               if(installedModules[moduleId]) {
-/******/                       return installedModules[moduleId].exports;
-/******/               }
-/******/               // Create a new module (and put it into the cache)
-/******/               var module = installedModules[moduleId] = {
-/******/                       i: moduleId,
-/******/                       l: false,
-/******/                       exports: {}
-/******/               };
-/******/
-/******/               // Execute the module function
-/******/               modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
-/******/
-/******/               // Flag the module as loaded
-/******/               module.l = true;
-/******/
-/******/               // Return the exports of the module
-/******/               return module.exports;
-/******/       }
-/******/
-/******/
-/******/       // expose the modules object (__webpack_modules__)
-/******/       __webpack_require__.m = modules;
-/******/
-/******/       // expose the module cache
-/******/       __webpack_require__.c = installedModules;
-/******/
-/******/       // define getter function for harmony exports
-/******/       __webpack_require__.d = function(exports, name, getter) {
-/******/               if(!__webpack_require__.o(exports, name)) {
-/******/                       Object.defineProperty(exports, name, {
-/******/                               configurable: false,
-/******/                               enumerable: true,
-/******/                               get: getter
-/******/                       });
-/******/               }
-/******/       };
-/******/
-/******/       // getDefaultExport function for compatibility with non-harmony modules
-/******/       __webpack_require__.n = function(module) {
-/******/               var getter = module && module.__esModule ?
-/******/                       function getDefault() { return module['default']; } :
-/******/                       function getModuleExports() { return module; };
-/******/               __webpack_require__.d(getter, 'a', getter);
-/******/               return getter;
-/******/       };
-/******/
-/******/       // Object.prototype.hasOwnProperty.call
-/******/       __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
-/******/
-/******/       // __webpack_public_path__
-/******/       __webpack_require__.p = "";
-/******/
-/******/       // Load entry module and return exports
-/******/       return __webpack_require__(__webpack_require__.s = 266);
-/******/ })
-/************************************************************************/
-/******/ ({
-
-/***/ 1:
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE_1__;
-
-/***/ }),
-
-/***/ 2:
-/***/ (function(module, exports) {
-
-/*
-derived from:
-https://github.com/Microsoft/tslib/blob/v1.6.0/tslib.js
-
-only include the helpers we need, to keep down filesize
-*/
-var extendStatics = Object.setPrototypeOf ||
-    ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-    function (d, b) { for (var p in b)
-        if (b.hasOwnProperty(p))
-            d[p] = b[p]; };
-exports.__extends = function (d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-
-
-/***/ }),
-
-/***/ 266:
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var exportHooks = __webpack_require__(1);
-var GcalEventSource_1 = __webpack_require__(267);
-exportHooks.EventSourceParser.registerClass(GcalEventSource_1.default);
-exportHooks.GcalEventSource = GcalEventSource_1.default;
-
-
-/***/ }),
-
-/***/ 267:
-/***/ (function(module, exports, __webpack_require__) {
-
-Object.defineProperty(exports, "__esModule", { value: true });
-var tslib_1 = __webpack_require__(2);
-var $ = __webpack_require__(3);
-var fullcalendar_1 = __webpack_require__(1);
-var GcalEventSource = /** @class */ (function (_super) {
-    tslib_1.__extends(GcalEventSource, _super);
-    function GcalEventSource() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    GcalEventSource.parse = function (rawInput, calendar) {
-        var rawProps;
-        if (typeof rawInput === 'object') {
-            rawProps = rawInput;
-        }
-        else if (typeof rawInput === 'string') {
-            rawProps = { url: rawInput }; // url will be parsed with parseGoogleCalendarId
-        }
-        if (rawProps) {
-            return fullcalendar_1.EventSource.parse.call(this, rawProps, calendar);
-        }
-        return false;
-    };
-    GcalEventSource.prototype.fetch = function (start, end, timezone) {
-        var _this = this;
-        var url = this.buildUrl();
-        var requestParams = this.buildRequestParams(start, end, timezone);
-        var ajaxSettings = this.ajaxSettings || {};
-        var onSuccess = ajaxSettings.success;
-        if (!requestParams) {
-            return fullcalendar_1.Promise.reject();
-        }
-        this.calendar.pushLoading();
-        return fullcalendar_1.Promise.construct(function (onResolve, onReject) {
-            $.ajax($.extend({}, // destination
-            fullcalendar_1.JsonFeedEventSource.AJAX_DEFAULTS, ajaxSettings, {
-                url: url,
-                data: requestParams,
-                success: function (responseData, status, xhr) {
-                    var rawEventDefs;
-                    var successRes;
-                    _this.calendar.popLoading();
-                    if (responseData.error) {
-                        _this.reportError('Google Calendar API: ' + responseData.error.message, responseData.error.errors);
-                        onReject();
-                    }
-                    else if (responseData.items) {
-                        rawEventDefs = _this.gcalItemsToRawEventDefs(responseData.items, requestParams.timeZone);
-                        successRes = fullcalendar_1.applyAll(onSuccess, _this, [responseData, status, xhr]); // passthru
-                        if ($.isArray(successRes)) {
-                            rawEventDefs = successRes;
-                        }
-                        onResolve(_this.parseEventDefs(rawEventDefs));
-                    }
-                },
-                error: function (xhr, statusText, errorThrown) {
-                    _this.reportError('Google Calendar network failure: ' + statusText, [xhr, errorThrown]);
-                    _this.calendar.popLoading();
-                    onReject();
-                }
-            }));
-        });
-    };
-    GcalEventSource.prototype.gcalItemsToRawEventDefs = function (items, gcalTimezone) {
-        var _this = this;
-        return items.map(function (item) {
-            return _this.gcalItemToRawEventDef(item, gcalTimezone);
-        });
-    };
-    GcalEventSource.prototype.gcalItemToRawEventDef = function (item, gcalTimezone) {
-        var url = item.htmlLink || null;
-        // make the URLs for each event show times in the correct timezone
-        if (url && gcalTimezone) {
-            url = injectQsComponent(url, 'ctz=' + gcalTimezone);
-        }
-        return {
-            id: item.id,
-            title: item.summary,
-            start: item.start.dateTime || item.start.date,
-            end: item.end.dateTime || item.end.date,
-            url: url,
-            location: item.location,
-            description: item.description
-        };
-    };
-    GcalEventSource.prototype.buildUrl = function () {
-        return GcalEventSource.API_BASE + '/' +
-            encodeURIComponent(this.googleCalendarId) +
-            '/events?callback=?'; // jsonp
-    };
-    GcalEventSource.prototype.buildRequestParams = function (start, end, timezone) {
-        var apiKey = this.googleCalendarApiKey || this.calendar.opt('googleCalendarApiKey');
-        var params;
-        if (!apiKey) {
-            this.reportError('Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/');
-            return null;
-        }
-        // The API expects an ISO8601 datetime with a time and timezone part.
-        // Since the calendar's timezone offset isn't always known, request the date in UTC and pad it by a day on each
-        // side, guaranteeing we will receive all events in the desired range, albeit a superset.
-        // .utc() will set a zone and give it a 00:00:00 time.
-        if (!start.hasZone()) {
-            start = start.clone().utc().add(-1, 'day');
-        }
-        if (!end.hasZone()) {
-            end = end.clone().utc().add(1, 'day');
-        }
-        params = $.extend(this.ajaxSettings.data || {}, {
-            key: apiKey,
-            timeMin: start.format(),
-            timeMax: end.format(),
-            singleEvents: true,
-            maxResults: 9999
-        });
-        if (timezone && timezone !== 'local') {
-            // when sending timezone names to Google, only accepts underscores, not spaces
-            params.timeZone = timezone.replace(' ', '_');
-        }
-        return params;
-    };
-    GcalEventSource.prototype.reportError = function (message, apiErrorObjs) {
-        var calendar = this.calendar;
-        var calendarOnError = calendar.opt('googleCalendarError');
-        var errorObjs = apiErrorObjs || [{ message: message }]; // to be passed into error handlers
-        if (this.googleCalendarError) {
-            this.googleCalendarError.apply(calendar, errorObjs);
-        }
-        if (calendarOnError) {
-            calendarOnError.apply(calendar, errorObjs);
-        }
-        // print error to debug console
-        fullcalendar_1.warn.apply(null, [message].concat(apiErrorObjs || []));
-    };
-    GcalEventSource.prototype.getPrimitive = function () {
-        return this.googleCalendarId;
-    };
-    GcalEventSource.prototype.applyManualStandardProps = function (rawProps) {
-        var superSuccess = fullcalendar_1.EventSource.prototype.applyManualStandardProps.apply(this, arguments);
-        var googleCalendarId = rawProps.googleCalendarId;
-        if (googleCalendarId == null && rawProps.url) {
-            googleCalendarId = parseGoogleCalendarId(rawProps.url);
-        }
-        if (googleCalendarId != null) {
-            this.googleCalendarId = googleCalendarId;
-            return superSuccess;
-        }
-        return false;
-    };
-    GcalEventSource.prototype.applyMiscProps = function (rawProps) {
-        if (!this.ajaxSettings) {
-            this.ajaxSettings = {};
-        }
-        $.extend(this.ajaxSettings, rawProps);
-    };
-    GcalEventSource.API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
-    return GcalEventSource;
-}(fullcalendar_1.EventSource));
-exports.default = GcalEventSource;
-GcalEventSource.defineStandardProps({
-    // manually process...
-    url: false,
-    googleCalendarId: false,
-    // automatically transfer...
-    googleCalendarApiKey: true,
-    googleCalendarError: true
-});
-function parseGoogleCalendarId(url) {
-    var match;
-    // detect if the ID was specified as a single string.
-    // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
-    if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
-        return url;
-    }
-    else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
-        (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
-        return decodeURIComponent(match[1]);
-    }
-}
-// Injects a string like "arg=value" into the querystring of a URL
-function injectQsComponent(url, component) {
-    // inject it after the querystring but before the fragment
-    return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
-        return (qs ? qs + '&' : '?') + component + hash;
-    });
-}
-
-
-/***/ }),
-
-/***/ 3:
-/***/ (function(module, exports) {
-
-module.exports = __WEBPACK_EXTERNAL_MODULE_3__;
-
-/***/ })
-
-/******/ });
-});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/gcal.min.js b/backoffice/vendors/fullcalendar/gcal.min.js
deleted file mode 100644 (file)
index b0a949d..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * FullCalendar v3.9.0
- * Docs & License: https://fullcalendar.io/
- * (c) 2018 Adam Shaw
- */
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("fullcalendar"),require("jquery")):"function"==typeof define&&define.amd?define(["fullcalendar","jquery"],t):"object"==typeof exports?t(require("fullcalendar"),require("jquery")):t(e.FullCalendar,e.jQuery)}("undefined"!=typeof self?self:this,function(e,t){return function(e){function t(o){if(r[o])return r[o].exports;var n=r[o]={i:o,l:!1,exports:{}};return e[o].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,o){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:o})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=266)}({1:function(t,r){t.exports=e},2:function(e,t){var r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])};t.__extends=function(e,t){function o(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(o.prototype=t.prototype,new o)}},266:function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0});var o=r(1),n=r(267);o.EventSourceParser.registerClass(n.default),o.GcalEventSource=n.default},267:function(e,t,r){function o(e){var t;return/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(e)?e:(t=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(e))||(t=/^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(e))?decodeURIComponent(t[1]):void 0}function n(e,t){return e.replace(/(\?.*?)?(#|$)/,function(e,r,o){return(r?r+"&":"?")+t+o})}Object.defineProperty(t,"__esModule",{value:!0});var a=r(2),l=r(3),i=r(1),u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return a.__extends(t,e),t.parse=function(e,t){var r;return"object"==typeof e?r=e:"string"==typeof e&&(r={url:e}),!!r&&i.EventSource.parse.call(this,r,t)},t.prototype.fetch=function(e,t,r){var o=this,n=this.buildUrl(),a=this.buildRequestParams(e,t,r),u=this.ajaxSettings||{},c=u.success;return a?(this.calendar.pushLoading(),i.Promise.construct(function(e,t){l.ajax(l.extend({},i.JsonFeedEventSource.AJAX_DEFAULTS,u,{url:n,data:a,success:function(r,n,u){var s,p;o.calendar.popLoading(),r.error?(o.reportError("Google Calendar API: "+r.error.message,r.error.errors),t()):r.items&&(s=o.gcalItemsToRawEventDefs(r.items,a.timeZone),p=i.applyAll(c,o,[r,n,u]),l.isArray(p)&&(s=p),e(o.parseEventDefs(s)))},error:function(e,r,n){o.reportError("Google Calendar network failure: "+r,[e,n]),o.calendar.popLoading(),t()}}))})):i.Promise.reject()},t.prototype.gcalItemsToRawEventDefs=function(e,t){var r=this;return e.map(function(e){return r.gcalItemToRawEventDef(e,t)})},t.prototype.gcalItemToRawEventDef=function(e,t){var r=e.htmlLink||null;return r&&t&&(r=n(r,"ctz="+t)),{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:r,location:e.location,description:e.description}},t.prototype.buildUrl=function(){return t.API_BASE+"/"+encodeURIComponent(this.googleCalendarId)+"/events?callback=?"},t.prototype.buildRequestParams=function(e,t,r){var o,n=this.googleCalendarApiKey||this.calendar.opt("googleCalendarApiKey");return n?(e.hasZone()||(e=e.clone().utc().add(-1,"day")),t.hasZone()||(t=t.clone().utc().add(1,"day")),o=l.extend(this.ajaxSettings.data||{},{key:n,timeMin:e.format(),timeMax:t.format(),singleEvents:!0,maxResults:9999}),r&&"local"!==r&&(o.timeZone=r.replace(" ","_")),o):(this.reportError("Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"),null)},t.prototype.reportError=function(e,t){var r=this.calendar,o=r.opt("googleCalendarError"),n=t||[{message:e}];this.googleCalendarError&&this.googleCalendarError.apply(r,n),o&&o.apply(r,n),i.warn.apply(null,[e].concat(t||[]))},t.prototype.getPrimitive=function(){return this.googleCalendarId},t.prototype.applyManualStandardProps=function(e){var t=i.EventSource.prototype.applyManualStandardProps.apply(this,arguments),r=e.googleCalendarId;return null==r&&e.url&&(r=o(e.url)),null!=r&&(this.googleCalendarId=r,t)},t.prototype.applyMiscProps=function(e){this.ajaxSettings||(this.ajaxSettings={}),l.extend(this.ajaxSettings,e)},t.API_BASE="https://www.googleapis.com/calendar/v3/calendars",t}(i.EventSource);t.default=u,u.defineStandardProps({url:!1,googleCalendarId:!1,googleCalendarApiKey:!0,googleCalendarError:!0})},3:function(e,r){e.exports=t}})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/interaction/LICENSE.txt b/backoffice/vendors/fullcalendar/interaction/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/interaction/README.md b/backoffice/vendors/fullcalendar/interaction/README.md
new file mode 100644 (file)
index 0000000..ee5c738
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Interaction Plugin
+
+Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions
+
+[View the docs &raquo;](https://fullcalendar.io/docs/editable)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/interaction/main.d.ts b/backoffice/vendors/fullcalendar/interaction/main.d.ts
new file mode 100644 (file)
index 0000000..ed0006c
--- /dev/null
@@ -0,0 +1,423 @@
+declare module "@fullcalendar/interaction/dnd/PointerDragging" {
+    import { EmitterMixin, PointerDragEvent } from "@fullcalendar/core";
+    export { PointerDragging as default, PointerDragging };
+    class PointerDragging {
+        containerEl: EventTarget;
+        subjectEl: HTMLElement | null;
+        downEl: HTMLElement | null;
+        emitter: EmitterMixin;
+        selector: string;
+        handleSelector: string;
+        shouldIgnoreMove: boolean;
+        shouldWatchScroll: boolean;
+        isDragging: boolean;
+        isTouchDragging: boolean;
+        wasTouchScroll: boolean;
+        origPageX: number;
+        origPageY: number;
+        prevPageX: number;
+        prevPageY: number;
+        prevScrollX: number;
+        prevScrollY: number;
+        constructor(containerEl: EventTarget);
+        destroy(): void;
+        tryStart(ev: UIEvent): boolean;
+        cleanup(): void;
+        querySubjectEl(ev: UIEvent): HTMLElement;
+        handleMouseDown: (ev: MouseEvent) => void;
+        handleMouseMove: (ev: MouseEvent) => void;
+        handleMouseUp: (ev: MouseEvent) => void;
+        shouldIgnoreMouse(): number | boolean;
+        handleTouchStart: (ev: TouchEvent) => void;
+        handleTouchMove: (ev: TouchEvent) => void;
+        handleTouchEnd: (ev: TouchEvent) => void;
+        handleTouchScroll: () => void;
+        cancelTouchScroll(): void;
+        initScrollWatch(ev: PointerDragEvent): void;
+        recordCoords(ev: PointerDragEvent): void;
+        handleScroll: (ev: UIEvent) => void;
+        destroyScrollWatch(): void;
+        createEventFromMouse(ev: MouseEvent, isFirst?: boolean): PointerDragEvent;
+        createEventFromTouch(ev: TouchEvent, isFirst?: boolean): PointerDragEvent;
+    }
+}
+
+declare module "@fullcalendar/interaction/dnd/ElementMirror" {
+    import { Rect } from "@fullcalendar/core";
+    export { ElementMirror as default, ElementMirror };
+    class ElementMirror {
+        isVisible: boolean;
+        origScreenX?: number;
+        origScreenY?: number;
+        deltaX?: number;
+        deltaY?: number;
+        sourceEl: HTMLElement | null;
+        mirrorEl: HTMLElement | null;
+        sourceElRect: Rect | null;
+        parentNode: HTMLElement;
+        zIndex: number;
+        revertDuration: number;
+        start(sourceEl: HTMLElement, pageX: number, pageY: number): void;
+        handleMove(pageX: number, pageY: number): void;
+        setIsVisible(bool: boolean): void;
+        stop(needsRevertAnimation: boolean, callback: () => void): void;
+        doRevertAnimation(callback: () => void, revertDuration: number): void;
+        cleanup(): void;
+        updateElPosition(): void;
+        getMirrorEl(): HTMLElement;
+    }
+}
+
+declare module "@fullcalendar/interaction/scroll-geom-cache" {
+    import { Rect, ScrollController } from "@fullcalendar/core";
+    export abstract class ScrollGeomCache extends ScrollController {
+        clientRect: Rect;
+        origScrollTop: number;
+        origScrollLeft: number;
+        protected scrollController: ScrollController;
+        protected doesListening: boolean;
+        protected scrollTop: number;
+        protected scrollLeft: number;
+        protected scrollWidth: number;
+        protected scrollHeight: number;
+        protected clientWidth: number;
+        protected clientHeight: number;
+        constructor(scrollController: ScrollController, doesListening: boolean);
+        abstract getEventTarget(): EventTarget;
+        abstract computeClientRect(): Rect;
+        destroy(): void;
+        handleScroll: () => void;
+        getScrollTop(): number;
+        getScrollLeft(): number;
+        setScrollTop(top: number): void;
+        setScrollLeft(top: number): void;
+        getClientWidth(): number;
+        getClientHeight(): number;
+        getScrollWidth(): number;
+        getScrollHeight(): number;
+        handleScrollChange(): void;
+    }
+    export class ElementScrollGeomCache extends ScrollGeomCache {
+        constructor(el: HTMLElement, doesListening: boolean);
+        getEventTarget(): EventTarget;
+        computeClientRect(): {
+            left: number;
+            right: number;
+            top: number;
+            bottom: number;
+        };
+    }
+    export class WindowScrollGeomCache extends ScrollGeomCache {
+        constructor(doesListening: boolean);
+        getEventTarget(): EventTarget;
+        computeClientRect(): Rect;
+        handleScrollChange(): void;
+    }
+}
+
+declare module "@fullcalendar/interaction/dnd/AutoScroller" {
+    import { ScrollGeomCache } from "@fullcalendar/interaction/scroll-geom-cache";
+    export { AutoScroller as default, AutoScroller };
+    class AutoScroller {
+        isEnabled: boolean;
+        scrollQuery: (Window | string)[];
+        edgeThreshold: number;
+        maxVelocity: number;
+        pointerScreenX: number | null;
+        pointerScreenY: number | null;
+        isAnimating: boolean;
+        scrollCaches: ScrollGeomCache[] | null;
+        msSinceRequest?: number;
+        everMovedUp: boolean;
+        everMovedDown: boolean;
+        everMovedLeft: boolean;
+        everMovedRight: boolean;
+        start(pageX: number, pageY: number): void;
+        handleMove(pageX: number, pageY: number): void;
+        stop(): void;
+        requestAnimation(now: number): void;
+        private animate;
+        private handleSide;
+        private computeBestEdge;
+        private buildCaches;
+        private queryScrollEls;
+    }
+}
+
+declare module "@fullcalendar/interaction/dnd/FeaturefulElementDragging" {
+    import { PointerDragEvent, ElementDragging } from "@fullcalendar/core";
+    import PointerDragging from "@fullcalendar/interaction/dnd/PointerDragging";
+    import ElementMirror from "@fullcalendar/interaction/dnd/ElementMirror";
+    import AutoScroller from "@fullcalendar/interaction/dnd/AutoScroller";
+    export { FeaturefulElementDragging as default, FeaturefulElementDragging };
+    class FeaturefulElementDragging extends ElementDragging {
+        pointer: PointerDragging;
+        mirror: ElementMirror;
+        autoScroller: AutoScroller;
+        delay: number | null;
+        minDistance: number;
+        touchScrollAllowed: boolean;
+        mirrorNeedsRevert: boolean;
+        isInteracting: boolean;
+        isDragging: boolean;
+        isDelayEnded: boolean;
+        isDistanceSurpassed: boolean;
+        delayTimeoutId: number | null;
+        constructor(containerEl: HTMLElement);
+        destroy(): void;
+        onPointerDown: (ev: PointerDragEvent) => void;
+        onPointerMove: (ev: PointerDragEvent) => void;
+        onPointerUp: (ev: PointerDragEvent) => void;
+        startDelay(ev: PointerDragEvent): void;
+        handleDelayEnd(ev: PointerDragEvent): void;
+        handleDistanceSurpassed(ev: PointerDragEvent): void;
+        tryStartDrag(ev: PointerDragEvent): void;
+        tryStopDrag(ev: PointerDragEvent): void;
+        stopDrag(ev: PointerDragEvent): void;
+        setIgnoreMove(bool: boolean): void;
+        setMirrorIsVisible(bool: boolean): void;
+        setMirrorNeedsRevert(bool: boolean): void;
+        setAutoScrollEnabled(bool: boolean): void;
+    }
+}
+
+declare module "@fullcalendar/interaction/OffsetTracker" {
+    import { Rect } from "@fullcalendar/core";
+    import { ElementScrollGeomCache } from "@fullcalendar/interaction/scroll-geom-cache";
+    export { OffsetTracker as default, OffsetTracker };
+    class OffsetTracker {
+        scrollCaches: ElementScrollGeomCache[];
+        origRect: Rect;
+        constructor(el: HTMLElement);
+        destroy(): void;
+        computeLeft(): number;
+        computeTop(): number;
+        isWithinClipping(pageX: number, pageY: number): boolean;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions/HitDragging" {
+    import { EmitterMixin, PointerDragEvent, Point, Hit, InteractionSettingsStore, ElementDragging } from "@fullcalendar/core";
+    import OffsetTracker from "@fullcalendar/interaction/OffsetTracker";
+    export { HitDragging as default, HitDragging };
+    class HitDragging {
+        droppableStore: InteractionSettingsStore;
+        dragging: ElementDragging;
+        emitter: EmitterMixin;
+        useSubjectCenter: boolean;
+        requireInitial: boolean;
+        offsetTrackers: {
+            [componentUid: string]: OffsetTracker;
+        };
+        initialHit: Hit | null;
+        movingHit: Hit | null;
+        finalHit: Hit | null;
+        coordAdjust?: Point;
+        constructor(dragging: ElementDragging, droppableStore: InteractionSettingsStore);
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        processFirstCoord(ev: PointerDragEvent): void;
+        handleDragStart: (ev: PointerDragEvent) => void;
+        handleDragMove: (ev: PointerDragEvent) => void;
+        handlePointerUp: (ev: PointerDragEvent) => void;
+        handleDragEnd: (ev: PointerDragEvent) => void;
+        handleMove(ev: PointerDragEvent, forceHandle?: boolean): void;
+        prepareHits(): void;
+        releaseHits(): void;
+        queryHitForOffset(offsetLeft: number, offsetTop: number): Hit | null;
+    }
+    export function isHitsEqual(hit0: Hit | null, hit1: Hit | null): boolean;
+}
+
+declare module "@fullcalendar/interaction/interactions/DateClicking" {
+    import { PointerDragEvent, Interaction, InteractionSettings } from "@fullcalendar/core";
+    import FeaturefulElementDragging from "@fullcalendar/interaction/dnd/FeaturefulElementDragging";
+    import HitDragging from "@fullcalendar/interaction/interactions/HitDragging";
+    export { DateClicking as default, DateClicking };
+    class DateClicking extends Interaction {
+        dragging: FeaturefulElementDragging;
+        hitDragging: HitDragging;
+        constructor(settings: InteractionSettings);
+        destroy(): void;
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        handleDragEnd: (ev: PointerDragEvent) => void;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions/DateSelecting" {
+    import { Hit, DateSpan, PointerDragEvent, Interaction, InteractionSettings } from "@fullcalendar/core";
+    import HitDragging from "@fullcalendar/interaction/interactions/HitDragging";
+    import FeaturefulElementDragging from "@fullcalendar/interaction/dnd/FeaturefulElementDragging";
+    export { DateSelecting as default, DateSelecting };
+    class DateSelecting extends Interaction {
+        dragging: FeaturefulElementDragging;
+        hitDragging: HitDragging;
+        dragSelection: DateSpan | null;
+        constructor(settings: InteractionSettings);
+        destroy(): void;
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        handleDragStart: (ev: PointerDragEvent) => void;
+        handleHitUpdate: (hit: Hit, isFinal: boolean) => void;
+        handlePointerUp: (pev: PointerDragEvent) => void;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions-external/ExternalElementDragging" {
+    import { Hit, PointerDragEvent, EventTuple, DatePointApi, Calendar, EventInteractionState, DragMetaInput, DragMeta, View, ElementDragging } from "@fullcalendar/core";
+    import HitDragging from "@fullcalendar/interaction/interactions/HitDragging";
+    export type DragMetaGenerator = DragMetaInput | ((el: HTMLElement) => DragMetaInput);
+    export interface ExternalDropApi extends DatePointApi {
+        draggedEl: HTMLElement;
+        jsEvent: UIEvent;
+        view: View;
+    }
+    export { ExternalElementDragging as default, ExternalElementDragging };
+    class ExternalElementDragging {
+        hitDragging: HitDragging;
+        receivingCalendar: Calendar | null;
+        droppableEvent: EventTuple | null;
+        suppliedDragMeta: DragMetaGenerator | null;
+        dragMeta: DragMeta | null;
+        constructor(dragging: ElementDragging, suppliedDragMeta?: DragMetaGenerator);
+        handleDragStart: (ev: PointerDragEvent) => void;
+        buildDragMeta(subjectEl: HTMLElement): DragMeta;
+        handleHitUpdate: (hit: Hit, isFinal: boolean, ev: PointerDragEvent) => void;
+        handleDragEnd: (pev: PointerDragEvent) => void;
+        displayDrag(nextCalendar: Calendar | null, state: EventInteractionState): void;
+        clearDrag(): void;
+        canDropElOnCalendar(el: HTMLElement, receivingCalendar: Calendar): boolean;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions/EventDragging" {
+    import { Seg, PointerDragEvent, Hit, EventMutation, EventStore, Calendar, EventInteractionState, EventRenderRange, Interaction, InteractionSettings } from "@fullcalendar/core";
+    import HitDragging from "@fullcalendar/interaction/interactions/HitDragging";
+    import FeaturefulElementDragging from "@fullcalendar/interaction/dnd/FeaturefulElementDragging";
+    export { EventDragging as default, EventDragging };
+    class EventDragging extends Interaction {
+        static SELECTOR: string;
+        dragging: FeaturefulElementDragging;
+        hitDragging: HitDragging;
+        subjectSeg: Seg | null;
+        isDragging: boolean;
+        eventRange: EventRenderRange | null;
+        relevantEvents: EventStore | null;
+        receivingCalendar: Calendar | null;
+        validMutation: EventMutation | null;
+        mutatedRelevantEvents: EventStore | null;
+        constructor(settings: InteractionSettings);
+        destroy(): void;
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        handleDragStart: (ev: PointerDragEvent) => void;
+        handleHitUpdate: (hit: Hit, isFinal: boolean) => void;
+        handlePointerUp: () => void;
+        handleDragEnd: (ev: PointerDragEvent) => void;
+        displayDrag(nextCalendar: Calendar | null, state: EventInteractionState): void;
+        clearDrag(): void;
+        cleanup(): void;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions/EventResizing" {
+    import { Seg, Hit, EventMutation, PointerDragEvent, EventStore, EventRenderRange, Interaction, InteractionSettings } from "@fullcalendar/core";
+    import HitDragging from "@fullcalendar/interaction/interactions/HitDragging";
+    import FeaturefulElementDragging from "@fullcalendar/interaction/dnd/FeaturefulElementDragging";
+    export { EventDragging as default, EventDragging };
+    class EventDragging extends Interaction {
+        dragging: FeaturefulElementDragging;
+        hitDragging: HitDragging;
+        draggingSeg: Seg | null;
+        eventRange: EventRenderRange | null;
+        relevantEvents: EventStore | null;
+        validMutation: EventMutation | null;
+        mutatedRelevantEvents: EventStore | null;
+        constructor(settings: InteractionSettings);
+        destroy(): void;
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        handleDragStart: (ev: PointerDragEvent) => void;
+        handleHitUpdate: (hit: Hit, isFinal: boolean, ev: PointerDragEvent) => void;
+        handleDragEnd: (ev: PointerDragEvent) => void;
+        querySeg(ev: PointerDragEvent): Seg | null;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions/UnselectAuto" {
+    import { Calendar, DateSelectionApi, PointerDragEvent } from "@fullcalendar/core";
+    import PointerDragging from "@fullcalendar/interaction/dnd/PointerDragging";
+    export { UnselectAuto as default, UnselectAuto };
+    class UnselectAuto {
+        calendar: Calendar;
+        documentPointer: PointerDragging;
+        isRecentPointerDateSelect: boolean;
+        constructor(calendar: Calendar);
+        destroy(): void;
+        onSelect: (selectInfo: DateSelectionApi) => void;
+        onDocumentPointerUp: (pev: PointerDragEvent) => void;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions-external/ExternalDraggable" {
+    import { PointerDragEvent } from "@fullcalendar/core";
+    import FeaturefulElementDragging from "@fullcalendar/interaction/dnd/FeaturefulElementDragging";
+    import { DragMetaGenerator } from "@fullcalendar/interaction/interactions-external/ExternalElementDragging";
+    export interface ExternalDraggableSettings {
+        eventData?: DragMetaGenerator;
+        itemSelector?: string;
+        minDistance?: number;
+        longPressDelay?: number;
+        appendTo?: HTMLElement;
+    }
+    export { ExternalDraggable as default, ExternalDraggable };
+    class ExternalDraggable {
+        dragging: FeaturefulElementDragging;
+        settings: ExternalDraggableSettings;
+        constructor(el: HTMLElement, settings?: ExternalDraggableSettings);
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        handleDragStart: (ev: PointerDragEvent) => void;
+        destroy(): void;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions-external/InferredElementDragging" {
+    import { PointerDragEvent, ElementDragging } from "@fullcalendar/core";
+    import PointerDragging from "@fullcalendar/interaction/dnd/PointerDragging";
+    export { InferredElementDragging as default, InferredElementDragging };
+    class InferredElementDragging extends ElementDragging {
+        pointer: PointerDragging;
+        shouldIgnoreMove: boolean;
+        mirrorSelector: string;
+        currentMirrorEl: HTMLElement | null;
+        constructor(containerEl: HTMLElement);
+        destroy(): void;
+        handlePointerDown: (ev: PointerDragEvent) => void;
+        handlePointerMove: (ev: PointerDragEvent) => void;
+        handlePointerUp: (ev: PointerDragEvent) => void;
+        setIgnoreMove(bool: boolean): void;
+        setMirrorIsVisible(bool: boolean): void;
+    }
+}
+
+declare module "@fullcalendar/interaction/interactions-external/ThirdPartyDraggable" {
+    import { DragMetaGenerator } from "@fullcalendar/interaction/interactions-external/ExternalElementDragging";
+    import InferredElementDragging from "@fullcalendar/interaction/interactions-external/InferredElementDragging";
+    export interface ThirdPartyDraggableSettings {
+        eventData?: DragMetaGenerator;
+        itemSelector?: string;
+        mirrorSelector?: string;
+    }
+    export { ThirdPartyDraggable as default, ThirdPartyDraggable };
+    class ThirdPartyDraggable {
+        dragging: InferredElementDragging;
+        constructor(containerOrSettings?: EventTarget | ThirdPartyDraggableSettings, settings?: ThirdPartyDraggableSettings);
+        destroy(): void;
+    }
+}
+
+declare module "@fullcalendar/interaction" {
+    import FeaturefulElementDragging from "@fullcalendar/interaction/dnd/FeaturefulElementDragging";
+    const _default_8: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_8;
+    export { FeaturefulElementDragging };
+    export { default as PointerDragging } from "@fullcalendar/interaction/dnd/PointerDragging";
+    export { default as Draggable } from "@fullcalendar/interaction/interactions-external/ExternalDraggable";
+    export { default as ThirdPartyDraggable } from "@fullcalendar/interaction/interactions-external/ThirdPartyDraggable";
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/interaction/main.js b/backoffice/vendors/fullcalendar/interaction/main.js
new file mode 100644 (file)
index 0000000..0132136
--- /dev/null
@@ -0,0 +1,2156 @@
+/*!
+FullCalendar Interaction Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarInteraction = {}, global.FullCalendar));
+}(this, function (exports, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    core.config.touchMouseIgnoreWait = 500;
+    var ignoreMouseDepth = 0;
+    var listenerCnt = 0;
+    var isWindowTouchMoveCancelled = false;
+    /*
+    Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
+    Tracks when the pointer "drags" on a certain element, meaning down+move+up.
+
+    Also, tracks if there was touch-scrolling.
+    Also, can prevent touch-scrolling from happening.
+    Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
+
+    emits:
+    - pointerdown
+    - pointermove
+    - pointerup
+    */
+    var PointerDragging = /** @class */ (function () {
+        function PointerDragging(containerEl) {
+            var _this = this;
+            this.subjectEl = null;
+            this.downEl = null;
+            // options that can be directly assigned by caller
+            this.selector = ''; // will cause subjectEl in all emitted events to be this element
+            this.handleSelector = '';
+            this.shouldIgnoreMove = false;
+            this.shouldWatchScroll = true; // for simulating pointermove on scroll
+            // internal states
+            this.isDragging = false;
+            this.isTouchDragging = false;
+            this.wasTouchScroll = false;
+            // Mouse
+            // ----------------------------------------------------------------------------------------------------
+            this.handleMouseDown = function (ev) {
+                if (!_this.shouldIgnoreMouse() &&
+                    isPrimaryMouseButton(ev) &&
+                    _this.tryStart(ev)) {
+                    var pev = _this.createEventFromMouse(ev, true);
+                    _this.emitter.trigger('pointerdown', pev);
+                    _this.initScrollWatch(pev);
+                    if (!_this.shouldIgnoreMove) {
+                        document.addEventListener('mousemove', _this.handleMouseMove);
+                    }
+                    document.addEventListener('mouseup', _this.handleMouseUp);
+                }
+            };
+            this.handleMouseMove = function (ev) {
+                var pev = _this.createEventFromMouse(ev);
+                _this.recordCoords(pev);
+                _this.emitter.trigger('pointermove', pev);
+            };
+            this.handleMouseUp = function (ev) {
+                document.removeEventListener('mousemove', _this.handleMouseMove);
+                document.removeEventListener('mouseup', _this.handleMouseUp);
+                _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
+                _this.cleanup(); // call last so that pointerup has access to props
+            };
+            // Touch
+            // ----------------------------------------------------------------------------------------------------
+            this.handleTouchStart = function (ev) {
+                if (_this.tryStart(ev)) {
+                    _this.isTouchDragging = true;
+                    var pev = _this.createEventFromTouch(ev, true);
+                    _this.emitter.trigger('pointerdown', pev);
+                    _this.initScrollWatch(pev);
+                    // unlike mouse, need to attach to target, not document
+                    // https://stackoverflow.com/a/45760014
+                    var target = ev.target;
+                    if (!_this.shouldIgnoreMove) {
+                        target.addEventListener('touchmove', _this.handleTouchMove);
+                    }
+                    target.addEventListener('touchend', _this.handleTouchEnd);
+                    target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
+                    // attach a handler to get called when ANY scroll action happens on the page.
+                    // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
+                    // http://stackoverflow.com/a/32954565/96342
+                    window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
+                    );
+                }
+            };
+            this.handleTouchMove = function (ev) {
+                var pev = _this.createEventFromTouch(ev);
+                _this.recordCoords(pev);
+                _this.emitter.trigger('pointermove', pev);
+            };
+            this.handleTouchEnd = function (ev) {
+                if (_this.isDragging) { // done to guard against touchend followed by touchcancel
+                    var target = ev.target;
+                    target.removeEventListener('touchmove', _this.handleTouchMove);
+                    target.removeEventListener('touchend', _this.handleTouchEnd);
+                    target.removeEventListener('touchcancel', _this.handleTouchEnd);
+                    window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
+                    _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
+                    _this.cleanup(); // call last so that pointerup has access to props
+                    _this.isTouchDragging = false;
+                    startIgnoringMouse();
+                }
+            };
+            this.handleTouchScroll = function () {
+                _this.wasTouchScroll = true;
+            };
+            this.handleScroll = function (ev) {
+                if (!_this.shouldIgnoreMove) {
+                    var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
+                    var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
+                    _this.emitter.trigger('pointermove', {
+                        origEvent: ev,
+                        isTouch: _this.isTouchDragging,
+                        subjectEl: _this.subjectEl,
+                        pageX: pageX,
+                        pageY: pageY,
+                        deltaX: pageX - _this.origPageX,
+                        deltaY: pageY - _this.origPageY
+                    });
+                }
+            };
+            this.containerEl = containerEl;
+            this.emitter = new core.EmitterMixin();
+            containerEl.addEventListener('mousedown', this.handleMouseDown);
+            containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
+            listenerCreated();
+        }
+        PointerDragging.prototype.destroy = function () {
+            this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
+            this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
+            listenerDestroyed();
+        };
+        PointerDragging.prototype.tryStart = function (ev) {
+            var subjectEl = this.querySubjectEl(ev);
+            var downEl = ev.target;
+            if (subjectEl &&
+                (!this.handleSelector || core.elementClosest(downEl, this.handleSelector))) {
+                this.subjectEl = subjectEl;
+                this.downEl = downEl;
+                this.isDragging = true; // do this first so cancelTouchScroll will work
+                this.wasTouchScroll = false;
+                return true;
+            }
+            return false;
+        };
+        PointerDragging.prototype.cleanup = function () {
+            isWindowTouchMoveCancelled = false;
+            this.isDragging = false;
+            this.subjectEl = null;
+            this.downEl = null;
+            // keep wasTouchScroll around for later access
+            this.destroyScrollWatch();
+        };
+        PointerDragging.prototype.querySubjectEl = function (ev) {
+            if (this.selector) {
+                return core.elementClosest(ev.target, this.selector);
+            }
+            else {
+                return this.containerEl;
+            }
+        };
+        PointerDragging.prototype.shouldIgnoreMouse = function () {
+            return ignoreMouseDepth || this.isTouchDragging;
+        };
+        // can be called by user of this class, to cancel touch-based scrolling for the current drag
+        PointerDragging.prototype.cancelTouchScroll = function () {
+            if (this.isDragging) {
+                isWindowTouchMoveCancelled = true;
+            }
+        };
+        // Scrolling that simulates pointermoves
+        // ----------------------------------------------------------------------------------------------------
+        PointerDragging.prototype.initScrollWatch = function (ev) {
+            if (this.shouldWatchScroll) {
+                this.recordCoords(ev);
+                window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
+            }
+        };
+        PointerDragging.prototype.recordCoords = function (ev) {
+            if (this.shouldWatchScroll) {
+                this.prevPageX = ev.pageX;
+                this.prevPageY = ev.pageY;
+                this.prevScrollX = window.pageXOffset;
+                this.prevScrollY = window.pageYOffset;
+            }
+        };
+        PointerDragging.prototype.destroyScrollWatch = function () {
+            if (this.shouldWatchScroll) {
+                window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
+            }
+        };
+        // Event Normalization
+        // ----------------------------------------------------------------------------------------------------
+        PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
+            var deltaX = 0;
+            var deltaY = 0;
+            // TODO: repeat code
+            if (isFirst) {
+                this.origPageX = ev.pageX;
+                this.origPageY = ev.pageY;
+            }
+            else {
+                deltaX = ev.pageX - this.origPageX;
+                deltaY = ev.pageY - this.origPageY;
+            }
+            return {
+                origEvent: ev,
+                isTouch: false,
+                subjectEl: this.subjectEl,
+                pageX: ev.pageX,
+                pageY: ev.pageY,
+                deltaX: deltaX,
+                deltaY: deltaY
+            };
+        };
+        PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
+            var touches = ev.touches;
+            var pageX;
+            var pageY;
+            var deltaX = 0;
+            var deltaY = 0;
+            // if touch coords available, prefer,
+            // because FF would give bad ev.pageX ev.pageY
+            if (touches && touches.length) {
+                pageX = touches[0].pageX;
+                pageY = touches[0].pageY;
+            }
+            else {
+                pageX = ev.pageX;
+                pageY = ev.pageY;
+            }
+            // TODO: repeat code
+            if (isFirst) {
+                this.origPageX = pageX;
+                this.origPageY = pageY;
+            }
+            else {
+                deltaX = pageX - this.origPageX;
+                deltaY = pageY - this.origPageY;
+            }
+            return {
+                origEvent: ev,
+                isTouch: true,
+                subjectEl: this.subjectEl,
+                pageX: pageX,
+                pageY: pageY,
+                deltaX: deltaX,
+                deltaY: deltaY
+            };
+        };
+        return PointerDragging;
+    }());
+    // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
+    function isPrimaryMouseButton(ev) {
+        return ev.button === 0 && !ev.ctrlKey;
+    }
+    // Ignoring fake mouse events generated by touch
+    // ----------------------------------------------------------------------------------------------------
+    function startIgnoringMouse() {
+        ignoreMouseDepth++;
+        setTimeout(function () {
+            ignoreMouseDepth--;
+        }, core.config.touchMouseIgnoreWait);
+    }
+    // We want to attach touchmove as early as possible for Safari
+    // ----------------------------------------------------------------------------------------------------
+    function listenerCreated() {
+        if (!(listenerCnt++)) {
+            window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
+        }
+    }
+    function listenerDestroyed() {
+        if (!(--listenerCnt)) {
+            window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
+        }
+    }
+    function onWindowTouchMove(ev) {
+        if (isWindowTouchMoveCancelled) {
+            ev.preventDefault();
+        }
+    }
+
+    /*
+    An effect in which an element follows the movement of a pointer across the screen.
+    The moving element is a clone of some other element.
+    Must call start + handleMove + stop.
+    */
+    var ElementMirror = /** @class */ (function () {
+        function ElementMirror() {
+            this.isVisible = false; // must be explicitly enabled
+            this.sourceEl = null;
+            this.mirrorEl = null;
+            this.sourceElRect = null; // screen coords relative to viewport
+            // options that can be set directly by caller
+            this.parentNode = document.body;
+            this.zIndex = 9999;
+            this.revertDuration = 0;
+        }
+        ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
+            this.sourceEl = sourceEl;
+            this.sourceElRect = this.sourceEl.getBoundingClientRect();
+            this.origScreenX = pageX - window.pageXOffset;
+            this.origScreenY = pageY - window.pageYOffset;
+            this.deltaX = 0;
+            this.deltaY = 0;
+            this.updateElPosition();
+        };
+        ElementMirror.prototype.handleMove = function (pageX, pageY) {
+            this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
+            this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
+            this.updateElPosition();
+        };
+        // can be called before start
+        ElementMirror.prototype.setIsVisible = function (bool) {
+            if (bool) {
+                if (!this.isVisible) {
+                    if (this.mirrorEl) {
+                        this.mirrorEl.style.display = '';
+                    }
+                    this.isVisible = bool; // needs to happen before updateElPosition
+                    this.updateElPosition(); // because was not updating the position while invisible
+                }
+            }
+            else {
+                if (this.isVisible) {
+                    if (this.mirrorEl) {
+                        this.mirrorEl.style.display = 'none';
+                    }
+                    this.isVisible = bool;
+                }
+            }
+        };
+        // always async
+        ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
+            var _this = this;
+            var done = function () {
+                _this.cleanup();
+                callback();
+            };
+            if (needsRevertAnimation &&
+                this.mirrorEl &&
+                this.isVisible &&
+                this.revertDuration && // if 0, transition won't work
+                (this.deltaX || this.deltaY) // if same coords, transition won't work
+            ) {
+                this.doRevertAnimation(done, this.revertDuration);
+            }
+            else {
+                setTimeout(done, 0);
+            }
+        };
+        ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
+            var mirrorEl = this.mirrorEl;
+            var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
+            mirrorEl.style.transition =
+                'top ' + revertDuration + 'ms,' +
+                    'left ' + revertDuration + 'ms';
+            core.applyStyle(mirrorEl, {
+                left: finalSourceElRect.left,
+                top: finalSourceElRect.top
+            });
+            core.whenTransitionDone(mirrorEl, function () {
+                mirrorEl.style.transition = '';
+                callback();
+            });
+        };
+        ElementMirror.prototype.cleanup = function () {
+            if (this.mirrorEl) {
+                core.removeElement(this.mirrorEl);
+                this.mirrorEl = null;
+            }
+            this.sourceEl = null;
+        };
+        ElementMirror.prototype.updateElPosition = function () {
+            if (this.sourceEl && this.isVisible) {
+                core.applyStyle(this.getMirrorEl(), {
+                    left: this.sourceElRect.left + this.deltaX,
+                    top: this.sourceElRect.top + this.deltaY
+                });
+            }
+        };
+        ElementMirror.prototype.getMirrorEl = function () {
+            var sourceElRect = this.sourceElRect;
+            var mirrorEl = this.mirrorEl;
+            if (!mirrorEl) {
+                mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
+                // we don't want long taps or any mouse interaction causing selection/menus.
+                // would use preventSelection(), but that prevents selectstart, causing problems.
+                mirrorEl.classList.add('fc-unselectable');
+                mirrorEl.classList.add('fc-dragging');
+                core.applyStyle(mirrorEl, {
+                    position: 'fixed',
+                    zIndex: this.zIndex,
+                    visibility: '',
+                    boxSizing: 'border-box',
+                    width: sourceElRect.right - sourceElRect.left,
+                    height: sourceElRect.bottom - sourceElRect.top,
+                    right: 'auto',
+                    bottom: 'auto',
+                    margin: 0
+                });
+                this.parentNode.appendChild(mirrorEl);
+            }
+            return mirrorEl;
+        };
+        return ElementMirror;
+    }());
+
+    /*
+    Is a cache for a given element's scroll information (all the info that ScrollController stores)
+    in addition the "client rectangle" of the element.. the area within the scrollbars.
+
+    The cache can be in one of two modes:
+    - doesListening:false - ignores when the container is scrolled by someone else
+    - doesListening:true - watch for scrolling and update the cache
+    */
+    var ScrollGeomCache = /** @class */ (function (_super) {
+        __extends(ScrollGeomCache, _super);
+        function ScrollGeomCache(scrollController, doesListening) {
+            var _this = _super.call(this) || this;
+            _this.handleScroll = function () {
+                _this.scrollTop = _this.scrollController.getScrollTop();
+                _this.scrollLeft = _this.scrollController.getScrollLeft();
+                _this.handleScrollChange();
+            };
+            _this.scrollController = scrollController;
+            _this.doesListening = doesListening;
+            _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
+            _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
+            _this.scrollWidth = scrollController.getScrollWidth();
+            _this.scrollHeight = scrollController.getScrollHeight();
+            _this.clientWidth = scrollController.getClientWidth();
+            _this.clientHeight = scrollController.getClientHeight();
+            _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
+            if (_this.doesListening) {
+                _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
+            }
+            return _this;
+        }
+        ScrollGeomCache.prototype.destroy = function () {
+            if (this.doesListening) {
+                this.getEventTarget().removeEventListener('scroll', this.handleScroll);
+            }
+        };
+        ScrollGeomCache.prototype.getScrollTop = function () {
+            return this.scrollTop;
+        };
+        ScrollGeomCache.prototype.getScrollLeft = function () {
+            return this.scrollLeft;
+        };
+        ScrollGeomCache.prototype.setScrollTop = function (top) {
+            this.scrollController.setScrollTop(top);
+            if (!this.doesListening) {
+                // we are not relying on the element to normalize out-of-bounds scroll values
+                // so we need to sanitize ourselves
+                this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
+                this.handleScrollChange();
+            }
+        };
+        ScrollGeomCache.prototype.setScrollLeft = function (top) {
+            this.scrollController.setScrollLeft(top);
+            if (!this.doesListening) {
+                // we are not relying on the element to normalize out-of-bounds scroll values
+                // so we need to sanitize ourselves
+                this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
+                this.handleScrollChange();
+            }
+        };
+        ScrollGeomCache.prototype.getClientWidth = function () {
+            return this.clientWidth;
+        };
+        ScrollGeomCache.prototype.getClientHeight = function () {
+            return this.clientHeight;
+        };
+        ScrollGeomCache.prototype.getScrollWidth = function () {
+            return this.scrollWidth;
+        };
+        ScrollGeomCache.prototype.getScrollHeight = function () {
+            return this.scrollHeight;
+        };
+        ScrollGeomCache.prototype.handleScrollChange = function () {
+        };
+        return ScrollGeomCache;
+    }(core.ScrollController));
+    var ElementScrollGeomCache = /** @class */ (function (_super) {
+        __extends(ElementScrollGeomCache, _super);
+        function ElementScrollGeomCache(el, doesListening) {
+            return _super.call(this, new core.ElementScrollController(el), doesListening) || this;
+        }
+        ElementScrollGeomCache.prototype.getEventTarget = function () {
+            return this.scrollController.el;
+        };
+        ElementScrollGeomCache.prototype.computeClientRect = function () {
+            return core.computeInnerRect(this.scrollController.el);
+        };
+        return ElementScrollGeomCache;
+    }(ScrollGeomCache));
+    var WindowScrollGeomCache = /** @class */ (function (_super) {
+        __extends(WindowScrollGeomCache, _super);
+        function WindowScrollGeomCache(doesListening) {
+            return _super.call(this, new core.WindowScrollController(), doesListening) || this;
+        }
+        WindowScrollGeomCache.prototype.getEventTarget = function () {
+            return window;
+        };
+        WindowScrollGeomCache.prototype.computeClientRect = function () {
+            return {
+                left: this.scrollLeft,
+                right: this.scrollLeft + this.clientWidth,
+                top: this.scrollTop,
+                bottom: this.scrollTop + this.clientHeight
+            };
+        };
+        // the window is the only scroll object that changes it's rectangle relative
+        // to the document's topleft as it scrolls
+        WindowScrollGeomCache.prototype.handleScrollChange = function () {
+            this.clientRect = this.computeClientRect();
+        };
+        return WindowScrollGeomCache;
+    }(ScrollGeomCache));
+
+    // If available we are using native "performance" API instead of "Date"
+    // Read more about it on MDN:
+    // https://developer.mozilla.org/en-US/docs/Web/API/Performance
+    var getTime = typeof performance === 'function' ? performance.now : Date.now;
+    /*
+    For a pointer interaction, automatically scrolls certain scroll containers when the pointer
+    approaches the edge.
+
+    The caller must call start + handleMove + stop.
+    */
+    var AutoScroller = /** @class */ (function () {
+        function AutoScroller() {
+            var _this = this;
+            // options that can be set by caller
+            this.isEnabled = true;
+            this.scrollQuery = [window, '.fc-scroller'];
+            this.edgeThreshold = 50; // pixels
+            this.maxVelocity = 300; // pixels per second
+            // internal state
+            this.pointerScreenX = null;
+            this.pointerScreenY = null;
+            this.isAnimating = false;
+            this.scrollCaches = null;
+            // protect against the initial pointerdown being too close to an edge and starting the scroll
+            this.everMovedUp = false;
+            this.everMovedDown = false;
+            this.everMovedLeft = false;
+            this.everMovedRight = false;
+            this.animate = function () {
+                if (_this.isAnimating) { // wasn't cancelled between animation calls
+                    var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
+                    if (edge) {
+                        var now = getTime();
+                        _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
+                        _this.requestAnimation(now);
+                    }
+                    else {
+                        _this.isAnimating = false; // will stop animation
+                    }
+                }
+            };
+        }
+        AutoScroller.prototype.start = function (pageX, pageY) {
+            if (this.isEnabled) {
+                this.scrollCaches = this.buildCaches();
+                this.pointerScreenX = null;
+                this.pointerScreenY = null;
+                this.everMovedUp = false;
+                this.everMovedDown = false;
+                this.everMovedLeft = false;
+                this.everMovedRight = false;
+                this.handleMove(pageX, pageY);
+            }
+        };
+        AutoScroller.prototype.handleMove = function (pageX, pageY) {
+            if (this.isEnabled) {
+                var pointerScreenX = pageX - window.pageXOffset;
+                var pointerScreenY = pageY - window.pageYOffset;
+                var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
+                var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
+                if (yDelta < 0) {
+                    this.everMovedUp = true;
+                }
+                else if (yDelta > 0) {
+                    this.everMovedDown = true;
+                }
+                if (xDelta < 0) {
+                    this.everMovedLeft = true;
+                }
+                else if (xDelta > 0) {
+                    this.everMovedRight = true;
+                }
+                this.pointerScreenX = pointerScreenX;
+                this.pointerScreenY = pointerScreenY;
+                if (!this.isAnimating) {
+                    this.isAnimating = true;
+                    this.requestAnimation(getTime());
+                }
+            }
+        };
+        AutoScroller.prototype.stop = function () {
+            if (this.isEnabled) {
+                this.isAnimating = false; // will stop animation
+                for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                    var scrollCache = _a[_i];
+                    scrollCache.destroy();
+                }
+                this.scrollCaches = null;
+            }
+        };
+        AutoScroller.prototype.requestAnimation = function (now) {
+            this.msSinceRequest = now;
+            requestAnimationFrame(this.animate);
+        };
+        AutoScroller.prototype.handleSide = function (edge, seconds) {
+            var scrollCache = edge.scrollCache;
+            var edgeThreshold = this.edgeThreshold;
+            var invDistance = edgeThreshold - edge.distance;
+            var velocity = // the closer to the edge, the faster we scroll
+             (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
+                this.maxVelocity * seconds;
+            var sign = 1;
+            switch (edge.name) {
+                case 'left':
+                    sign = -1;
+                // falls through
+                case 'right':
+                    scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
+                    break;
+                case 'top':
+                    sign = -1;
+                // falls through
+                case 'bottom':
+                    scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
+                    break;
+            }
+        };
+        // left/top are relative to document topleft
+        AutoScroller.prototype.computeBestEdge = function (left, top) {
+            var edgeThreshold = this.edgeThreshold;
+            var bestSide = null;
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                var rect = scrollCache.clientRect;
+                var leftDist = left - rect.left;
+                var rightDist = rect.right - left;
+                var topDist = top - rect.top;
+                var bottomDist = rect.bottom - top;
+                // completely within the rect?
+                if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
+                    if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
+                        (!bestSide || bestSide.distance > topDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
+                    }
+                    if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
+                        (!bestSide || bestSide.distance > bottomDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
+                    }
+                    if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
+                        (!bestSide || bestSide.distance > leftDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
+                    }
+                    if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
+                        (!bestSide || bestSide.distance > rightDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
+                    }
+                }
+            }
+            return bestSide;
+        };
+        AutoScroller.prototype.buildCaches = function () {
+            return this.queryScrollEls().map(function (el) {
+                if (el === window) {
+                    return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
+                }
+                else {
+                    return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
+                }
+            });
+        };
+        AutoScroller.prototype.queryScrollEls = function () {
+            var els = [];
+            for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
+                var query = _a[_i];
+                if (typeof query === 'object') {
+                    els.push(query);
+                }
+                else {
+                    els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
+                }
+            }
+            return els;
+        };
+        return AutoScroller;
+    }());
+
+    /*
+    Monitors dragging on an element. Has a number of high-level features:
+    - minimum distance required before dragging
+    - minimum wait time ("delay") before dragging
+    - a mirror element that follows the pointer
+    */
+    var FeaturefulElementDragging = /** @class */ (function (_super) {
+        __extends(FeaturefulElementDragging, _super);
+        function FeaturefulElementDragging(containerEl) {
+            var _this = _super.call(this, containerEl) || this;
+            // options that can be directly set by caller
+            // the caller can also set the PointerDragging's options as well
+            _this.delay = null;
+            _this.minDistance = 0;
+            _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
+            _this.mirrorNeedsRevert = false;
+            _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
+            _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
+            _this.isDelayEnded = false;
+            _this.isDistanceSurpassed = false;
+            _this.delayTimeoutId = null;
+            _this.onPointerDown = function (ev) {
+                if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
+                    _this.isInteracting = true;
+                    _this.isDelayEnded = false;
+                    _this.isDistanceSurpassed = false;
+                    core.preventSelection(document.body);
+                    core.preventContextMenu(document.body);
+                    // prevent links from being visited if there's an eventual drag.
+                    // also prevents selection in older browsers (maybe?).
+                    // not necessary for touch, besides, browser would complain about passiveness.
+                    if (!ev.isTouch) {
+                        ev.origEvent.preventDefault();
+                    }
+                    _this.emitter.trigger('pointerdown', ev);
+                    if (!_this.pointer.shouldIgnoreMove) {
+                        // actions related to initiating dragstart+dragmove+dragend...
+                        _this.mirror.setIsVisible(false); // reset. caller must set-visible
+                        _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
+                        _this.startDelay(ev);
+                        if (!_this.minDistance) {
+                            _this.handleDistanceSurpassed(ev);
+                        }
+                    }
+                }
+            };
+            _this.onPointerMove = function (ev) {
+                if (_this.isInteracting) { // if false, still waiting for previous drag's revert
+                    _this.emitter.trigger('pointermove', ev);
+                    if (!_this.isDistanceSurpassed) {
+                        var minDistance = _this.minDistance;
+                        var distanceSq = void 0; // current distance from the origin, squared
+                        var deltaX = ev.deltaX, deltaY = ev.deltaY;
+                        distanceSq = deltaX * deltaX + deltaY * deltaY;
+                        if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
+                            _this.handleDistanceSurpassed(ev);
+                        }
+                    }
+                    if (_this.isDragging) {
+                        // a real pointer move? (not one simulated by scrolling)
+                        if (ev.origEvent.type !== 'scroll') {
+                            _this.mirror.handleMove(ev.pageX, ev.pageY);
+                            _this.autoScroller.handleMove(ev.pageX, ev.pageY);
+                        }
+                        _this.emitter.trigger('dragmove', ev);
+                    }
+                }
+            };
+            _this.onPointerUp = function (ev) {
+                if (_this.isInteracting) { // if false, still waiting for previous drag's revert
+                    _this.isInteracting = false;
+                    core.allowSelection(document.body);
+                    core.allowContextMenu(document.body);
+                    _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
+                    if (_this.isDragging) {
+                        _this.autoScroller.stop();
+                        _this.tryStopDrag(ev); // which will stop the mirror
+                    }
+                    if (_this.delayTimeoutId) {
+                        clearTimeout(_this.delayTimeoutId);
+                        _this.delayTimeoutId = null;
+                    }
+                }
+            };
+            var pointer = _this.pointer = new PointerDragging(containerEl);
+            pointer.emitter.on('pointerdown', _this.onPointerDown);
+            pointer.emitter.on('pointermove', _this.onPointerMove);
+            pointer.emitter.on('pointerup', _this.onPointerUp);
+            _this.mirror = new ElementMirror();
+            _this.autoScroller = new AutoScroller();
+            return _this;
+        }
+        FeaturefulElementDragging.prototype.destroy = function () {
+            this.pointer.destroy();
+        };
+        FeaturefulElementDragging.prototype.startDelay = function (ev) {
+            var _this = this;
+            if (typeof this.delay === 'number') {
+                this.delayTimeoutId = setTimeout(function () {
+                    _this.delayTimeoutId = null;
+                    _this.handleDelayEnd(ev);
+                }, this.delay);
+            }
+            else {
+                this.handleDelayEnd(ev);
+            }
+        };
+        FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
+            this.isDelayEnded = true;
+            this.tryStartDrag(ev);
+        };
+        FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
+            this.isDistanceSurpassed = true;
+            this.tryStartDrag(ev);
+        };
+        FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
+            if (this.isDelayEnded && this.isDistanceSurpassed) {
+                if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
+                    this.isDragging = true;
+                    this.mirrorNeedsRevert = false;
+                    this.autoScroller.start(ev.pageX, ev.pageY);
+                    this.emitter.trigger('dragstart', ev);
+                    if (this.touchScrollAllowed === false) {
+                        this.pointer.cancelTouchScroll();
+                    }
+                }
+            }
+        };
+        FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
+            // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
+            // that come from the document to fire beforehand. much more convenient this way.
+            this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
+            );
+        };
+        FeaturefulElementDragging.prototype.stopDrag = function (ev) {
+            this.isDragging = false;
+            this.emitter.trigger('dragend', ev);
+        };
+        // fill in the implementations...
+        FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
+            this.pointer.shouldIgnoreMove = bool;
+        };
+        FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
+            this.mirror.setIsVisible(bool);
+        };
+        FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
+            this.mirrorNeedsRevert = bool;
+        };
+        FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
+            this.autoScroller.isEnabled = bool;
+        };
+        return FeaturefulElementDragging;
+    }(core.ElementDragging));
+
+    /*
+    When this class is instantiated, it records the offset of an element (relative to the document topleft),
+    and continues to monitor scrolling, updating the cached coordinates if it needs to.
+    Does not access the DOM after instantiation, so highly performant.
+
+    Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
+    and an determine if a given point is inside the combined clipping rectangle.
+    */
+    var OffsetTracker = /** @class */ (function () {
+        function OffsetTracker(el) {
+            this.origRect = core.computeRect(el);
+            // will work fine for divs that have overflow:hidden
+            this.scrollCaches = core.getClippingParents(el).map(function (el) {
+                return new ElementScrollGeomCache(el, true); // listen=true
+            });
+        }
+        OffsetTracker.prototype.destroy = function () {
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                scrollCache.destroy();
+            }
+        };
+        OffsetTracker.prototype.computeLeft = function () {
+            var left = this.origRect.left;
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
+            }
+            return left;
+        };
+        OffsetTracker.prototype.computeTop = function () {
+            var top = this.origRect.top;
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                top += scrollCache.origScrollTop - scrollCache.getScrollTop();
+            }
+            return top;
+        };
+        OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
+            var point = { left: pageX, top: pageY };
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
+                    !core.pointInsideRect(point, scrollCache.clientRect)) {
+                    return false;
+                }
+            }
+            return true;
+        };
+        return OffsetTracker;
+    }());
+    // certain clipping containers should never constrain interactions, like <html> and <body>
+    // https://github.com/fullcalendar/fullcalendar/issues/3615
+    function isIgnoredClipping(node) {
+        var tagName = node.tagName;
+        return tagName === 'HTML' || tagName === 'BODY';
+    }
+
+    /*
+    Tracks movement over multiple droppable areas (aka "hits")
+    that exist in one or more DateComponents.
+    Relies on an existing draggable.
+
+    emits:
+    - pointerdown
+    - dragstart
+    - hitchange - fires initially, even if not over a hit
+    - pointerup
+    - (hitchange - again, to null, if ended over a hit)
+    - dragend
+    */
+    var HitDragging = /** @class */ (function () {
+        function HitDragging(dragging, droppableStore) {
+            var _this = this;
+            // options that can be set by caller
+            this.useSubjectCenter = false;
+            this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
+            this.initialHit = null;
+            this.movingHit = null;
+            this.finalHit = null; // won't ever be populated if shouldIgnoreMove
+            this.handlePointerDown = function (ev) {
+                var dragging = _this.dragging;
+                _this.initialHit = null;
+                _this.movingHit = null;
+                _this.finalHit = null;
+                _this.prepareHits();
+                _this.processFirstCoord(ev);
+                if (_this.initialHit || !_this.requireInitial) {
+                    dragging.setIgnoreMove(false);
+                    _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
+                }
+                else {
+                    dragging.setIgnoreMove(true);
+                }
+            };
+            this.handleDragStart = function (ev) {
+                _this.emitter.trigger('dragstart', ev);
+                _this.handleMove(ev, true); // force = fire even if initially null
+            };
+            this.handleDragMove = function (ev) {
+                _this.emitter.trigger('dragmove', ev);
+                _this.handleMove(ev);
+            };
+            this.handlePointerUp = function (ev) {
+                _this.releaseHits();
+                _this.emitter.trigger('pointerup', ev);
+            };
+            this.handleDragEnd = function (ev) {
+                if (_this.movingHit) {
+                    _this.emitter.trigger('hitupdate', null, true, ev);
+                }
+                _this.finalHit = _this.movingHit;
+                _this.movingHit = null;
+                _this.emitter.trigger('dragend', ev);
+            };
+            this.droppableStore = droppableStore;
+            dragging.emitter.on('pointerdown', this.handlePointerDown);
+            dragging.emitter.on('dragstart', this.handleDragStart);
+            dragging.emitter.on('dragmove', this.handleDragMove);
+            dragging.emitter.on('pointerup', this.handlePointerUp);
+            dragging.emitter.on('dragend', this.handleDragEnd);
+            this.dragging = dragging;
+            this.emitter = new core.EmitterMixin();
+        }
+        // sets initialHit
+        // sets coordAdjust
+        HitDragging.prototype.processFirstCoord = function (ev) {
+            var origPoint = { left: ev.pageX, top: ev.pageY };
+            var adjustedPoint = origPoint;
+            var subjectEl = ev.subjectEl;
+            var subjectRect;
+            if (subjectEl !== document) {
+                subjectRect = core.computeRect(subjectEl);
+                adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect);
+            }
+            var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
+            if (initialHit) {
+                if (this.useSubjectCenter && subjectRect) {
+                    var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect);
+                    if (slicedSubjectRect) {
+                        adjustedPoint = core.getRectCenter(slicedSubjectRect);
+                    }
+                }
+                this.coordAdjust = core.diffPoints(adjustedPoint, origPoint);
+            }
+            else {
+                this.coordAdjust = { left: 0, top: 0 };
+            }
+        };
+        HitDragging.prototype.handleMove = function (ev, forceHandle) {
+            var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
+            if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
+                this.movingHit = hit;
+                this.emitter.trigger('hitupdate', hit, false, ev);
+            }
+        };
+        HitDragging.prototype.prepareHits = function () {
+            this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) {
+                interactionSettings.component.buildPositionCaches();
+                return new OffsetTracker(interactionSettings.el);
+            });
+        };
+        HitDragging.prototype.releaseHits = function () {
+            var offsetTrackers = this.offsetTrackers;
+            for (var id in offsetTrackers) {
+                offsetTrackers[id].destroy();
+            }
+            this.offsetTrackers = {};
+        };
+        HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
+            var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
+            var bestHit = null;
+            for (var id in droppableStore) {
+                var component = droppableStore[id].component;
+                var offsetTracker = offsetTrackers[id];
+                if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
+                    var originLeft = offsetTracker.computeLeft();
+                    var originTop = offsetTracker.computeTop();
+                    var positionLeft = offsetLeft - originLeft;
+                    var positionTop = offsetTop - originTop;
+                    var origRect = offsetTracker.origRect;
+                    var width = origRect.right - origRect.left;
+                    var height = origRect.bottom - origRect.top;
+                    if (
+                    // must be within the element's bounds
+                    positionLeft >= 0 && positionLeft < width &&
+                        positionTop >= 0 && positionTop < height) {
+                        var hit = component.queryHit(positionLeft, positionTop, width, height);
+                        if (hit &&
+                            (
+                            // make sure the hit is within activeRange, meaning it's not a deal cell
+                            !component.props.dateProfile || // hack for DayTile
+                                core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
+                            (!bestHit || hit.layer > bestHit.layer)) {
+                            // TODO: better way to re-orient rectangle
+                            hit.rect.left += originLeft;
+                            hit.rect.right += originLeft;
+                            hit.rect.top += originTop;
+                            hit.rect.bottom += originTop;
+                            bestHit = hit;
+                        }
+                    }
+                }
+            }
+            return bestHit;
+        };
+        return HitDragging;
+    }());
+    function isHitsEqual(hit0, hit1) {
+        if (!hit0 && !hit1) {
+            return true;
+        }
+        if (Boolean(hit0) !== Boolean(hit1)) {
+            return false;
+        }
+        return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
+    }
+
+    /*
+    Monitors when the user clicks on a specific date/time of a component.
+    A pointerdown+pointerup on the same "hit" constitutes a click.
+    */
+    var DateClicking = /** @class */ (function (_super) {
+        __extends(DateClicking, _super);
+        function DateClicking(settings) {
+            var _this = _super.call(this, settings) || this;
+            _this.handlePointerDown = function (ev) {
+                var dragging = _this.dragging;
+                // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
+                dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
+            };
+            // won't even fire if moving was ignored
+            _this.handleDragEnd = function (ev) {
+                var component = _this.component;
+                var pointer = _this.dragging.pointer;
+                if (!pointer.wasTouchScroll) {
+                    var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit;
+                    if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
+                        component.calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, component.view, ev.origEvent);
+                    }
+                }
+            };
+            var component = settings.component;
+            // we DO want to watch pointer moves because otherwise finalHit won't get populated
+            _this.dragging = new FeaturefulElementDragging(component.el);
+            _this.dragging.autoScroller.isEnabled = false;
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragend', _this.handleDragEnd);
+            return _this;
+        }
+        DateClicking.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return DateClicking;
+    }(core.Interaction));
+
+    /*
+    Tracks when the user selects a portion of time of a component,
+    constituted by a drag over date cells, with a possible delay at the beginning of the drag.
+    */
+    var DateSelecting = /** @class */ (function (_super) {
+        __extends(DateSelecting, _super);
+        function DateSelecting(settings) {
+            var _this = _super.call(this, settings) || this;
+            _this.dragSelection = null;
+            _this.handlePointerDown = function (ev) {
+                var _a = _this, component = _a.component, dragging = _a.dragging;
+                var canSelect = component.opt('selectable') &&
+                    component.isValidDateDownEl(ev.origEvent.target);
+                // don't bother to watch expensive moves if component won't do selection
+                dragging.setIgnoreMove(!canSelect);
+                // if touch, require user to hold down
+                dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
+            };
+            _this.handleDragStart = function (ev) {
+                _this.component.calendar.unselect(ev); // unselect previous selections
+            };
+            _this.handleHitUpdate = function (hit, isFinal) {
+                var calendar = _this.component.calendar;
+                var dragSelection = null;
+                var isInvalid = false;
+                if (hit) {
+                    dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
+                    if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
+                        isInvalid = true;
+                        dragSelection = null;
+                    }
+                }
+                if (dragSelection) {
+                    calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
+                }
+                else if (!isFinal) { // only unselect if moved away while dragging
+                    calendar.dispatch({ type: 'UNSELECT_DATES' });
+                }
+                if (!isInvalid) {
+                    core.enableCursor();
+                }
+                else {
+                    core.disableCursor();
+                }
+                if (!isFinal) {
+                    _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
+                }
+            };
+            _this.handlePointerUp = function (pev) {
+                if (_this.dragSelection) {
+                    // selection is already rendered, so just need to report selection
+                    _this.component.calendar.triggerDateSelect(_this.dragSelection, pev);
+                    _this.dragSelection = null;
+                }
+            };
+            var component = settings.component;
+            var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
+            dragging.touchScrollAllowed = false;
+            dragging.minDistance = component.opt('selectMinDistance') || 0;
+            dragging.autoScroller.isEnabled = component.opt('dragScroll');
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragstart', _this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
+            hitDragging.emitter.on('pointerup', _this.handlePointerUp);
+            return _this;
+        }
+        DateSelecting.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return DateSelecting;
+    }(core.Interaction));
+    function getComponentTouchDelay(component) {
+        var delay = component.opt('selectLongPressDelay');
+        if (delay == null) {
+            delay = component.opt('longPressDelay');
+        }
+        return delay;
+    }
+    function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
+        var dateSpan0 = hit0.dateSpan;
+        var dateSpan1 = hit1.dateSpan;
+        var ms = [
+            dateSpan0.range.start,
+            dateSpan0.range.end,
+            dateSpan1.range.start,
+            dateSpan1.range.end
+        ];
+        ms.sort(core.compareNumbers);
+        var props = {};
+        for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
+            var transformer = dateSelectionTransformers_1[_i];
+            var res = transformer(hit0, hit1);
+            if (res === false) {
+                return null;
+            }
+            else if (res) {
+                __assign(props, res);
+            }
+        }
+        props.range = { start: ms[0], end: ms[3] };
+        props.allDay = dateSpan0.allDay;
+        return props;
+    }
+
+    var EventDragging = /** @class */ (function (_super) {
+        __extends(EventDragging, _super);
+        function EventDragging(settings) {
+            var _this = _super.call(this, settings) || this;
+            // internal state
+            _this.subjectSeg = null; // the seg being selected/dragged
+            _this.isDragging = false;
+            _this.eventRange = null;
+            _this.relevantEvents = null; // the events being dragged
+            _this.receivingCalendar = null;
+            _this.validMutation = null;
+            _this.mutatedRelevantEvents = null;
+            _this.handlePointerDown = function (ev) {
+                var origTarget = ev.origEvent.target;
+                var _a = _this, component = _a.component, dragging = _a.dragging;
+                var mirror = dragging.mirror;
+                var initialCalendar = component.calendar;
+                var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl);
+                var eventRange = _this.eventRange = subjectSeg.eventRange;
+                var eventInstanceId = eventRange.instance.instanceId;
+                _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
+                dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance');
+                dragging.delay =
+                    // only do a touch delay if touch and this event hasn't been selected yet
+                    (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
+                        getComponentTouchDelay$1(component) :
+                        null;
+                mirror.parentNode = initialCalendar.el;
+                mirror.revertDuration = component.opt('dragRevertDuration');
+                var isValid = component.isValidSegDownEl(origTarget) &&
+                    !core.elementClosest(origTarget, '.fc-resizer');
+                dragging.setIgnoreMove(!isValid);
+                // disable dragging for elements that are resizable (ie, selectable)
+                // but are not draggable
+                _this.isDragging = isValid &&
+                    ev.subjectEl.classList.contains('fc-draggable');
+            };
+            _this.handleDragStart = function (ev) {
+                var initialCalendar = _this.component.calendar;
+                var eventRange = _this.eventRange;
+                var eventInstanceId = eventRange.instance.instanceId;
+                if (ev.isTouch) {
+                    // need to select a different event?
+                    if (eventInstanceId !== _this.component.props.eventSelection) {
+                        initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
+                    }
+                }
+                else {
+                    // if now using mouse, but was previous touch interaction, clear selected event
+                    initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
+                }
+                if (_this.isDragging) {
+                    initialCalendar.unselect(ev); // unselect *date* selection
+                    initialCalendar.publiclyTrigger('eventDragStart', [
+                        {
+                            el: _this.subjectSeg.el,
+                            event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance),
+                            jsEvent: ev.origEvent,
+                            view: _this.component.view
+                        }
+                    ]);
+                }
+            };
+            _this.handleHitUpdate = function (hit, isFinal) {
+                if (!_this.isDragging) {
+                    return;
+                }
+                var relevantEvents = _this.relevantEvents;
+                var initialHit = _this.hitDragging.initialHit;
+                var initialCalendar = _this.component.calendar;
+                // states based on new hit
+                var receivingCalendar = null;
+                var mutation = null;
+                var mutatedRelevantEvents = null;
+                var isInvalid = false;
+                var interaction = {
+                    affectedEvents: relevantEvents,
+                    mutatedEvents: core.createEmptyEventStore(),
+                    isEvent: true,
+                    origSeg: _this.subjectSeg
+                };
+                if (hit) {
+                    var receivingComponent = hit.component;
+                    receivingCalendar = receivingComponent.calendar;
+                    if (initialCalendar === receivingCalendar ||
+                        receivingComponent.opt('editable') && receivingComponent.opt('droppable')) {
+                        mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
+                        if (mutation) {
+                            mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
+                            interaction.mutatedEvents = mutatedRelevantEvents;
+                            if (!receivingComponent.isInteractionValid(interaction)) {
+                                isInvalid = true;
+                                mutation = null;
+                                mutatedRelevantEvents = null;
+                                interaction.mutatedEvents = core.createEmptyEventStore();
+                            }
+                        }
+                    }
+                    else {
+                        receivingCalendar = null;
+                    }
+                }
+                _this.displayDrag(receivingCalendar, interaction);
+                if (!isInvalid) {
+                    core.enableCursor();
+                }
+                else {
+                    core.disableCursor();
+                }
+                if (!isFinal) {
+                    if (initialCalendar === receivingCalendar && // TODO: write test for this
+                        isHitsEqual(initialHit, hit)) {
+                        mutation = null;
+                    }
+                    _this.dragging.setMirrorNeedsRevert(!mutation);
+                    // render the mirror if no already-rendered mirror
+                    // TODO: wish we could somehow wait for dispatch to guarantee render
+                    _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
+                    // assign states based on new hit
+                    _this.receivingCalendar = receivingCalendar;
+                    _this.validMutation = mutation;
+                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
+                }
+            };
+            _this.handlePointerUp = function () {
+                if (!_this.isDragging) {
+                    _this.cleanup(); // because handleDragEnd won't fire
+                }
+            };
+            _this.handleDragEnd = function (ev) {
+                if (_this.isDragging) {
+                    var initialCalendar_1 = _this.component.calendar;
+                    var initialView = _this.component.view;
+                    var receivingCalendar = _this.receivingCalendar;
+                    var eventDef = _this.eventRange.def;
+                    var eventInstance = _this.eventRange.instance;
+                    var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance);
+                    var relevantEvents_1 = _this.relevantEvents;
+                    var mutatedRelevantEvents = _this.mutatedRelevantEvents;
+                    var finalHit = _this.hitDragging.finalHit;
+                    _this.clearDrag(); // must happen after revert animation
+                    initialCalendar_1.publiclyTrigger('eventDragStop', [
+                        {
+                            el: _this.subjectSeg.el,
+                            event: eventApi,
+                            jsEvent: ev.origEvent,
+                            view: initialView
+                        }
+                    ]);
+                    if (_this.validMutation) {
+                        // dropped within same calendar
+                        if (receivingCalendar === initialCalendar_1) {
+                            initialCalendar_1.dispatch({
+                                type: 'MERGE_EVENTS',
+                                eventStore: mutatedRelevantEvents
+                            });
+                            var eventDropArg = {};
+                            for (var _i = 0, _a = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _a.length; _i++) {
+                                var transformer = _a[_i];
+                                __assign(eventDropArg, transformer(_this.validMutation, initialCalendar_1));
+                            }
+                            __assign(eventDropArg, {
+                                el: ev.subjectEl,
+                                delta: _this.validMutation.startDelta,
+                                oldEvent: eventApi,
+                                event: new core.EventApi(// the data AFTER the mutation
+                                initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
+                                revert: function () {
+                                    initialCalendar_1.dispatch({
+                                        type: 'MERGE_EVENTS',
+                                        eventStore: relevantEvents_1
+                                    });
+                                },
+                                jsEvent: ev.origEvent,
+                                view: initialView
+                            });
+                            initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
+                            // dropped in different calendar
+                        }
+                        else if (receivingCalendar) {
+                            initialCalendar_1.publiclyTrigger('eventLeave', [
+                                {
+                                    draggedEl: ev.subjectEl,
+                                    event: eventApi,
+                                    view: initialView
+                                }
+                            ]);
+                            initialCalendar_1.dispatch({
+                                type: 'REMOVE_EVENT_INSTANCES',
+                                instances: _this.mutatedRelevantEvents.instances
+                            });
+                            receivingCalendar.dispatch({
+                                type: 'MERGE_EVENTS',
+                                eventStore: _this.mutatedRelevantEvents
+                            });
+                            if (ev.isTouch) {
+                                receivingCalendar.dispatch({
+                                    type: 'SELECT_EVENT',
+                                    eventInstanceId: eventInstance.instanceId
+                                });
+                            }
+                            var dropArg = receivingCalendar.buildDatePointApi(finalHit.dateSpan);
+                            dropArg.draggedEl = ev.subjectEl;
+                            dropArg.jsEvent = ev.origEvent;
+                            dropArg.view = finalHit.component; // ?
+                            receivingCalendar.publiclyTrigger('drop', [dropArg]);
+                            receivingCalendar.publiclyTrigger('eventReceive', [
+                                {
+                                    draggedEl: ev.subjectEl,
+                                    event: new core.EventApi(// the data AFTER the mutation
+                                    receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
+                                    view: finalHit.component
+                                }
+                            ]);
+                        }
+                    }
+                    else {
+                        initialCalendar_1.publiclyTrigger('_noEventDrop');
+                    }
+                }
+                _this.cleanup();
+            };
+            var component = _this.component;
+            var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
+            dragging.pointer.selector = EventDragging.SELECTOR;
+            dragging.touchScrollAllowed = false;
+            dragging.autoScroller.isEnabled = component.opt('dragScroll');
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore);
+            hitDragging.useSubjectCenter = settings.useEventCenter;
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragstart', _this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
+            hitDragging.emitter.on('pointerup', _this.handlePointerUp);
+            hitDragging.emitter.on('dragend', _this.handleDragEnd);
+            return _this;
+        }
+        EventDragging.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        // render a drag state on the next receivingCalendar
+        EventDragging.prototype.displayDrag = function (nextCalendar, state) {
+            var initialCalendar = this.component.calendar;
+            var prevCalendar = this.receivingCalendar;
+            // does the previous calendar need to be cleared?
+            if (prevCalendar && prevCalendar !== nextCalendar) {
+                // does the initial calendar need to be cleared?
+                // if so, don't clear all the way. we still need to to hide the affectedEvents
+                if (prevCalendar === initialCalendar) {
+                    prevCalendar.dispatch({
+                        type: 'SET_EVENT_DRAG',
+                        state: {
+                            affectedEvents: state.affectedEvents,
+                            mutatedEvents: core.createEmptyEventStore(),
+                            isEvent: true,
+                            origSeg: state.origSeg
+                        }
+                    });
+                    // completely clear the old calendar if it wasn't the initial
+                }
+                else {
+                    prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+                }
+            }
+            if (nextCalendar) {
+                nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
+            }
+        };
+        EventDragging.prototype.clearDrag = function () {
+            var initialCalendar = this.component.calendar;
+            var receivingCalendar = this.receivingCalendar;
+            if (receivingCalendar) {
+                receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+            // the initial calendar might have an dummy drag state from displayDrag
+            if (initialCalendar !== receivingCalendar) {
+                initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+        };
+        EventDragging.prototype.cleanup = function () {
+            this.subjectSeg = null;
+            this.isDragging = false;
+            this.eventRange = null;
+            this.relevantEvents = null;
+            this.receivingCalendar = null;
+            this.validMutation = null;
+            this.mutatedRelevantEvents = null;
+        };
+        EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
+        return EventDragging;
+    }(core.Interaction));
+    function computeEventMutation(hit0, hit1, massagers) {
+        var dateSpan0 = hit0.dateSpan;
+        var dateSpan1 = hit1.dateSpan;
+        var date0 = dateSpan0.range.start;
+        var date1 = dateSpan1.range.start;
+        var standardProps = {};
+        if (dateSpan0.allDay !== dateSpan1.allDay) {
+            standardProps.allDay = dateSpan1.allDay;
+            standardProps.hasEnd = hit1.component.opt('allDayMaintainDuration');
+            if (dateSpan1.allDay) {
+                // means date1 is already start-of-day,
+                // but date0 needs to be converted
+                date0 = core.startOfDay(date0);
+            }
+        }
+        var delta = core.diffDates(date0, date1, hit0.component.dateEnv, hit0.component === hit1.component ?
+            hit0.component.largeUnit :
+            null);
+        if (delta.milliseconds) { // has hours/minutes/seconds
+            standardProps.allDay = false;
+        }
+        var mutation = {
+            startDelta: delta,
+            endDelta: delta,
+            standardProps: standardProps
+        };
+        for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
+            var massager = massagers_1[_i];
+            massager(mutation, hit0, hit1);
+        }
+        return mutation;
+    }
+    function getComponentTouchDelay$1(component) {
+        var delay = component.opt('eventLongPressDelay');
+        if (delay == null) {
+            delay = component.opt('longPressDelay');
+        }
+        return delay;
+    }
+
+    var EventDragging$1 = /** @class */ (function (_super) {
+        __extends(EventDragging, _super);
+        function EventDragging(settings) {
+            var _this = _super.call(this, settings) || this;
+            // internal state
+            _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
+            _this.eventRange = null;
+            _this.relevantEvents = null;
+            _this.validMutation = null;
+            _this.mutatedRelevantEvents = null;
+            _this.handlePointerDown = function (ev) {
+                var component = _this.component;
+                var seg = _this.querySeg(ev);
+                var eventRange = _this.eventRange = seg.eventRange;
+                _this.dragging.minDistance = component.opt('eventDragMinDistance');
+                // if touch, need to be working with a selected event
+                _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
+                    (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
+            };
+            _this.handleDragStart = function (ev) {
+                var calendar = _this.component.calendar;
+                var eventRange = _this.eventRange;
+                _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
+                _this.draggingSeg = _this.querySeg(ev);
+                calendar.unselect();
+                calendar.publiclyTrigger('eventResizeStart', [
+                    {
+                        el: _this.draggingSeg.el,
+                        event: new core.EventApi(calendar, eventRange.def, eventRange.instance),
+                        jsEvent: ev.origEvent,
+                        view: _this.component.view
+                    }
+                ]);
+            };
+            _this.handleHitUpdate = function (hit, isFinal, ev) {
+                var calendar = _this.component.calendar;
+                var relevantEvents = _this.relevantEvents;
+                var initialHit = _this.hitDragging.initialHit;
+                var eventInstance = _this.eventRange.instance;
+                var mutation = null;
+                var mutatedRelevantEvents = null;
+                var isInvalid = false;
+                var interaction = {
+                    affectedEvents: relevantEvents,
+                    mutatedEvents: core.createEmptyEventStore(),
+                    isEvent: true,
+                    origSeg: _this.draggingSeg
+                };
+                if (hit) {
+                    mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
+                }
+                if (mutation) {
+                    mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
+                    interaction.mutatedEvents = mutatedRelevantEvents;
+                    if (!_this.component.isInteractionValid(interaction)) {
+                        isInvalid = true;
+                        mutation = null;
+                        mutatedRelevantEvents = null;
+                        interaction.mutatedEvents = null;
+                    }
+                }
+                if (mutatedRelevantEvents) {
+                    calendar.dispatch({
+                        type: 'SET_EVENT_RESIZE',
+                        state: interaction
+                    });
+                }
+                else {
+                    calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
+                }
+                if (!isInvalid) {
+                    core.enableCursor();
+                }
+                else {
+                    core.disableCursor();
+                }
+                if (!isFinal) {
+                    if (mutation && isHitsEqual(initialHit, hit)) {
+                        mutation = null;
+                    }
+                    _this.validMutation = mutation;
+                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
+                }
+            };
+            _this.handleDragEnd = function (ev) {
+                var calendar = _this.component.calendar;
+                var view = _this.component.view;
+                var eventDef = _this.eventRange.def;
+                var eventInstance = _this.eventRange.instance;
+                var eventApi = new core.EventApi(calendar, eventDef, eventInstance);
+                var relevantEvents = _this.relevantEvents;
+                var mutatedRelevantEvents = _this.mutatedRelevantEvents;
+                calendar.publiclyTrigger('eventResizeStop', [
+                    {
+                        el: _this.draggingSeg.el,
+                        event: eventApi,
+                        jsEvent: ev.origEvent,
+                        view: view
+                    }
+                ]);
+                if (_this.validMutation) {
+                    calendar.dispatch({
+                        type: 'MERGE_EVENTS',
+                        eventStore: mutatedRelevantEvents
+                    });
+                    calendar.publiclyTrigger('eventResize', [
+                        {
+                            el: _this.draggingSeg.el,
+                            startDelta: _this.validMutation.startDelta || core.createDuration(0),
+                            endDelta: _this.validMutation.endDelta || core.createDuration(0),
+                            prevEvent: eventApi,
+                            event: new core.EventApi(// the data AFTER the mutation
+                            calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
+                            revert: function () {
+                                calendar.dispatch({
+                                    type: 'MERGE_EVENTS',
+                                    eventStore: relevantEvents
+                                });
+                            },
+                            jsEvent: ev.origEvent,
+                            view: view
+                        }
+                    ]);
+                }
+                else {
+                    calendar.publiclyTrigger('_noEventResize');
+                }
+                // reset all internal state
+                _this.draggingSeg = null;
+                _this.relevantEvents = null;
+                _this.validMutation = null;
+                // okay to keep eventInstance around. useful to set it in handlePointerDown
+            };
+            var component = settings.component;
+            var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
+            dragging.pointer.selector = '.fc-resizer';
+            dragging.touchScrollAllowed = false;
+            dragging.autoScroller.isEnabled = component.opt('dragScroll');
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragstart', _this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
+            hitDragging.emitter.on('dragend', _this.handleDragEnd);
+            return _this;
+        }
+        EventDragging.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        EventDragging.prototype.querySeg = function (ev) {
+            return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector));
+        };
+        return EventDragging;
+    }(core.Interaction));
+    function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
+        var dateEnv = hit0.component.dateEnv;
+        var date0 = hit0.dateSpan.range.start;
+        var date1 = hit1.dateSpan.range.start;
+        var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
+        var props = {};
+        for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
+            var transform = transforms_1[_i];
+            var res = transform(hit0, hit1);
+            if (res === false) {
+                return null;
+            }
+            else if (res) {
+                __assign(props, res);
+            }
+        }
+        if (isFromStart) {
+            if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
+                props.startDelta = delta;
+                return props;
+            }
+        }
+        else {
+            if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
+                props.endDelta = delta;
+                return props;
+            }
+        }
+        return null;
+    }
+
+    var UnselectAuto = /** @class */ (function () {
+        function UnselectAuto(calendar) {
+            var _this = this;
+            this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
+            this.onSelect = function (selectInfo) {
+                if (selectInfo.jsEvent) {
+                    _this.isRecentPointerDateSelect = true;
+                }
+            };
+            this.onDocumentPointerUp = function (pev) {
+                var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
+                var state = calendar.state;
+                // touch-scrolling should never unfocus any type of selection
+                if (!documentPointer.wasTouchScroll) {
+                    if (state.dateSelection && // an existing date selection?
+                        !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
+                    ) {
+                        var unselectAuto = calendar.viewOpt('unselectAuto');
+                        var unselectCancel = calendar.viewOpt('unselectCancel');
+                        if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) {
+                            calendar.unselect(pev);
+                        }
+                    }
+                    if (state.eventSelection && // an existing event selected?
+                        !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
+                    ) {
+                        calendar.dispatch({ type: 'UNSELECT_EVENT' });
+                    }
+                }
+                _this.isRecentPointerDateSelect = false;
+            };
+            this.calendar = calendar;
+            var documentPointer = this.documentPointer = new PointerDragging(document);
+            documentPointer.shouldIgnoreMove = true;
+            documentPointer.shouldWatchScroll = false;
+            documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
+            /*
+            TODO: better way to know about whether there was a selection with the pointer
+            */
+            calendar.on('select', this.onSelect);
+        }
+        UnselectAuto.prototype.destroy = function () {
+            this.calendar.off('select', this.onSelect);
+            this.documentPointer.destroy();
+        };
+        return UnselectAuto;
+    }());
+
+    /*
+    Given an already instantiated draggable object for one-or-more elements,
+    Interprets any dragging as an attempt to drag an events that lives outside
+    of a calendar onto a calendar.
+    */
+    var ExternalElementDragging = /** @class */ (function () {
+        function ExternalElementDragging(dragging, suppliedDragMeta) {
+            var _this = this;
+            this.receivingCalendar = null;
+            this.droppableEvent = null; // will exist for all drags, even if create:false
+            this.suppliedDragMeta = null;
+            this.dragMeta = null;
+            this.handleDragStart = function (ev) {
+                _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
+            };
+            this.handleHitUpdate = function (hit, isFinal, ev) {
+                var dragging = _this.hitDragging.dragging;
+                var receivingCalendar = null;
+                var droppableEvent = null;
+                var isInvalid = false;
+                var interaction = {
+                    affectedEvents: core.createEmptyEventStore(),
+                    mutatedEvents: core.createEmptyEventStore(),
+                    isEvent: _this.dragMeta.create,
+                    origSeg: null
+                };
+                if (hit) {
+                    receivingCalendar = hit.component.calendar;
+                    if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
+                        droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
+                        interaction.mutatedEvents = core.eventTupleToStore(droppableEvent);
+                        isInvalid = !core.isInteractionValid(interaction, receivingCalendar);
+                        if (isInvalid) {
+                            interaction.mutatedEvents = core.createEmptyEventStore();
+                            droppableEvent = null;
+                        }
+                    }
+                }
+                _this.displayDrag(receivingCalendar, interaction);
+                // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
+                // TODO: wish we could somehow wait for dispatch to guarantee render
+                dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
+                if (!isInvalid) {
+                    core.enableCursor();
+                }
+                else {
+                    core.disableCursor();
+                }
+                if (!isFinal) {
+                    dragging.setMirrorNeedsRevert(!droppableEvent);
+                    _this.receivingCalendar = receivingCalendar;
+                    _this.droppableEvent = droppableEvent;
+                }
+            };
+            this.handleDragEnd = function (pev) {
+                var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
+                _this.clearDrag();
+                if (receivingCalendar && droppableEvent) {
+                    var finalHit = _this.hitDragging.finalHit;
+                    var finalView = finalHit.component.view;
+                    var dragMeta = _this.dragMeta;
+                    var arg = receivingCalendar.buildDatePointApi(finalHit.dateSpan);
+                    arg.draggedEl = pev.subjectEl;
+                    arg.jsEvent = pev.origEvent;
+                    arg.view = finalView;
+                    receivingCalendar.publiclyTrigger('drop', [arg]);
+                    if (dragMeta.create) {
+                        receivingCalendar.dispatch({
+                            type: 'MERGE_EVENTS',
+                            eventStore: core.eventTupleToStore(droppableEvent)
+                        });
+                        if (pev.isTouch) {
+                            receivingCalendar.dispatch({
+                                type: 'SELECT_EVENT',
+                                eventInstanceId: droppableEvent.instance.instanceId
+                            });
+                        }
+                        // signal that an external event landed
+                        receivingCalendar.publiclyTrigger('eventReceive', [
+                            {
+                                draggedEl: pev.subjectEl,
+                                event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
+                                view: finalView
+                            }
+                        ]);
+                    }
+                }
+                _this.receivingCalendar = null;
+                _this.droppableEvent = null;
+            };
+            var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore);
+            hitDragging.requireInitial = false; // will start outside of a component
+            hitDragging.emitter.on('dragstart', this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
+            hitDragging.emitter.on('dragend', this.handleDragEnd);
+            this.suppliedDragMeta = suppliedDragMeta;
+        }
+        ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
+            if (typeof this.suppliedDragMeta === 'object') {
+                return core.parseDragMeta(this.suppliedDragMeta);
+            }
+            else if (typeof this.suppliedDragMeta === 'function') {
+                return core.parseDragMeta(this.suppliedDragMeta(subjectEl));
+            }
+            else {
+                return getDragMetaFromEl(subjectEl);
+            }
+        };
+        ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
+            var prevCalendar = this.receivingCalendar;
+            if (prevCalendar && prevCalendar !== nextCalendar) {
+                prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+            if (nextCalendar) {
+                nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
+            }
+        };
+        ExternalElementDragging.prototype.clearDrag = function () {
+            if (this.receivingCalendar) {
+                this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+        };
+        ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
+            var dropAccept = receivingCalendar.opt('dropAccept');
+            if (typeof dropAccept === 'function') {
+                return dropAccept(el);
+            }
+            else if (typeof dropAccept === 'string' && dropAccept) {
+                return Boolean(core.elementMatches(el, dropAccept));
+            }
+            return true;
+        };
+        return ExternalElementDragging;
+    }());
+    // Utils for computing event store from the DragMeta
+    // ----------------------------------------------------------------------------------------------------
+    function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
+        var defProps = __assign({}, dragMeta.leftoverProps);
+        for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
+            var transform = _a[_i];
+            __assign(defProps, transform(dateSpan, dragMeta));
+        }
+        var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
+        calendar);
+        var start = dateSpan.range.start;
+        // only rely on time info if drop zone is all-day,
+        // otherwise, we already know the time
+        if (dateSpan.allDay && dragMeta.startTime) {
+            start = calendar.dateEnv.add(start, dragMeta.startTime);
+        }
+        var end = dragMeta.duration ?
+            calendar.dateEnv.add(start, dragMeta.duration) :
+            calendar.getDefaultEventEnd(dateSpan.allDay, start);
+        var instance = core.createEventInstance(def.defId, { start: start, end: end });
+        return { def: def, instance: instance };
+    }
+    // Utils for extracting data from element
+    // ----------------------------------------------------------------------------------------------------
+    function getDragMetaFromEl(el) {
+        var str = getEmbeddedElData(el, 'event');
+        var obj = str ?
+            JSON.parse(str) :
+            { create: false }; // if no embedded data, assume no event creation
+        return core.parseDragMeta(obj);
+    }
+    core.config.dataAttrPrefix = '';
+    function getEmbeddedElData(el, name) {
+        var prefix = core.config.dataAttrPrefix;
+        var prefixedName = (prefix ? prefix + '-' : '') + name;
+        return el.getAttribute('data-' + prefixedName) || '';
+    }
+
+    /*
+    Makes an element (that is *external* to any calendar) draggable.
+    Can pass in data that determines how an event will be created when dropped onto a calendar.
+    Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
+    */
+    var ExternalDraggable = /** @class */ (function () {
+        function ExternalDraggable(el, settings) {
+            var _this = this;
+            if (settings === void 0) { settings = {}; }
+            this.handlePointerDown = function (ev) {
+                var dragging = _this.dragging;
+                var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
+                dragging.minDistance =
+                    minDistance != null ?
+                        minDistance :
+                        (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance);
+                dragging.delay =
+                    ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
+                        (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) :
+                        0;
+            };
+            this.handleDragStart = function (ev) {
+                if (ev.isTouch &&
+                    _this.dragging.delay &&
+                    ev.subjectEl.classList.contains('fc-event')) {
+                    _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
+                }
+            };
+            this.settings = settings;
+            var dragging = this.dragging = new FeaturefulElementDragging(el);
+            dragging.touchScrollAllowed = false;
+            if (settings.itemSelector != null) {
+                dragging.pointer.selector = settings.itemSelector;
+            }
+            if (settings.appendTo != null) {
+                dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
+            }
+            dragging.emitter.on('pointerdown', this.handlePointerDown);
+            dragging.emitter.on('dragstart', this.handleDragStart);
+            new ExternalElementDragging(dragging, settings.eventData);
+        }
+        ExternalDraggable.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return ExternalDraggable;
+    }());
+
+    /*
+    Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
+    The third-party system is responsible for drawing the visuals effects of the drag.
+    This class simply monitors for pointer movements and fires events.
+    It also has the ability to hide the moving element (the "mirror") during the drag.
+    */
+    var InferredElementDragging = /** @class */ (function (_super) {
+        __extends(InferredElementDragging, _super);
+        function InferredElementDragging(containerEl) {
+            var _this = _super.call(this, containerEl) || this;
+            _this.shouldIgnoreMove = false;
+            _this.mirrorSelector = '';
+            _this.currentMirrorEl = null;
+            _this.handlePointerDown = function (ev) {
+                _this.emitter.trigger('pointerdown', ev);
+                if (!_this.shouldIgnoreMove) {
+                    // fire dragstart right away. does not support delay or min-distance
+                    _this.emitter.trigger('dragstart', ev);
+                }
+            };
+            _this.handlePointerMove = function (ev) {
+                if (!_this.shouldIgnoreMove) {
+                    _this.emitter.trigger('dragmove', ev);
+                }
+            };
+            _this.handlePointerUp = function (ev) {
+                _this.emitter.trigger('pointerup', ev);
+                if (!_this.shouldIgnoreMove) {
+                    // fire dragend right away. does not support a revert animation
+                    _this.emitter.trigger('dragend', ev);
+                }
+            };
+            var pointer = _this.pointer = new PointerDragging(containerEl);
+            pointer.emitter.on('pointerdown', _this.handlePointerDown);
+            pointer.emitter.on('pointermove', _this.handlePointerMove);
+            pointer.emitter.on('pointerup', _this.handlePointerUp);
+            return _this;
+        }
+        InferredElementDragging.prototype.destroy = function () {
+            this.pointer.destroy();
+        };
+        InferredElementDragging.prototype.setIgnoreMove = function (bool) {
+            this.shouldIgnoreMove = bool;
+        };
+        InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
+            if (bool) {
+                // restore a previously hidden element.
+                // use the reference in case the selector class has already been removed.
+                if (this.currentMirrorEl) {
+                    this.currentMirrorEl.style.visibility = '';
+                    this.currentMirrorEl = null;
+                }
+            }
+            else {
+                var mirrorEl = this.mirrorSelector ?
+                    document.querySelector(this.mirrorSelector) :
+                    null;
+                if (mirrorEl) {
+                    this.currentMirrorEl = mirrorEl;
+                    mirrorEl.style.visibility = 'hidden';
+                }
+            }
+        };
+        return InferredElementDragging;
+    }(core.ElementDragging));
+
+    /*
+    Bridges third-party drag-n-drop systems with FullCalendar.
+    Must be instantiated and destroyed by caller.
+    */
+    var ThirdPartyDraggable = /** @class */ (function () {
+        function ThirdPartyDraggable(containerOrSettings, settings) {
+            var containerEl = document;
+            if (
+            // wish we could just test instanceof EventTarget, but doesn't work in IE11
+            containerOrSettings === document ||
+                containerOrSettings instanceof Element) {
+                containerEl = containerOrSettings;
+                settings = settings || {};
+            }
+            else {
+                settings = (containerOrSettings || {});
+            }
+            var dragging = this.dragging = new InferredElementDragging(containerEl);
+            if (typeof settings.itemSelector === 'string') {
+                dragging.pointer.selector = settings.itemSelector;
+            }
+            else if (containerEl === document) {
+                dragging.pointer.selector = '[data-event]';
+            }
+            if (typeof settings.mirrorSelector === 'string') {
+                dragging.mirrorSelector = settings.mirrorSelector;
+            }
+            new ExternalElementDragging(dragging, settings.eventData);
+        }
+        ThirdPartyDraggable.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return ThirdPartyDraggable;
+    }());
+
+    var main = core.createPlugin({
+        componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
+        calendarInteractions: [UnselectAuto],
+        elementDraggingImpl: FeaturefulElementDragging
+    });
+
+    exports.Draggable = ExternalDraggable;
+    exports.FeaturefulElementDragging = FeaturefulElementDragging;
+    exports.PointerDragging = PointerDragging;
+    exports.ThirdPartyDraggable = ThirdPartyDraggable;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/interaction/main.min.js b/backoffice/vendors/fullcalendar/interaction/main.min.js
new file mode 100644 (file)
index 0000000..dbf45a2
--- /dev/null
@@ -0,0 +1,21 @@
+/*!
+FullCalendar Interaction Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarInteraction={},e.FullCalendar))}(this,function(e,t){"use strict";function n(e,t){function n(){this.constructor=e}m(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function r(e){return 0===e.button&&!e.ctrlKey}function i(){y++,setTimeout(function(){y--},t.config.touchMouseIgnoreWait)}function o(){D++||window.addEventListener("touchmove",l,{passive:!1})}function a(){--D||window.removeEventListener("touchmove",l,{passive:!1})}function l(e){w&&e.preventDefault()}function s(e){var t=e.tagName;return"HTML"===t||"BODY"===t}function c(e,n){return!e&&!n||Boolean(e)===Boolean(n)&&t.isDateSpansEqual(e.dateSpan,n.dateSpan)}function d(e){var t=e.opt("selectLongPressDelay");return null==t&&(t=e.opt("longPressDelay")),t}function u(e,n,r){var i=e.dateSpan,o=n.dateSpan,a=[i.range.start,i.range.end,o.range.start,o.range.end];a.sort(t.compareNumbers);for(var l={},s=0,c=r;s<c.length;s++){var d=c[s],u=d(e,n);if(!1===u)return null;u&&S(l,u)}return l.range={start:a[0],end:a[3]},l.allDay=i.allDay,l}function g(e,n,r){var i=e.dateSpan,o=n.dateSpan,a=i.range.start,l=o.range.start,s={};i.allDay!==o.allDay&&(s.allDay=o.allDay,s.hasEnd=n.component.opt("allDayMaintainDuration"),o.allDay&&(a=t.startOfDay(a)));var c=t.diffDates(a,l,e.component.dateEnv,e.component===n.component?e.component.largeUnit:null);c.milliseconds&&(s.allDay=!1);for(var d={startDelta:c,endDelta:c,standardProps:s},u=0,g=r;u<g.length;u++){(0,g[u])(d,e,n)}return d}function h(e){var t=e.opt("eventLongPressDelay");return null==t&&(t=e.opt("longPressDelay")),t}function p(e,n,r,i,o){for(var a=e.component.dateEnv,l=e.dateSpan.range.start,s=n.dateSpan.range.start,c=t.diffDates(l,s,a,e.component.largeUnit),d={},u=0,g=o;u<g.length;u++){var h=g[u],p=h(e,n);if(!1===p)return null;p&&S(d,p)}if(r){if(a.add(i.start,c)<i.end)return d.startDelta=c,d}else if(a.add(i.end,c)>i.start)return d.endDelta=c,d;return null}function v(e,n,r){for(var i=S({},n.leftoverProps),o=0,a=r.pluginSystem.hooks.externalDefTransforms;o<a.length;o++){var l=a[o];S(i,l(e,n))}var s=t.parseEventDef(i,n.sourceId,e.allDay,r.opt("forceEventDuration")||Boolean(n.duration),r),c=e.range.start;e.allDay&&n.startTime&&(c=r.dateEnv.add(c,n.startTime));var d=n.duration?r.dateEnv.add(c,n.duration):r.getDefaultEventEnd(e.allDay,c);return{def:s,instance:t.createEventInstance(s.defId,{start:c,end:d})}}function f(e){var n=E(e,"event"),r=n?JSON.parse(n):{create:!1};return t.parseDragMeta(r)}function E(e,n){var r=t.config.dataAttrPrefix,i=(r?r+"-":"")+n;return e.getAttribute("data-"+i)||""}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var m=function(e,t){return(m=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},S=function(){return S=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++){t=arguments[n];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e},S.apply(this,arguments)};t.config.touchMouseIgnoreWait=500;var y=0,D=0,w=!1,T=function(){function e(e){var n=this;this.subjectEl=null,this.downEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=function(e){if(!n.shouldIgnoreMouse()&&r(e)&&n.tryStart(e)){var t=n.createEventFromMouse(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t),n.shouldIgnoreMove||document.addEventListener("mousemove",n.handleMouseMove),document.addEventListener("mouseup",n.handleMouseUp)}},this.handleMouseMove=function(e){var t=n.createEventFromMouse(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleMouseUp=function(e){document.removeEventListener("mousemove",n.handleMouseMove),document.removeEventListener("mouseup",n.handleMouseUp),n.emitter.trigger("pointerup",n.createEventFromMouse(e)),n.cleanup()},this.handleTouchStart=function(e){if(n.tryStart(e)){n.isTouchDragging=!0;var t=n.createEventFromTouch(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t);var r=e.target;n.shouldIgnoreMove||r.addEventListener("touchmove",n.handleTouchMove),r.addEventListener("touchend",n.handleTouchEnd),r.addEventListener("touchcancel",n.handleTouchEnd),window.addEventListener("scroll",n.handleTouchScroll,!0)}},this.handleTouchMove=function(e){var t=n.createEventFromTouch(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleTouchEnd=function(e){if(n.isDragging){var t=e.target;t.removeEventListener("touchmove",n.handleTouchMove),t.removeEventListener("touchend",n.handleTouchEnd),t.removeEventListener("touchcancel",n.handleTouchEnd),window.removeEventListener("scroll",n.handleTouchScroll,!0),n.emitter.trigger("pointerup",n.createEventFromTouch(e)),n.cleanup(),n.isTouchDragging=!1,i()}},this.handleTouchScroll=function(){n.wasTouchScroll=!0},this.handleScroll=function(e){if(!n.shouldIgnoreMove){var t=window.pageXOffset-n.prevScrollX+n.prevPageX,r=window.pageYOffset-n.prevScrollY+n.prevPageY;n.emitter.trigger("pointermove",{origEvent:e,isTouch:n.isTouchDragging,subjectEl:n.subjectEl,pageX:t,pageY:r,deltaX:t-n.origPageX,deltaY:r-n.origPageY})}},this.containerEl=e,this.emitter=new t.EmitterMixin,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),o()}return e.prototype.destroy=function(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),a()},e.prototype.tryStart=function(e){var n=this.querySubjectEl(e),r=e.target;return!(!n||this.handleSelector&&!t.elementClosest(r,this.handleSelector))&&(this.subjectEl=n,this.downEl=r,this.isDragging=!0,this.wasTouchScroll=!1,!0)},e.prototype.cleanup=function(){w=!1,this.isDragging=!1,this.subjectEl=null,this.downEl=null,this.destroyScrollWatch()},e.prototype.querySubjectEl=function(e){return this.selector?t.elementClosest(e.target,this.selector):this.containerEl},e.prototype.shouldIgnoreMouse=function(){return y||this.isTouchDragging},e.prototype.cancelTouchScroll=function(){this.isDragging&&(w=!0)},e.prototype.initScrollWatch=function(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))},e.prototype.recordCoords=function(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)},e.prototype.destroyScrollWatch=function(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)},e.prototype.createEventFromMouse=function(e,t){var n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}},e.prototype.createEventFromTouch=function(e,t){var n,r,i=e.touches,o=0,a=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(o=n-this.origPageX,a=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:o,deltaY:a}},e}(),M=function(){function e(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}return e.prototype.start=function(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()},e.prototype.handleMove=function(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()},e.prototype.setIsVisible=function(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)},e.prototype.stop=function(e,t){var n=this,r=function(){n.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(r,this.revertDuration):setTimeout(r,0)},e.prototype.doRevertAnimation=function(e,n){var r=this.mirrorEl,i=this.sourceEl.getBoundingClientRect();r.style.transition="top "+n+"ms,left "+n+"ms",t.applyStyle(r,{left:i.left,top:i.top}),t.whenTransitionDone(r,function(){r.style.transition="",e()})},e.prototype.cleanup=function(){this.mirrorEl&&(t.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null},e.prototype.updateElPosition=function(){this.sourceEl&&this.isVisible&&t.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})},e.prototype.getMirrorEl=function(){var e=this.sourceElRect,n=this.mirrorEl;return n||(n=this.mirrorEl=this.sourceEl.cloneNode(!0),n.classList.add("fc-unselectable"),n.classList.add("fc-dragging"),t.applyStyle(n,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(n)),n},e}(),b=function(e){function t(t,n){var r=e.call(this)||this;return r.handleScroll=function(){r.scrollTop=r.scrollController.getScrollTop(),r.scrollLeft=r.scrollController.getScrollLeft(),r.handleScrollChange()},r.scrollController=t,r.doesListening=n,r.scrollTop=r.origScrollTop=t.getScrollTop(),r.scrollLeft=r.origScrollLeft=t.getScrollLeft(),r.scrollWidth=t.getScrollWidth(),r.scrollHeight=t.getScrollHeight(),r.clientWidth=t.getClientWidth(),r.clientHeight=t.getClientHeight(),r.clientRect=r.computeClientRect(),r.doesListening&&r.getEventTarget().addEventListener("scroll",r.handleScroll),r}return n(t,e),t.prototype.destroy=function(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)},t.prototype.getScrollTop=function(){return this.scrollTop},t.prototype.getScrollLeft=function(){return this.scrollLeft},t.prototype.setScrollTop=function(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())},t.prototype.setScrollLeft=function(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())},t.prototype.getClientWidth=function(){return this.clientWidth},t.prototype.getClientHeight=function(){return this.clientHeight},t.prototype.getScrollWidth=function(){return this.scrollWidth},t.prototype.getScrollHeight=function(){return this.scrollHeight},t.prototype.handleScrollChange=function(){},t}(t.ScrollController),C=function(e){function r(n,r){return e.call(this,new t.ElementScrollController(n),r)||this}return n(r,e),r.prototype.getEventTarget=function(){return this.scrollController.el},r.prototype.computeClientRect=function(){return t.computeInnerRect(this.scrollController.el)},r}(b),R=function(e){function r(n){return e.call(this,new t.WindowScrollController,n)||this}return n(r,e),r.prototype.getEventTarget=function(){return window},r.prototype.computeClientRect=function(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}},r.prototype.handleScrollChange=function(){this.clientRect=this.computeClientRect()},r}(b),I="function"==typeof performance?performance.now:Date.now,P=function(){function e(){var e=this;this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=function(){if(e.isAnimating){var t=e.computeBestEdge(e.pointerScreenX+window.pageXOffset,e.pointerScreenY+window.pageYOffset);if(t){var n=I();e.handleSide(t,(n-e.msSinceRequest)/1e3),e.requestAnimation(n)}else e.isAnimating=!1}}}return e.prototype.start=function(e,t){this.isEnabled&&(this.scrollCaches=this.buildCaches(),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))},e.prototype.handleMove=function(e,t){if(this.isEnabled){var n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,o=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(I()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}this.scrollCaches=null}},e.prototype.requestAnimation=function(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)},e.prototype.handleSide=function(e,t){var n=e.scrollCache,r=this.edgeThreshold,i=r-e.distance,o=i*i/(r*r)*this.maxVelocity*t,a=1;switch(e.name){case"left":a=-1;case"right":n.setScrollLeft(n.getScrollLeft()+o*a);break;case"top":a=-1;case"bottom":n.setScrollTop(n.getScrollTop()+o*a)}},e.prototype.computeBestEdge=function(e,t){for(var n=this.edgeThreshold,r=null,i=0,o=this.scrollCaches;i<o.length;i++){var a=o[i],l=a.clientRect,s=e-l.left,c=l.right-e,d=t-l.top,u=l.bottom-t;s>=0&&c>=0&&d>=0&&u>=0&&(d<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"top",distance:d}),u<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"bottom",distance:u}),s<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:a,name:"left",distance:s}),c<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"right",distance:c}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map(function(e){return e===window?new R(!1):new C(e,!1)})},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t<n.length;t++){var r=n[t];"object"==typeof r?e.push(r):e.push.apply(e,Array.prototype.slice.call(document.querySelectorAll(r)))}return e},e}(),L=function(e){function r(n){var r=e.call(this,n)||this;r.delay=null,r.minDistance=0,r.touchScrollAllowed=!0,r.mirrorNeedsRevert=!1,r.isInteracting=!1,r.isDragging=!1,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,r.delayTimeoutId=null,r.onPointerDown=function(e){r.isDragging||(r.isInteracting=!0,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,t.preventSelection(document.body),t.preventContextMenu(document.body),e.isTouch||e.origEvent.preventDefault(),r.emitter.trigger("pointerdown",e),r.pointer.shouldIgnoreMove||(r.mirror.setIsVisible(!1),r.mirror.start(e.subjectEl,e.pageX,e.pageY),r.startDelay(e),r.minDistance||r.handleDistanceSurpassed(e)))},r.onPointerMove=function(e){if(r.isInteracting){if(r.emitter.trigger("pointermove",e),!r.isDistanceSurpassed){var t=r.minDistance,n=void 0,i=e.deltaX,o=e.deltaY;n=i*i+o*o,n>=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,t.allowSelection(document.body),t.allowContextMenu(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var i=r.pointer=new T(n);return i.emitter.on("pointerdown",r.onPointerDown),i.emitter.on("pointermove",r.onPointerMove),i.emitter.on("pointerup",r.onPointerUp),r.mirror=new M,r.autoScroller=new P,r}return n(r,e),r.prototype.destroy=function(){this.pointer.destroy()},r.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout(function(){t.delayTimeoutId=null,t.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)},r.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},r.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},r.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},r.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},r.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},r.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},r.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},r.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},r.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},r}(t.ElementDragging),j=function(){function e(e){this.origRect=t.computeRect(e),this.scrollCaches=t.getClippingParents(e).map(function(e){return new C(e,!0)})}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}},e.prototype.computeLeft=function(){for(var e=this.origRect.left,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollLeft-r.getScrollLeft()}return e},e.prototype.computeTop=function(){for(var e=this.origRect.top,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollTop-r.getScrollTop()}return e},e.prototype.isWithinClipping=function(e,n){for(var r={left:e,top:n},i=0,o=this.scrollCaches;i<o.length;i++){var a=o[i];if(!s(a.getEventTarget())&&!t.pointInsideRect(r,a.clientRect))return!1}return!0},e}(),A=function(){function e(e,n){var r=this;this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=function(e){var t=r.dragging;r.initialHit=null,r.movingHit=null,r.finalHit=null,r.prepareHits(),r.processFirstCoord(e),r.initialHit||!r.requireInitial?(t.setIgnoreMove(!1),r.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=function(e){r.emitter.trigger("dragstart",e),r.handleMove(e,!0)},this.handleDragMove=function(e){r.emitter.trigger("dragmove",e),r.handleMove(e)},this.handlePointerUp=function(e){r.releaseHits(),r.emitter.trigger("pointerup",e)},this.handleDragEnd=function(e){r.movingHit&&r.emitter.trigger("hitupdate",null,!0,e),r.finalHit=r.movingHit,r.movingHit=null,r.emitter.trigger("dragend",e)},this.droppableStore=n,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new t.EmitterMixin}return e.prototype.processFirstCoord=function(e){var n,r={left:e.pageX,top:e.pageY},i=r,o=e.subjectEl;o!==document&&(n=t.computeRect(o),i=t.constrainPoint(i,n));var a=this.initialHit=this.queryHitForOffset(i.left,i.top);if(a){if(this.useSubjectCenter&&n){var l=t.intersectRects(n,a.rect);l&&(i=t.getRectCenter(l))}this.coordAdjust=t.diffPoints(i,r)}else this.coordAdjust={left:0,top:0}},e.prototype.handleMove=function(e,t){var n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&c(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))},e.prototype.prepareHits=function(){this.offsetTrackers=t.mapHash(this.droppableStore,function(e){return e.component.buildPositionCaches(),new j(e.el)})},e.prototype.releaseHits=function(){var e=this.offsetTrackers;for(var t in e)e[t].destroy();this.offsetTrackers={}},e.prototype.queryHitForOffset=function(e,n){var r=this,i=r.droppableStore,o=r.offsetTrackers,a=null;for(var l in i){var s=i[l].component,c=o[l];if(c.isWithinClipping(e,n)){var d=c.computeLeft(),u=c.computeTop(),g=e-d,h=n-u,p=c.origRect,v=p.right-p.left,f=p.bottom-p.top;if(g>=0&&g<v&&h>=0&&h<f){var E=s.queryHit(g,h,v,f);!E||s.props.dateProfile&&!t.rangeContainsRange(s.props.dateProfile.activeRange,E.dateSpan.range)||a&&!(E.layer>a.layer)||(E.rect.left+=d,E.rect.right+=d,E.rect.top+=u,E.rect.bottom+=u,a=E)}}}return a},e}(),H=function(e){function r(n){var r=e.call(this,n)||this;r.handlePointerDown=function(e){var t=r.dragging;t.setIgnoreMove(!r.component.isValidDateDownEl(t.pointer.downEl))},r.handleDragEnd=function(e){var t=r.component;if(!r.dragging.pointer.wasTouchScroll){var n=r.hitDragging,i=n.initialHit,o=n.finalHit;i&&o&&c(i,o)&&t.calendar.triggerDateClick(i.dateSpan,i.dayEl,t.view,e.origEvent)}};var i=n.component;r.dragging=new L(i.el),r.dragging.autoScroller.isEnabled=!1;var o=r.hitDragging=new A(r.dragging,t.interactionSettingsToStore(n));return o.emitter.on("pointerdown",r.handlePointerDown),o.emitter.on("dragend",r.handleDragEnd),r}return n(r,e),r.prototype.destroy=function(){this.dragging.destroy()},r}(t.Interaction),N=function(e){function r(n){var r=e.call(this,n)||this;r.dragSelection=null,r.handlePointerDown=function(e){var t=r,n=t.component,i=t.dragging,o=n.opt("selectable")&&n.isValidDateDownEl(e.origEvent.target);i.setIgnoreMove(!o),i.delay=e.isTouch?d(n):null},r.handleDragStart=function(e){r.component.calendar.unselect(e)},r.handleHitUpdate=function(e,n){var i=r.component.calendar,o=null,a=!1;e&&((o=u(r.hitDragging.initialHit,e,i.pluginSystem.hooks.dateSelectionTransformers))&&r.component.isDateSelectionValid(o)||(a=!0,o=null)),o?i.dispatch({type:"SELECT_DATES",selection:o}):n||i.dispatch({type:"UNSELECT_DATES"}),a?t.disableCursor():t.enableCursor(),n||(r.dragSelection=o)},r.handlePointerUp=function(e){r.dragSelection&&(r.component.calendar.triggerDateSelect(r.dragSelection,e),r.dragSelection=null)};var i=n.component,o=r.dragging=new L(i.el);o.touchScrollAllowed=!1,o.minDistance=i.opt("selectMinDistance")||0,o.autoScroller.isEnabled=i.opt("dragScroll");var a=r.hitDragging=new A(r.dragging,t.interactionSettingsToStore(n));return a.emitter.on("pointerdown",r.handlePointerDown),a.emitter.on("dragstart",r.handleDragStart),a.emitter.on("hitupdate",r.handleHitUpdate),a.emitter.on("pointerup",r.handlePointerUp),r}return n(r,e),r.prototype.destroy=function(){this.dragging.destroy()},r}(t.Interaction),V=function(e){function r(n){var i=e.call(this,n)||this;i.subjectSeg=null,i.isDragging=!1,i.eventRange=null,i.relevantEvents=null,i.receivingCalendar=null,i.validMutation=null,i.mutatedRelevantEvents=null,i.handlePointerDown=function(e){var n=e.origEvent.target,r=i,o=r.component,a=r.dragging,l=a.mirror,s=o.calendar,c=i.subjectSeg=t.getElSeg(e.subjectEl),d=i.eventRange=c.eventRange,u=d.instance.instanceId;i.relevantEvents=t.getRelevantEvents(s.state.eventStore,u),a.minDistance=e.isTouch?0:o.opt("eventDragMinDistance"),a.delay=e.isTouch&&u!==o.props.eventSelection?h(o):null,l.parentNode=s.el,l.revertDuration=o.opt("dragRevertDuration");var g=o.isValidSegDownEl(n)&&!t.elementClosest(n,".fc-resizer");a.setIgnoreMove(!g),i.isDragging=g&&e.subjectEl.classList.contains("fc-draggable")},i.handleDragStart=function(e){var n=i.component.calendar,r=i.eventRange,o=r.instance.instanceId;e.isTouch?o!==i.component.props.eventSelection&&n.dispatch({type:"SELECT_EVENT",eventInstanceId:o}):n.dispatch({type:"UNSELECT_EVENT"}),i.isDragging&&(n.unselect(e),n.publiclyTrigger("eventDragStart",[{el:i.subjectSeg.el,event:new t.EventApi(n,r.def,r.instance),jsEvent:e.origEvent,view:i.component.view}]))},i.handleHitUpdate=function(e,n){if(i.isDragging){var r=i.relevantEvents,o=i.hitDragging.initialHit,a=i.component.calendar,l=null,s=null,d=null,u=!1,h={affectedEvents:r,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:i.subjectSeg};if(e){var p=e.component;l=p.calendar,a===l||p.opt("editable")&&p.opt("droppable")?(s=g(o,e,l.pluginSystem.hooks.eventDragMutationMassagers))&&(d=t.applyMutationToEventStore(r,l.eventUiBases,s,l),h.mutatedEvents=d,p.isInteractionValid(h)||(u=!0,s=null,d=null,h.mutatedEvents=t.createEmptyEventStore())):l=null}i.displayDrag(l,h),u?t.disableCursor():t.enableCursor(),n||(a===l&&c(o,e)&&(s=null),i.dragging.setMirrorNeedsRevert(!s),i.dragging.setMirrorIsVisible(!e||!document.querySelector(".fc-mirror")),i.receivingCalendar=l,i.validMutation=s,i.mutatedRelevantEvents=d)}},i.handlePointerUp=function(){i.isDragging||i.cleanup()},i.handleDragEnd=function(e){if(i.isDragging){var n=i.component.calendar,r=i.component.view,o=i.receivingCalendar,a=i.eventRange.def,l=i.eventRange.instance,s=new t.EventApi(n,a,l),c=i.relevantEvents,d=i.mutatedRelevantEvents,u=i.hitDragging.finalHit;if(i.clearDrag(),n.publiclyTrigger("eventDragStop",[{el:i.subjectSeg.el,event:s,jsEvent:e.origEvent,view:r}]),i.validMutation){if(o===n){n.dispatch({type:"MERGE_EVENTS",eventStore:d});for(var g={},h=0,p=n.pluginSystem.hooks.eventDropTransformers;h<p.length;h++){var v=p[h];S(g,v(i.validMutation,n))}S(g,{el:e.subjectEl,delta:i.validMutation.startDelta,oldEvent:s,event:new t.EventApi(n,d.defs[a.defId],l?d.instances[l.instanceId]:null),revert:function(){n.dispatch({type:"MERGE_EVENTS",eventStore:c})},jsEvent:e.origEvent,view:r}),n.publiclyTrigger("eventDrop",[g])}else if(o){n.publiclyTrigger("eventLeave",[{draggedEl:e.subjectEl,event:s,view:r}]),n.dispatch({type:"REMOVE_EVENT_INSTANCES",instances:i.mutatedRelevantEvents.instances}),o.dispatch({type:"MERGE_EVENTS",eventStore:i.mutatedRelevantEvents}),e.isTouch&&o.dispatch({type:"SELECT_EVENT",eventInstanceId:l.instanceId});var f=o.buildDatePointApi(u.dateSpan);f.draggedEl=e.subjectEl,f.jsEvent=e.origEvent,f.view=u.component,o.publiclyTrigger("drop",[f]),o.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(o,d.defs[a.defId],d.instances[l.instanceId]),view:u.component}])}}else n.publiclyTrigger("_noEventDrop")}i.cleanup()};var o=i.component,a=i.dragging=new L(o.el);a.pointer.selector=r.SELECTOR,a.touchScrollAllowed=!1,a.autoScroller.isEnabled=o.opt("dragScroll");var l=i.hitDragging=new A(i.dragging,t.interactionSettingsStore);return l.useSubjectCenter=n.useEventCenter,l.emitter.on("pointerdown",i.handlePointerDown),l.emitter.on("dragstart",i.handleDragStart),l.emitter.on("hitupdate",i.handleHitUpdate),l.emitter.on("pointerup",i.handlePointerUp),l.emitter.on("dragend",i.handleDragEnd),i}return n(r,e),r.prototype.destroy=function(){this.dragging.destroy()},r.prototype.displayDrag=function(e,n){var r=this.component.calendar,i=this.receivingCalendar;i&&i!==e&&(i===r?i.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:n.affectedEvents,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:n.origSeg}}):i.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:n})},r.prototype.clearDrag=function(){var e=this.component.calendar,t=this.receivingCalendar;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})},r.prototype.cleanup=function(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingCalendar=null,this.validMutation=null,this.mutatedRelevantEvents=null},r.SELECTOR=".fc-draggable, .fc-resizable",r}(t.Interaction),Y=function(e){function r(n){var r=e.call(this,n)||this;r.draggingSeg=null,r.eventRange=null,r.relevantEvents=null,r.validMutation=null,r.mutatedRelevantEvents=null,r.handlePointerDown=function(e){var t=r.component,n=r.querySeg(e),i=r.eventRange=n.eventRange;r.dragging.minDistance=t.opt("eventDragMinDistance"),r.dragging.setIgnoreMove(!r.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&r.component.props.eventSelection!==i.instance.instanceId)},r.handleDragStart=function(e){var n=r.component.calendar,i=r.eventRange;r.relevantEvents=t.getRelevantEvents(n.state.eventStore,r.eventRange.instance.instanceId),r.draggingSeg=r.querySeg(e),n.unselect(),n.publiclyTrigger("eventResizeStart",[{el:r.draggingSeg.el,event:new t.EventApi(n,i.def,i.instance),jsEvent:e.origEvent,view:r.component.view}])},r.handleHitUpdate=function(e,n,i){var o=r.component.calendar,a=r.relevantEvents,l=r.hitDragging.initialHit,s=r.eventRange.instance,d=null,u=null,g=!1,h={affectedEvents:a,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:r.draggingSeg};e&&(d=p(l,e,i.subjectEl.classList.contains("fc-start-resizer"),s.range,o.pluginSystem.hooks.eventResizeJoinTransforms)),d&&(u=t.applyMutationToEventStore(a,o.eventUiBases,d,o),h.mutatedEvents=u,r.component.isInteractionValid(h)||(g=!0,d=null,u=null,h.mutatedEvents=null)),u?o.dispatch({type:"SET_EVENT_RESIZE",state:h}):o.dispatch({type:"UNSET_EVENT_RESIZE"}),g?t.disableCursor():t.enableCursor(),n||(d&&c(l,e)&&(d=null),r.validMutation=d,r.mutatedRelevantEvents=u)},r.handleDragEnd=function(e){var n=r.component.calendar,i=r.component.view,o=r.eventRange.def,a=r.eventRange.instance,l=new t.EventApi(n,o,a),s=r.relevantEvents,c=r.mutatedRelevantEvents;n.publiclyTrigger("eventResizeStop",[{el:r.draggingSeg.el,event:l,jsEvent:e.origEvent,view:i}]),r.validMutation?(n.dispatch({type:"MERGE_EVENTS",eventStore:c}),n.publiclyTrigger("eventResize",[{el:r.draggingSeg.el,startDelta:r.validMutation.startDelta||t.createDuration(0),endDelta:r.validMutation.endDelta||t.createDuration(0),prevEvent:l,event:new t.EventApi(n,c.defs[o.defId],a?c.instances[a.instanceId]:null),revert:function(){n.dispatch({type:"MERGE_EVENTS",eventStore:s})},jsEvent:e.origEvent,view:i}])):n.publiclyTrigger("_noEventResize"),r.draggingSeg=null,r.relevantEvents=null,r.validMutation=null};var i=n.component,o=r.dragging=new L(i.el);o.pointer.selector=".fc-resizer",o.touchScrollAllowed=!1,o.autoScroller.isEnabled=i.opt("dragScroll");var a=r.hitDragging=new A(r.dragging,t.interactionSettingsToStore(n));return a.emitter.on("pointerdown",r.handlePointerDown),a.emitter.on("dragstart",r.handleDragStart),a.emitter.on("hitupdate",r.handleHitUpdate),a.emitter.on("dragend",r.handleDragEnd),r}return n(r,e),r.prototype.destroy=function(){this.dragging.destroy()},r.prototype.querySeg=function(e){return t.getElSeg(t.elementClosest(e.subjectEl,this.component.fgSegSelector))},r}(t.Interaction),_=function(){function e(e){var n=this;this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(n.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var r=n,i=r.calendar,o=r.documentPointer,a=i.state;if(!o.wasTouchScroll){if(a.dateSelection&&!n.isRecentPointerDateSelect){var l=i.viewOpt("unselectAuto"),s=i.viewOpt("unselectCancel");!l||l&&t.elementClosest(o.downEl,s)||i.unselect(e)}a.eventSelection&&!t.elementClosest(o.downEl,V.SELECTOR)&&i.dispatch({type:"UNSELECT_EVENT"})}n.isRecentPointerDateSelect=!1},this.calendar=e;var r=this.documentPointer=new T(document);r.shouldIgnoreMove=!0,r.shouldWatchScroll=!1,r.emitter.on("pointerup",this.onDocumentPointerUp),e.on("select",this.onSelect)}return e.prototype.destroy=function(){this.calendar.off("select",this.onSelect),this.documentPointer.destroy()},e}(),X=function(){function e(e,n){var r=this;this.receivingCalendar=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){r.dragMeta=r.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,n,i){var o=r.hitDragging.dragging,a=null,l=null,s=!1,c={affectedEvents:t.createEmptyEventStore(),mutatedEvents:t.createEmptyEventStore(),isEvent:r.dragMeta.create,origSeg:null};e&&(a=e.component.calendar,r.canDropElOnCalendar(i.subjectEl,a)&&(l=v(e.dateSpan,r.dragMeta,a),c.mutatedEvents=t.eventTupleToStore(l),(s=!t.isInteractionValid(c,a))&&(c.mutatedEvents=t.createEmptyEventStore(),l=null))),r.displayDrag(a,c),o.setMirrorIsVisible(n||!l||!document.querySelector(".fc-mirror")),s?t.disableCursor():t.enableCursor(),n||(o.setMirrorNeedsRevert(!l),r.receivingCalendar=a,r.droppableEvent=l)},this.handleDragEnd=function(e){var n=r,i=n.receivingCalendar,o=n.droppableEvent;if(r.clearDrag(),i&&o){var a=r.hitDragging.finalHit,l=a.component.view,s=r.dragMeta,c=i.buildDatePointApi(a.dateSpan);c.draggedEl=e.subjectEl,c.jsEvent=e.origEvent,c.view=l,i.publiclyTrigger("drop",[c]),s.create&&(i.dispatch({type:"MERGE_EVENTS",eventStore:t.eventTupleToStore(o)}),e.isTouch&&i.dispatch({type:"SELECT_EVENT",eventInstanceId:o.instance.instanceId}),i.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(i,o.def,o.instance),view:l}]))}r.receivingCalendar=null,r.droppableEvent=null};var i=this.hitDragging=new A(e,t.interactionSettingsStore);i.requireInitial=!1,i.emitter.on("dragstart",this.handleDragStart),i.emitter.on("hitupdate",this.handleHitUpdate),i.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=n}return e.prototype.buildDragMeta=function(e){return"object"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta(e)):f(e)},e.prototype.displayDrag=function(e,t){var n=this.receivingCalendar;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},e.prototype.clearDrag=function(){this.receivingCalendar&&this.receivingCalendar.dispatch({type:"UNSET_EVENT_DRAG"})},e.prototype.canDropElOnCalendar=function(e,n){var r=n.opt("dropAccept");return"function"==typeof r?r(e):"string"!=typeof r||!r||Boolean(t.elementMatches(e,r))},e}();t.config.dataAttrPrefix="";var U=function(){function e(e,n){var r=this;void 0===n&&(n={}),this.handlePointerDown=function(e){var n=r.dragging,i=r.settings,o=i.minDistance,a=i.longPressDelay;n.minDistance=null!=o?o:e.isTouch?0:t.globalDefaults.eventDragMinDistance,n.delay=e.isTouch?null!=a?a:t.globalDefaults.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&r.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&r.dragging.mirror.getMirrorEl().classList.add("fc-selected")},this.settings=n;var i=this.dragging=new L(e);i.touchScrollAllowed=!1,null!=n.itemSelector&&(i.pointer.selector=n.itemSelector),null!=n.appendTo&&(i.mirror.parentNode=n.appendTo),i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),new X(i,n.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),O=function(e){function t(t){var n=e.call(this,t)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new T(t)
+;return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(t.ElementDragging),q=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var r=this.dragging=new O(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new X(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),W=t.createPlugin({componentInteractions:[H,N,V,Y],calendarInteractions:[_],elementDraggingImpl:L});e.Draggable=U,e.FeaturefulElementDragging=L,e.PointerDragging=T,e.ThirdPartyDraggable=q,e.default=W,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/interaction/package.json b/backoffice/vendors/fullcalendar/interaction/package.json
new file mode 100644 (file)
index 0000000..088bcc7
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "@fullcalendar/interaction",
+  "_id": "@fullcalendar/interaction@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-s9679mbLnBqvQJpIqj4CJi36yGCOXKYshasW7PL5a/BgNXYEScHtdSNZubJx26zHlgGOh8S0wIvBlYQUihMcLQ==",
+  "_location": "/@fullcalendar/interaction",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/interaction",
+    "name": "@fullcalendar/interaction",
+    "escapedName": "@fullcalendar%2finteraction",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-4.1.0.tgz",
+  "_shasum": "5d0c4c2c407934ff8bd45071ff76fb6736937da3",
+  "_spec": "@fullcalendar/interaction",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions",
+  "docs": "https://fullcalendar.io/docs/editable",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/interaction",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Interaction Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/list/LICENSE.txt b/backoffice/vendors/fullcalendar/list/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/list/README.md b/backoffice/vendors/fullcalendar/list/README.md
new file mode 100644 (file)
index 0000000..1122d7f
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar List View Plugin
+
+View your events as a bulleted list
+
+[View the docs &raquo;](https://fullcalendar.io/docs/list-view)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/list/main.css b/backoffice/vendors/fullcalendar/list/main.css
new file mode 100644 (file)
index 0000000..e6dffc8
--- /dev/null
@@ -0,0 +1,101 @@
+/*!
+FullCalendar List View Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+/* List View
+--------------------------------------------------------------------------------------------------*/
+/* possibly reusable */
+.fc-event-dot {
+  display: inline-block;
+  width: 10px;
+  height: 10px;
+  border-radius: 5px; }
+
+/* view wrapper */
+.fc-rtl .fc-list-view {
+  direction: rtl;
+  /* unlike core views, leverage browser RTL */ }
+
+.fc-list-view {
+  border-width: 1px;
+  border-style: solid; }
+
+/* table resets */
+.fc .fc-list-table {
+  table-layout: auto;
+  /* for shrinkwrapping cell content */ }
+
+.fc-list-table td {
+  border-width: 1px 0 0;
+  padding: 8px 14px; }
+
+.fc-list-table tr:first-child td {
+  border-top-width: 0; }
+
+/* day headings with the list */
+.fc-list-heading {
+  border-bottom-width: 1px; }
+
+.fc-list-heading td {
+  font-weight: bold; }
+
+.fc-ltr .fc-list-heading-main {
+  float: left; }
+
+.fc-ltr .fc-list-heading-alt {
+  float: right; }
+
+.fc-rtl .fc-list-heading-main {
+  float: right; }
+
+.fc-rtl .fc-list-heading-alt {
+  float: left; }
+
+/* event list items */
+.fc-list-item.fc-has-url {
+  cursor: pointer;
+  /* whole row will be clickable */ }
+
+.fc-list-item-marker,
+.fc-list-item-time {
+  white-space: nowrap;
+  width: 1px; }
+
+/* make the dot closer to the event title */
+.fc-ltr .fc-list-item-marker {
+  padding-right: 0; }
+
+.fc-rtl .fc-list-item-marker {
+  padding-left: 0; }
+
+.fc-list-item-title a {
+  /* every event title cell has an <a> tag */
+  text-decoration: none;
+  color: inherit; }
+
+.fc-list-item-title a[href]:hover {
+  /* hover effect only on titles with hrefs */
+  text-decoration: underline; }
+
+/* message when no events */
+.fc-list-empty-wrap2 {
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0; }
+
+.fc-list-empty-wrap1 {
+  width: 100%;
+  height: 100%;
+  display: table; }
+
+.fc-list-empty {
+  display: table-cell;
+  vertical-align: middle;
+  text-align: center; }
+
+.fc-unthemed .fc-list-empty {
+  /* theme will provide own background */
+  background-color: #eee; }
diff --git a/backoffice/vendors/fullcalendar/list/main.d.ts b/backoffice/vendors/fullcalendar/list/main.d.ts
new file mode 100644 (file)
index 0000000..9467ae4
--- /dev/null
@@ -0,0 +1,49 @@
+declare module "@fullcalendar/list/ListEventRenderer" {
+    import { FgEventRenderer, Seg } from "@fullcalendar/core";
+    import ListView from "@fullcalendar/list/ListView";
+    export { ListEventRenderer as default, ListEventRenderer };
+    class ListEventRenderer extends FgEventRenderer {
+        listView: ListView;
+        constructor(listView: ListView);
+        attachSegs(segs: Seg[]): void;
+        detachSegs(): void;
+        renderSegHtml(seg: Seg): string;
+        computeEventTimeFormat(): {
+            hour: string;
+            minute: string;
+            meridiem: string;
+        };
+    }
+}
+
+declare module "@fullcalendar/list/ListView" {
+    import { View, ViewProps, ScrollComponent, DateMarker, DateRange, DateProfileGenerator, ComponentContext, ViewSpec, EventUiHash, EventRenderRange, EventStore, Seg } from "@fullcalendar/core";
+    export { ListView as default, ListView };
+    class ListView extends View {
+        scroller: ScrollComponent;
+        contentEl: HTMLElement;
+        dayDates: DateMarker[];
+        private computeDateVars;
+        private eventStoreToSegs;
+        private renderContent;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        render(props: ViewProps): void;
+        destroy(): void;
+        updateSize(isResize: any, viewHeight: any, isAuto: any): void;
+        computeScrollerHeight(viewHeight: any): number;
+        _eventStoreToSegs(eventStore: EventStore, eventUiBases: EventUiHash, dayRanges: DateRange[]): Seg[];
+        eventRangesToSegs(eventRanges: EventRenderRange[], dayRanges: DateRange[]): any[];
+        eventRangeToSegs(eventRange: EventRenderRange, dayRanges: DateRange[]): any[];
+        renderEmptyMessage(): void;
+        renderSegList(allSegs: any): void;
+        groupSegsByDay(segs: any): any[];
+        buildDayHeaderRow(dayDate: any): HTMLTableRowElement;
+    }
+}
+
+declare module "@fullcalendar/list" {
+    import ListView from "@fullcalendar/list/ListView";
+    export { ListView };
+    const _default_9: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_9;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/list/main.js b/backoffice/vendors/fullcalendar/list/main.js
new file mode 100644 (file)
index 0000000..1611781
--- /dev/null
@@ -0,0 +1,341 @@
+/*!
+FullCalendar List View Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar));
+}(this, function (exports, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var ListEventRenderer = /** @class */ (function (_super) {
+        __extends(ListEventRenderer, _super);
+        function ListEventRenderer(listView) {
+            var _this = _super.call(this, listView.context) || this;
+            _this.listView = listView;
+            return _this;
+        }
+        ListEventRenderer.prototype.attachSegs = function (segs) {
+            if (!segs.length) {
+                this.listView.renderEmptyMessage();
+            }
+            else {
+                this.listView.renderSegList(segs);
+            }
+        };
+        ListEventRenderer.prototype.detachSegs = function () {
+        };
+        // generates the HTML for a single event row
+        ListEventRenderer.prototype.renderSegHtml = function (seg) {
+            var _a = this.context, view = _a.view, theme = _a.theme;
+            var eventRange = seg.eventRange;
+            var eventDef = eventRange.def;
+            var eventInstance = eventRange.instance;
+            var eventUi = eventRange.ui;
+            var url = eventDef.url;
+            var classes = ['fc-list-item'].concat(eventUi.classNames);
+            var bgColor = eventUi.backgroundColor;
+            var timeHtml;
+            if (eventDef.allDay) {
+                timeHtml = core.getAllDayHtml(view);
+            }
+            else if (core.isMultiDayRange(eventRange.range)) {
+                if (seg.isStart) {
+                    timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
+                    ));
+                }
+                else if (seg.isEnd) {
+                    timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
+                    ));
+                }
+                else { // inner segment that lasts the whole day
+                    timeHtml = core.getAllDayHtml(view);
+                }
+            }
+            else {
+                // Display the normal time text for the *event's* times
+                timeHtml = core.htmlEscape(this.getTimeText(eventRange));
+            }
+            if (url) {
+                classes.push('fc-has-url');
+            }
+            return '<tr class="' + classes.join(' ') + '">' +
+                (this.displayEventTime ?
+                    '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
+                        (timeHtml || '') +
+                        '</td>' :
+                    '') +
+                '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
+                '<span class="fc-event-dot"' +
+                (bgColor ?
+                    ' style="background-color:' + bgColor + '"' :
+                    '') +
+                '></span>' +
+                '</td>' +
+                '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
+                '<a' + (url ? ' href="' + core.htmlEscape(url) + '"' : '') + '>' +
+                core.htmlEscape(eventDef.title || '') +
+                '</a>' +
+                '</td>' +
+                '</tr>';
+        };
+        // like "4:00am"
+        ListEventRenderer.prototype.computeEventTimeFormat = function () {
+            return {
+                hour: 'numeric',
+                minute: '2-digit',
+                meridiem: 'short'
+            };
+        };
+        return ListEventRenderer;
+    }(core.FgEventRenderer));
+
+    /*
+    Responsible for the scroller, and forwarding event-related actions into the "grid".
+    */
+    var ListView = /** @class */ (function (_super) {
+        __extends(ListView, _super);
+        function ListView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.computeDateVars = core.memoize(computeDateVars);
+            _this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs);
+            var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
+            _this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
+            _this.el.classList.add('fc-list-view');
+            var listViewClassNames = (_this.theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
+            for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
+                var listViewClassName = listViewClassNames_1[_i];
+                if (listViewClassName) { // in case input was empty string
+                    _this.el.classList.add(listViewClassName);
+                }
+            }
+            _this.scroller = new core.ScrollComponent('hidden', // overflow x
+            'auto' // overflow y
+            );
+            _this.el.appendChild(_this.scroller.el);
+            _this.contentEl = _this.scroller.el; // shortcut
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.el
+                // TODO: make aware that it doesn't do Hits
+            });
+            return _this;
+        }
+        ListView.prototype.render = function (props) {
+            var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
+            this.dayDates = dayDates;
+            this.renderContent(this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
+        };
+        ListView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.scroller.destroy(); // will remove the Grid too
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
+            _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
+            this.eventRenderer.computeSizes(isResize);
+            this.eventRenderer.assignSizes(isResize);
+            this.scroller.clear(); // sets height to 'auto' and clears overflow
+            if (!isAuto) {
+                this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
+            }
+        };
+        ListView.prototype.computeScrollerHeight = function (viewHeight) {
+            return viewHeight -
+                core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
+        };
+        ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
+            return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.nextDayThreshold).fg, dayRanges);
+        };
+        ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
+            var segs = [];
+            for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
+                var eventRange = eventRanges_1[_i];
+                segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
+            }
+            return segs;
+        };
+        ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
+            var _a = this, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
+            var range = eventRange.range;
+            var allDay = eventRange.def.allDay;
+            var dayIndex;
+            var segRange;
+            var seg;
+            var segs = [];
+            for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
+                segRange = core.intersectRanges(range, dayRanges[dayIndex]);
+                if (segRange) {
+                    seg = {
+                        component: this,
+                        eventRange: eventRange,
+                        start: segRange.start,
+                        end: segRange.end,
+                        isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
+                        isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
+                        dayIndex: dayIndex
+                    };
+                    segs.push(seg);
+                    // detect when range won't go fully into the next day,
+                    // and mutate the latest seg to the be the end.
+                    if (!seg.isEnd && !allDay &&
+                        dayIndex + 1 < dayRanges.length &&
+                        range.end <
+                            dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
+                        seg.end = range.end;
+                        seg.isEnd = true;
+                        break;
+                    }
+                }
+            }
+            return segs;
+        };
+        ListView.prototype.renderEmptyMessage = function () {
+            this.contentEl.innerHTML =
+                '<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
+                    '<div class="fc-list-empty-wrap1">' +
+                    '<div class="fc-list-empty">' +
+                    core.htmlEscape(this.opt('noEventsMessage')) +
+                    '</div>' +
+                    '</div>' +
+                    '</div>';
+        };
+        // called by ListEventRenderer
+        ListView.prototype.renderSegList = function (allSegs) {
+            var segsByDay = this.groupSegsByDay(allSegs); // sparse array
+            var dayIndex;
+            var daySegs;
+            var i;
+            var tableEl = core.htmlToElement('<table class="fc-list-table ' + this.calendar.theme.getClass('tableList') + '"><tbody></tbody></table>');
+            var tbodyEl = tableEl.querySelector('tbody');
+            for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
+                daySegs = segsByDay[dayIndex];
+                if (daySegs) { // sparse array, so might be undefined
+                    // append a day header
+                    tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
+                    daySegs = this.eventRenderer.sortEventSegs(daySegs);
+                    for (i = 0; i < daySegs.length; i++) {
+                        tbodyEl.appendChild(daySegs[i].el); // append event row
+                    }
+                }
+            }
+            this.contentEl.innerHTML = '';
+            this.contentEl.appendChild(tableEl);
+        };
+        // Returns a sparse array of arrays, segs grouped by their dayIndex
+        ListView.prototype.groupSegsByDay = function (segs) {
+            var segsByDay = []; // sparse array
+            var i;
+            var seg;
+            for (i = 0; i < segs.length; i++) {
+                seg = segs[i];
+                (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
+                    .push(seg);
+            }
+            return segsByDay;
+        };
+        // generates the HTML for the day headers that live amongst the event rows
+        ListView.prototype.buildDayHeaderRow = function (dayDate) {
+            var dateEnv = this.dateEnv;
+            var mainFormat = core.createFormatter(this.opt('listDayFormat')); // TODO: cache
+            var altFormat = core.createFormatter(this.opt('listDayAltFormat')); // TODO: cache
+            return core.createElement('tr', {
+                className: 'fc-list-heading',
+                'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
+            }, '<td class="' + (this.calendar.theme.getClass('tableListHeading') ||
+                this.calendar.theme.getClass('widgetHeader')) + '" colspan="3">' +
+                (mainFormat ?
+                    core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
+                    ) :
+                    '') +
+                (altFormat ?
+                    core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
+                    ) :
+                    '') +
+                '</td>');
+        };
+        return ListView;
+    }(core.View));
+    ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
+    function computeDateVars(dateProfile) {
+        var dayStart = core.startOfDay(dateProfile.renderRange.start);
+        var viewEnd = dateProfile.renderRange.end;
+        var dayDates = [];
+        var dayRanges = [];
+        while (dayStart < viewEnd) {
+            dayDates.push(dayStart);
+            dayRanges.push({
+                start: dayStart,
+                end: core.addDays(dayStart, 1)
+            });
+            dayStart = core.addDays(dayStart, 1);
+        }
+        return { dayDates: dayDates, dayRanges: dayRanges };
+    }
+
+    var main = core.createPlugin({
+        views: {
+            list: {
+                class: ListView,
+                buttonTextKey: 'list',
+                listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
+            },
+            listDay: {
+                type: 'list',
+                duration: { days: 1 },
+                listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
+            },
+            listWeek: {
+                type: 'list',
+                duration: { weeks: 1 },
+                listDayFormat: { weekday: 'long' },
+                listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
+            },
+            listMonth: {
+                type: 'list',
+                duration: { month: 1 },
+                listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
+            },
+            listYear: {
+                type: 'list',
+                duration: { year: 1 },
+                listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
+            }
+        }
+    });
+
+    exports.ListView = ListView;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/list/main.min.css b/backoffice/vendors/fullcalendar/list/main.min.css
new file mode 100644 (file)
index 0000000..ef0bd82
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar List View Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/list/main.min.js b/backoffice/vendors/fullcalendar/list/main.min.js
new file mode 100644 (file)
index 0000000..aa2faab
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar List View Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarList={},e.FullCalendar))}(this,function(e,t){"use strict";function n(e,t){function n(){this.constructor=e}s(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function r(e){for(var n=t.startOfDay(e.renderRange.start),r=e.renderRange.end,s=[],a=[];n<r;)s.push(n),a.push({start:n,end:t.addDays(n,1)}),n=t.addDays(n,1);return{dayDates:s,dayRanges:a}}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var s=function(e,t){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},a=function(e){function r(t){var n=e.call(this,t.context)||this;return n.listView=t,n}return n(r,e),r.prototype.attachSegs=function(e){e.length?this.listView.renderSegList(e):this.listView.renderEmptyMessage()},r.prototype.detachSegs=function(){},r.prototype.renderSegHtml=function(e){var n,r=this.context,s=r.view,a=r.theme,i=e.eventRange,o=i.def,l=i.instance,d=i.ui,c=o.url,p=["fc-list-item"].concat(d.classNames),h=d.backgroundColor;return n=o.allDay?t.getAllDayHtml(s):t.isMultiDayRange(i.range)?e.isStart?t.htmlEscape(this._getTimeText(l.range.start,e.end,!1)):e.isEnd?t.htmlEscape(this._getTimeText(e.start,l.range.end,!1)):t.getAllDayHtml(s):t.htmlEscape(this.getTimeText(i)),c&&p.push("fc-has-url"),'<tr class="'+p.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+a.getClass("widgetContent")+'">'+(n||"")+"</td>":"")+'<td class="fc-list-item-marker '+a.getClass("widgetContent")+'"><span class="fc-event-dot"'+(h?' style="background-color:'+h+'"':"")+'></span></td><td class="fc-list-item-title '+a.getClass("widgetContent")+'"><a'+(c?' href="'+t.htmlEscape(c)+'"':"")+">"+t.htmlEscape(o.title||"")+"</a></td></tr>"},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:"short"}},r}(t.FgEventRenderer),i=function(e){function s(n,s,i,o){var l=e.call(this,n,s,i,o)||this;l.computeDateVars=t.memoize(r),l.eventStoreToSegs=t.memoize(l._eventStoreToSegs);var d=l.eventRenderer=new a(l);l.renderContent=t.memoizeRendering(d.renderSegs.bind(d),d.unrender.bind(d)),l.el.classList.add("fc-list-view");for(var c=(l.theme.getClass("listView")||"").split(" "),p=0,h=c;p<h.length;p++){var u=h[p];u&&l.el.classList.add(u)}return l.scroller=new t.ScrollComponent("hidden","auto"),l.el.appendChild(l.scroller.el),l.contentEl=l.scroller.el,n.calendar.registerInteractiveComponent(l,{el:l.el}),l}return n(s,e),s.prototype.render=function(e){var t=this.computeDateVars(e.dateProfile),n=t.dayDates,r=t.dayRanges;this.dayDates=n,this.renderContent(this.eventStoreToSegs(e.eventStore,e.eventUiBases,r))},s.prototype.destroy=function(){e.prototype.destroy.call(this),this.scroller.destroy(),this.calendar.unregisterInteractiveComponent(this)},s.prototype.updateSize=function(t,n,r){e.prototype.updateSize.call(this,t,n,r),this.eventRenderer.computeSizes(t),this.eventRenderer.assignSizes(t),this.scroller.clear(),r||this.scroller.setHeight(this.computeScrollerHeight(n))},s.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},s.prototype._eventStoreToSegs=function(e,n,r){return this.eventRangesToSegs(t.sliceEventStore(e,n,this.props.dateProfile.activeRange,this.nextDayThreshold).fg,r)},s.prototype.eventRangesToSegs=function(e,t){for(var n=[],r=0,s=e;r<s.length;r++){var a=s[r];n.push.apply(n,this.eventRangeToSegs(a,t))}return n},s.prototype.eventRangeToSegs=function(e,n){var r,s,a,i=this,o=i.dateEnv,l=i.nextDayThreshold,d=e.range,c=e.def.allDay,p=[];for(r=0;r<n.length;r++)if((s=t.intersectRanges(d,n[r]))&&(a={component:this,eventRange:e,start:s.start,end:s.end,isStart:e.isStart&&s.start.valueOf()===d.start.valueOf(),isEnd:e.isEnd&&s.end.valueOf()===d.end.valueOf(),dayIndex:r},p.push(a),!a.isEnd&&!c&&r+1<n.length&&d.end<o.add(n[r+1].start,l))){a.end=d.end,a.isEnd=!0;break}return p},s.prototype.renderEmptyMessage=function(){this.contentEl.innerHTML='<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+t.htmlEscape(this.opt("noEventsMessage"))+"</div></div></div>"},s.prototype.renderSegList=function(e){var n,r,s,a=this.groupSegsByDay(e),i=t.htmlToElement('<table class="fc-list-table '+this.calendar.theme.getClass("tableList")+'"><tbody></tbody></table>'),o=i.querySelector("tbody");for(n=0;n<a.length;n++)if(r=a[n])for(o.appendChild(this.buildDayHeaderRow(this.dayDates[n])),r=this.eventRenderer.sortEventSegs(r),s=0;s<r.length;s++)o.appendChild(r[s].el);this.contentEl.innerHTML="",this.contentEl.appendChild(i)},s.prototype.groupSegsByDay=function(e){var t,n,r=[];for(t=0;t<e.length;t++)n=e[t],(r[n.dayIndex]||(r[n.dayIndex]=[])).push(n);return r},s.prototype.buildDayHeaderRow=function(e){var n=this.dateEnv,r=t.createFormatter(this.opt("listDayFormat")),s=t.createFormatter(this.opt("listDayAltFormat"));return t.createElement("tr",{className:"fc-list-heading","data-date":n.formatIso(e,{omitTime:!0})},'<td class="'+(this.calendar.theme.getClass("tableListHeading")||this.calendar.theme.getClass("widgetHeader"))+'" colspan="3">'+(r?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-main"},t.htmlEscape(n.format(e,r))):"")+(s?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-alt"},t.htmlEscape(n.format(e,s))):"")+"</td>")},s}(t.View);i.prototype.fgSegSelector=".fc-list-item";var o=t.createPlugin({views:{list:{class:i,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDayAltFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDayAltFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDayAltFormat:{weekday:"long"}}}});e.ListView=i,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/list/package.json b/backoffice/vendors/fullcalendar/list/package.json
new file mode 100644 (file)
index 0000000..19d4b33
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "@fullcalendar/list",
+  "_id": "@fullcalendar/list@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-NSCiD3I8HVioq7M1jzyovZDTjBq1L8QRqUZDiYZXq14lAKYwYUdZL3MUlH7MNjL/xU/dKJWD+rTKGno7FXmT9g==",
+  "_location": "/@fullcalendar/list",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/list",
+    "name": "@fullcalendar/list",
+    "escapedName": "@fullcalendar%2flist",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/list/-/list-4.1.0.tgz",
+  "_shasum": "290274fc4e4616bea9238a31f49f53e295d11d3f",
+  "_spec": "@fullcalendar/list",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "View your events as a bulleted list",
+  "docs": "https://fullcalendar.io/docs/list-view",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/list",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar List View Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/locale-all.js b/backoffice/vendors/fullcalendar/locale-all.js
deleted file mode 100644 (file)
index ebc4154..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-!function(e,a){"object"==typeof exports&&"object"==typeof module?module.exports=a(require("moment"),require("fullcalendar")):"function"==typeof define&&define.amd?define(["moment","fullcalendar"],a):"object"==typeof exports?a(require("moment"),require("fullcalendar")):a(e.moment,e.FullCalendar)}("undefined"!=typeof self?self:this,function(e,a){return function(e){function a(n){if(t[n])return t[n].exports;var r=t[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,a),r.l=!0,r.exports}var t={};return a.m=e,a.c=t,a.d=function(e,t,n){a.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,"a",t),t},a.o=function(e,a){return Object.prototype.hasOwnProperty.call(e,a)},a.p="",a(a.s=434)}([function(a,t){a.exports=e},function(e,t){e.exports=a},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(66);var n=t(1);n.datepickerLocale("af","af",{closeText:"Selekteer",prevText:"Vorige",nextText:"Volgende",currentText:"Vandag",monthNames:["Januarie","Februarie","Maart","April","Mei","Junie","Julie","Augustus","September","Oktober","November","Desember"],monthNamesShort:["Jan","Feb","Mrt","Apr","Mei","Jun","Jul","Aug","Sep","Okt","Nov","Des"],dayNames:["Sondag","Maandag","Dinsdag","Woensdag","Donderdag","Vrydag","Saterdag"],dayNamesShort:["Son","Maa","Din","Woe","Don","Vry","Sat"],dayNamesMin:["So","Ma","Di","Wo","Do","Vr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("af",{buttonText:{year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("af",{months:"Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des".split("_"),weekdays:"Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag".split("_"),weekdaysShort:"Son_Maa_Din_Woe_Don_Vry_Sat".split("_"),weekdaysMin:"So_Ma_Di_Wo_Do_Vr_Sa".split("_"),meridiemParse:/vm|nm/i,isPM:function(e){return/^nm$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"vm":"VM":t?"nm":"NM"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Vandag om] LT",nextDay:"[Môre om] LT",nextWeek:"dddd [om] LT",lastDay:"[Gister om] LT",lastWeek:"[Laas] dddd [om] LT",sameElse:"L"},relativeTime:{future:"oor %s",past:"%s gelede",s:"'n paar sekondes",ss:"%d sekondes",m:"'n minuut",mm:"%d minute",h:"'n uur",hh:"%d ure",d:"'n dag",dd:"%d dae",M:"'n maand",MM:"%d maande",y:"'n jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(68);var n=t(1);n.datepickerLocale("ar-dz","ar-DZ",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويلية","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar-dz",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ar-dz",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"أح_إث_ثلا_أر_خم_جم_سب".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(70);var n=t(1);n.datepickerLocale("ar-kw","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar-kw",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ar-kw",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:0,doy:12}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(72);var n=t(1);n.datepickerLocale("ar-ly","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar-ly",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",0:"0"},t=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},n={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},r=function(e){return function(a,r,s,d){var i=t(a),o=n[e][t(a)];return 2===i&&(o=o[r?0:1]),o.replace(/%d/i,a)}},s=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];return e.defineLocale("ar-ly",{months:s,monthsShort:s,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,a,t){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:r("s"),ss:r("s"),m:r("m"),mm:r("m"),h:r("h"),hh:r("h"),d:r("d"),dd:r("d"),M:r("M"),MM:r("M"),y:r("y"),yy:r("y")},preparse:function(e){return e.replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(74);var n=t(1);n.datepickerLocale("ar-ma","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar-ma",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ar-ma",{months:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),weekdays:"الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:6,doy:12}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(76);var n=t(1);n.datepickerLocale("ar-sa","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar-sa",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},t={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"};return e.defineLocale("ar-sa",{months:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,a,t){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return t[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:0,doy:6}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(78);var n=t(1);n.datepickerLocale("ar-tn","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar-tn",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ar-tn",{months:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),monthsShort:"جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر".split("_"),weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[اليوم على الساعة] LT",nextDay:"[غدا على الساعة] LT",nextWeek:"dddd [على الساعة] LT",lastDay:"[أمس على الساعة] LT",lastWeek:"dddd [على الساعة] LT",sameElse:"L"},relativeTime:{future:"في %s",past:"منذ %s",s:"ثوان",ss:"%d ثانية",m:"دقيقة",mm:"%d دقائق",h:"ساعة",hh:"%d ساعات",d:"يوم",dd:"%d أيام",M:"شهر",MM:"%d أشهر",y:"سنة",yy:"%d سنوات"},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(80);var n=t(1);n.datepickerLocale("ar","ar",{closeText:"إغلاق",prevText:"&#x3C;السابق",nextText:"التالي&#x3E;",currentText:"اليوم",monthNames:["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["الأحد","الاثنين","الثلاثاء","الأربعاء","الخميس","الجمعة","السبت"],dayNamesShort:["أحد","اثنين","ثلاثاء","أربعاء","خميس","جمعة","سبت"],dayNamesMin:["ح","ن","ث","ر","خ","ج","س"],weekHeader:"أسبوع",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ar",{buttonText:{month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={1:"١",2:"٢",3:"٣",4:"٤",5:"٥",6:"٦",7:"٧",8:"٨",9:"٩",0:"٠"},t={"١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","٠":"0"},n=function(e){return 0===e?0:1===e?1:2===e?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},r={s:["أقل من ثانية","ثانية واحدة",["ثانيتان","ثانيتين"],"%d ثوان","%d ثانية","%d ثانية"],m:["أقل من دقيقة","دقيقة واحدة",["دقيقتان","دقيقتين"],"%d دقائق","%d دقيقة","%d دقيقة"],h:["أقل من ساعة","ساعة واحدة",["ساعتان","ساعتين"],"%d ساعات","%d ساعة","%d ساعة"],d:["أقل من يوم","يوم واحد",["يومان","يومين"],"%d أيام","%d يومًا","%d يوم"],M:["أقل من شهر","شهر واحد",["شهران","شهرين"],"%d أشهر","%d شهرا","%d شهر"],y:["أقل من عام","عام واحد",["عامان","عامين"],"%d أعوام","%d عامًا","%d عام"]},s=function(e){return function(a,t,s,d){var i=n(a),o=r[e][n(a)];return 2===i&&(o=o[t?0:1]),o.replace(/%d/i,a)}},d=["يناير","فبراير","مارس","أبريل","مايو","يونيو","يوليو","أغسطس","سبتمبر","أكتوبر","نوفمبر","ديسمبر"];return e.defineLocale("ar",{months:d,monthsShort:d,weekdays:"الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),weekdaysShort:"أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت".split("_"),weekdaysMin:"ح_ن_ث_ر_خ_ج_س".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"D/‏M/‏YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},meridiemParse:/ص|م/,isPM:function(e){return"م"===e},meridiem:function(e,a,t){return e<12?"ص":"م"},calendar:{sameDay:"[اليوم عند الساعة] LT",nextDay:"[غدًا عند الساعة] LT",nextWeek:"dddd [عند الساعة] LT",lastDay:"[أمس عند الساعة] LT",lastWeek:"dddd [عند الساعة] LT",sameElse:"L"},relativeTime:{future:"بعد %s",past:"منذ %s",s:s("s"),ss:s("s"),m:s("m"),mm:s("m"),h:s("h"),hh:s("h"),d:s("d"),dd:s("d"),M:s("M"),MM:s("M"),y:s("y"),yy:s("y")},preparse:function(e){return e.replace(/[١٢٣٤٥٦٧٨٩٠]/g,function(e){return t[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},week:{dow:6,doy:12}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(82);var n=t(1);n.datepickerLocale("bg","bg",{closeText:"затвори",prevText:"&#x3C;назад",nextText:"напред&#x3E;",nextBigText:"&#x3E;&#x3E;",currentText:"днес",monthNames:["Януари","Февруари","Март","Април","Май","Юни","Юли","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Яну","Фев","Мар","Апр","Май","Юни","Юли","Авг","Сеп","Окт","Нов","Дек"],dayNames:["Неделя","Понеделник","Вторник","Сряда","Четвъртък","Петък","Събота"],dayNamesShort:["Нед","Пон","Вто","Сря","Чет","Пет","Съб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Съ"],weekHeader:"Wk",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("bg",{buttonText:{month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("bg",{months:"януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември".split("_"),monthsShort:"янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек".split("_"),weekdays:"неделя_понеделник_вторник_сряда_четвъртък_петък_събота".split("_"),weekdaysShort:"нед_пон_вто_сря_чет_пет_съб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Днес в] LT",nextDay:"[Утре в] LT",nextWeek:"dddd [в] LT",lastDay:"[Вчера в] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[В изминалата] dddd [в] LT";case 1:case 2:case 4:case 5:return"[В изминалия] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"след %s",past:"преди %s",s:"няколко секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дни",M:"месец",MM:"%d месеца",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(84);var n=t(1);n.datepickerLocale("bs","bs",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Juni","Juli","August","Septembar","Oktobar","Novmbar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("bs",{buttonText:{prev:"Prošli",next:"Sljedeći",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t){var n=e+" ";switch(t){case"ss":return n+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}return e.defineLocale("bs",{months:"januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:a,m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(86);var n=t(1);n.datepickerLocale("ca","ca",{closeText:"Tanca",prevText:"Anterior",nextText:"Següent",currentText:"Avui",monthNames:["gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre"],monthNamesShort:["gen","feb","març","abr","maig","juny","jul","ag","set","oct","nov","des"],dayNames:["diumenge","dilluns","dimarts","dimecres","dijous","divendres","dissabte"],dayNamesShort:["dg","dl","dt","dc","dj","dv","ds"],dayNamesMin:["dg","dl","dt","dc","dj","dv","ds"],weekHeader:"Set",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ca",{buttonText:{month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ca",{months:{standalone:"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre".split("_"),format:"de gener_de febrer_de març_d'abril_de maig_de juny_de juliol_d'agost_de setembre_d'octubre_de novembre_de desembre".split("_"),isFormat:/D[oD]?(\s)+MMMM/},monthsShort:"gen._febr._març_abr._maig_juny_jul._ag._set._oct._nov._des.".split("_"),monthsParseExact:!0,weekdays:"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte".split("_"),weekdaysShort:"dg._dl._dt._dc._dj._dv._ds.".split("_"),weekdaysMin:"dg_dl_dt_dc_dj_dv_ds".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [de] YYYY",ll:"D MMM YYYY",LLL:"D MMMM [de] YYYY [a les] H:mm",lll:"D MMM YYYY, H:mm",LLLL:"dddd D MMMM [de] YYYY [a les] H:mm",llll:"ddd D MMM YYYY, H:mm"},calendar:{sameDay:function(){return"[avui a "+(1!==this.hours()?"les":"la")+"] LT"},nextDay:function(){return"[demà a "+(1!==this.hours()?"les":"la")+"] LT"},nextWeek:function(){return"dddd [a "+(1!==this.hours()?"les":"la")+"] LT"},lastDay:function(){return"[ahir a "+(1!==this.hours()?"les":"la")+"] LT"},lastWeek:function(){return"[el] dddd [passat a "+(1!==this.hours()?"les":"la")+"] LT"},sameElse:"L"},relativeTime:{future:"d'aquí %s",past:"fa %s",s:"uns segons",ss:"%d segons",m:"un minut",mm:"%d minuts",h:"una hora",hh:"%d hores",d:"un dia",dd:"%d dies",M:"un mes",MM:"%d mesos",y:"un any",yy:"%d anys"},dayOfMonthOrdinalParse:/\d{1,2}(r|n|t|è|a)/,ordinal:function(e,a){var t=1===e?"r":2===e?"n":3===e?"r":4===e?"t":"è";return"w"!==a&&"W"!==a||(t="a"),e+t},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(88);var n=t(1);n.datepickerLocale("cs","cs",{closeText:"Zavřít",prevText:"&#x3C;Dříve",nextText:"Později&#x3E;",currentText:"Nyní",monthNames:["leden","únor","březen","duben","květen","červen","červenec","srpen","září","říjen","listopad","prosinec"],monthNamesShort:["led","úno","bře","dub","kvě","čer","čvc","srp","zář","říj","lis","pro"],dayNames:["neděle","pondělí","úterý","středa","čtvrtek","pátek","sobota"],dayNamesShort:["ne","po","út","st","čt","pá","so"],dayNamesMin:["ne","po","út","st","čt","pá","so"],weekHeader:"Týd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("cs",{buttonText:{month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e){return e>1&&e<5&&1!=~~(e/10)}function t(e,t,n,r){var s=e+" ";switch(n){case"s":return t||r?"pár sekund":"pár sekundami";case"ss":return t||r?s+(a(e)?"sekundy":"sekund"):s+"sekundami";case"m":return t?"minuta":r?"minutu":"minutou";case"mm":return t||r?s+(a(e)?"minuty":"minut"):s+"minutami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(a(e)?"hodiny":"hodin"):s+"hodinami";case"d":return t||r?"den":"dnem";case"dd":return t||r?s+(a(e)?"dny":"dní"):s+"dny";case"M":return t||r?"měsíc":"měsícem";case"MM":return t||r?s+(a(e)?"měsíce":"měsíců"):s+"měsíci";case"y":return t||r?"rok":"rokem";case"yy":return t||r?s+(a(e)?"roky":"let"):s+"lety"}}var n="leden_únor_březen_duben_květen_červen_červenec_srpen_září_říjen_listopad_prosinec".split("_"),r="led_úno_bře_dub_kvě_čvn_čvc_srp_zář_říj_lis_pro".split("_");return e.defineLocale("cs",{months:n,monthsShort:r,monthsParse:function(e,a){var t,n=[];for(t=0;t<12;t++)n[t]=new RegExp("^"+e[t]+"$|^"+a[t]+"$","i");return n}(n,r),shortMonthsParse:function(e){var a,t=[];for(a=0;a<12;a++)t[a]=new RegExp("^"+e[a]+"$","i");return t}(r),longMonthsParse:function(e){var a,t=[];for(a=0;a<12;a++)t[a]=new RegExp("^"+e[a]+"$","i");return t}(n),weekdays:"neděle_pondělí_úterý_středa_čtvrtek_pátek_sobota".split("_"),weekdaysShort:"ne_po_út_st_čt_pá_so".split("_"),weekdaysMin:"ne_po_út_st_čt_pá_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm",l:"D. M. YYYY"},calendar:{sameDay:"[dnes v] LT",nextDay:"[zítra v] LT",nextWeek:function(){switch(this.day()){case 0:return"[v neděli v] LT";case 1:case 2:return"[v] dddd [v] LT";case 3:return"[ve středu v] LT";case 4:return"[ve čtvrtek v] LT";case 5:return"[v pátek v] LT";case 6:return"[v sobotu v] LT"}},lastDay:"[včera v] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulou neděli v] LT";case 1:case 2:return"[minulé] dddd [v] LT";case 3:return"[minulou středu v] LT";case 4:case 5:return"[minulý] dddd [v] LT";case 6:return"[minulou sobotu v] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"před %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(90);var n=t(1);n.datepickerLocale("da","da",{closeText:"Luk",prevText:"&#x3C;Forrige",nextText:"Næste&#x3E;",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("da",{buttonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd [d.] D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"på dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[i] dddd[s kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",ss:"%d sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(92);var n=t(1);n.datepickerLocale("de-at","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("de-at",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}return e.defineLocale("de-at",{
-months:"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(94);var n=t(1);n.datepickerLocale("de-ch","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("de-ch",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}return e.defineLocale("de-ch",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(96);var n=t(1);n.datepickerLocale("de","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("de",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return a?r[t][0]:r[t][1]}return e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:a,mm:"%d Minuten",h:a,hh:"%d Stunden",d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(98);var n=t(1);n.datepickerLocale("el","el",{closeText:"Κλείσιμο",prevText:"Προηγούμενος",nextText:"Επόμενος",currentText:"Σήμερα",monthNames:["Ιανουάριος","Φεβρουάριος","Μάρτιος","Απρίλιος","Μάιος","Ιούνιος","Ιούλιος","Αύγουστος","Σεπτέμβριος","Οκτώβριος","Νοέμβριος","Δεκέμβριος"],monthNamesShort:["Ιαν","Φεβ","Μαρ","Απρ","Μαι","Ιουν","Ιουλ","Αυγ","Σεπ","Οκτ","Νοε","Δεκ"],dayNames:["Κυριακή","Δευτέρα","Τρίτη","Τετάρτη","Πέμπτη","Παρασκευή","Σάββατο"],dayNamesShort:["Κυρ","Δευ","Τρι","Τετ","Πεμ","Παρ","Σαβ"],dayNamesMin:["Κυ","Δε","Τρ","Τε","Πε","Πα","Σα"],weekHeader:"Εβδ",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("el",{buttonText:{month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα για να εμφανιστεί"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}return e.defineLocale("el",{monthsNominativeEl:"Ιανουάριος_Φεβρουάριος_Μάρτιος_Απρίλιος_Μάιος_Ιούνιος_Ιούλιος_Αύγουστος_Σεπτέμβριος_Οκτώβριος_Νοέμβριος_Δεκέμβριος".split("_"),monthsGenitiveEl:"Ιανουαρίου_Φεβρουαρίου_Μαρτίου_Απριλίου_Μαΐου_Ιουνίου_Ιουλίου_Αυγούστου_Σεπτεμβρίου_Οκτωβρίου_Νοεμβρίου_Δεκεμβρίου".split("_"),months:function(e,a){return e?"string"==typeof a&&/D/.test(a.substring(0,a.indexOf("MMMM")))?this._monthsGenitiveEl[e.month()]:this._monthsNominativeEl[e.month()]:this._monthsNominativeEl},monthsShort:"Ιαν_Φεβ_Μαρ_Απρ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Νοε_Δεκ".split("_"),weekdays:"Κυριακή_Δευτέρα_Τρίτη_Τετάρτη_Πέμπτη_Παρασκευή_Σάββατο".split("_"),weekdaysShort:"Κυρ_Δευ_Τρι_Τετ_Πεμ_Παρ_Σαβ".split("_"),weekdaysMin:"Κυ_Δε_Τρ_Τε_Πε_Πα_Σα".split("_"),meridiem:function(e,a,t){return e>11?t?"μμ":"ΜΜ":t?"πμ":"ΠΜ"},isPM:function(e){return"μ"===(e+"").toLowerCase()[0]},meridiemParse:/[ΠΜ]\.?Μ?\.?/i,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendarEl:{sameDay:"[Σήμερα {}] LT",nextDay:"[Αύριο {}] LT",nextWeek:"dddd [{}] LT",lastDay:"[Χθες {}] LT",lastWeek:function(){switch(this.day()){case 6:return"[το προηγούμενο] dddd [{}] LT";default:return"[την προηγούμενη] dddd [{}] LT"}},sameElse:"L"},calendar:function(e,t){var n=this._calendarEl[e],r=t&&t.hours();return a(n)&&(n=n.apply(t)),n.replace("{}",r%12==1?"στη":"στις")},relativeTime:{future:"σε %s",past:"%s πριν",s:"λίγα δευτερόλεπτα",ss:"%d δευτερόλεπτα",m:"ένα λεπτό",mm:"%d λεπτά",h:"μία ώρα",hh:"%d ώρες",d:"μία μέρα",dd:"%d μέρες",M:"ένας μήνας",MM:"%d μήνες",y:"ένας χρόνος",yy:"%d χρόνια"},dayOfMonthOrdinalParse:/\d{1,2}η/,ordinal:"%dη",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(100);var n=t(1);n.datepickerLocale("en-au","en-AU",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("en-au")},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("en-au",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(102),t(1).locale("en-ca")},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("en-ca",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"YYYY-MM-DD",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th")}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(104);var n=t(1);n.datepickerLocale("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("en-gb")},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(106),t(1).locale("en-ie")},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("en-ie",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(108);var n=t(1);n.datepickerLocale("en-nz","en-NZ",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("en-nz")},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("en-nz",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"th":1===a?"st":2===a?"nd":3===a?"rd":"th")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(110);var n=t(1);n.datepickerLocale("es-do","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("es-do",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;return e.defineLocale("es-do",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,n){return e?/-MMM-/.test(n)?t[e.month()]:a[e.month()]:a},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY h:mm A",LLLL:"dddd, D [de] MMMM [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(112);var n=t(1);n.datepickerLocale("es-us","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("es-us",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");return e.defineLocale("es-us",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,n){return e?/-MMM-/.test(n)?t[e.month()]:a[e.month()]:a},monthsParseExact:!0,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"MM/DD/YYYY",LL:"MMMM [de] D [de] YYYY",LLL:"MMMM [de] D [de] YYYY h:mm A",LLLL:"dddd, MMMM [de] D [de] YYYY h:mm A"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:0,doy:6}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(114);var n=t(1);n.datepickerLocale("es","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("es",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),t="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_"),n=[/^ene/i,/^feb/i,/^mar/i,/^abr/i,/^may/i,/^jun/i,/^jul/i,/^ago/i,/^sep/i,/^oct/i,/^nov/i,/^dic/i],r=/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre|ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i;return e.defineLocale("es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,n){return e?/-MMM-/.test(n)?t[e.month()]:a[e.month()]:a},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre)/i,monthsShortStrictRegex:/^(ene\.?|feb\.?|mar\.?|abr\.?|may\.?|jun\.?|jul\.?|ago\.?|sep\.?|oct\.?|nov\.?|dic\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"do_lu_ma_mi_ju_vi_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(116);var n=t(1);n.datepickerLocale("et","et",{closeText:"Sulge",prevText:"Eelnev",nextText:"Järgnev",currentText:"Täna",monthNames:["Jaanuar","Veebruar","Märts","Aprill","Mai","Juuni","Juuli","August","September","Oktoober","November","Detsember"],monthNamesShort:["Jaan","Veebr","Märts","Apr","Mai","Juuni","Juuli","Aug","Sept","Okt","Nov","Dets"],dayNames:["Pühapäev","Esmaspäev","Teisipäev","Kolmapäev","Neljapäev","Reede","Laupäev"],dayNamesShort:["Pühap","Esmasp","Teisip","Kolmap","Neljap","Reede","Laup"],dayNamesMin:["P","E","T","K","N","R","L"],weekHeader:"näd",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("et",{buttonText:{month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r={s:["mõne sekundi","mõni sekund","paar sekundit"],ss:[e+"sekundi",e+"sekundit"],m:["ühe minuti","üks minut"],mm:[e+" minuti",e+" minutit"],h:["ühe tunni","tund aega","üks tund"],hh:[e+" tunni",e+" tundi"],d:["ühe päeva","üks päev"],M:["kuu aja","kuu aega","üks kuu"],MM:[e+" kuu",e+" kuud"],y:["ühe aasta","aasta","üks aasta"],yy:[e+" aasta",e+" aastat"]};return a?r[t][2]?r[t][2]:r[t][1]:n?r[t][0]:r[t][1]}return e.defineLocale("et",{months:"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),monthsShort:"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),weekdays:"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),weekdaysShort:"P_E_T_K_N_R_L".split("_"),weekdaysMin:"P_E_T_K_N_R_L".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[Täna,] LT",nextDay:"[Homme,] LT",nextWeek:"[Järgmine] dddd LT",lastDay:"[Eile,] LT",lastWeek:"[Eelmine] dddd LT",sameElse:"L"},relativeTime:{future:"%s pärast",past:"%s tagasi",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:"%d päeva",M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(118);var n=t(1);n.datepickerLocale("eu","eu",{closeText:"Egina",prevText:"&#x3C;Aur",nextText:"Hur&#x3E;",currentText:"Gaur",monthNames:["urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua"],monthNamesShort:["urt.","ots.","mar.","api.","mai.","eka.","uzt.","abu.","ira.","urr.","aza.","abe."],dayNames:["igandea","astelehena","asteartea","asteazkena","osteguna","ostirala","larunbata"],dayNamesShort:["ig.","al.","ar.","az.","og.","ol.","lr."],dayNamesMin:["ig","al","ar","az","og","ol","lr"],weekHeader:"As",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("eu",{buttonText:{month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("eu",{months:"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua".split("_"),monthsShort:"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.".split("_"),monthsParseExact:!0,weekdays:"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata".split("_"),weekdaysShort:"ig._al._ar._az._og._ol._lr.".split("_"),weekdaysMin:"ig_al_ar_az_og_ol_lr".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY[ko] MMMM[ren] D[a]",LLL:"YYYY[ko] MMMM[ren] D[a] HH:mm",LLLL:"dddd, YYYY[ko] MMMM[ren] D[a] HH:mm",l:"YYYY-M-D",ll:"YYYY[ko] MMM D[a]",lll:"YYYY[ko] MMM D[a] HH:mm",llll:"ddd, YYYY[ko] MMM D[a] HH:mm"},calendar:{sameDay:"[gaur] LT[etan]",nextDay:"[bihar] LT[etan]",nextWeek:"dddd LT[etan]",lastDay:"[atzo] LT[etan]",lastWeek:"[aurreko] dddd LT[etan]",sameElse:"L"},relativeTime:{future:"%s barru",past:"duela %s",s:"segundo batzuk",ss:"%d segundo",m:"minutu bat",mm:"%d minutu",h:"ordu bat",hh:"%d ordu",d:"egun bat",dd:"%d egun",M:"hilabete bat",MM:"%d hilabete",y:"urte bat",yy:"%d urte"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(120);var n=t(1);n.datepickerLocale("fa","fa",{closeText:"بستن",prevText:"&#x3C;قبلی",nextText:"بعدی&#x3E;",currentText:"امروز",monthNames:["ژانویه","فوریه","مارس","آوریل","مه","ژوئن","ژوئیه","اوت","سپتامبر","اکتبر","نوامبر","دسامبر"],monthNamesShort:["1","2","3","4","5","6","7","8","9","10","11","12"],dayNames:["يکشنبه","دوشنبه","سه‌شنبه","چهارشنبه","پنجشنبه","جمعه","شنبه"],dayNamesShort:["ی","د","س","چ","پ","ج","ش"],dayNamesMin:["ی","د","س","چ","پ","ج","ش"],weekHeader:"هف",dateFormat:"yy/mm/dd",firstDay:6,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("fa",{buttonText:{month:"ماه",week:"هفته",day:"روز",list:"برنامه"},allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={1:"۱",2:"۲",3:"۳",4:"۴",5:"۵",6:"۶",7:"۷",8:"۸",9:"۹",0:"۰"},t={"۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","۰":"0"};return e.defineLocale("fa",{months:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),monthsShort:"ژانویه_فوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر".split("_"),weekdays:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysShort:"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه".split("_"),weekdaysMin:"ی_د_س_چ_پ_ج_ش".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},meridiemParse:/قبل از ظهر|بعد از ظهر/,isPM:function(e){return/بعد از ظهر/.test(e)},meridiem:function(e,a,t){return e<12?"قبل از ظهر":"بعد از ظهر"},calendar:{sameDay:"[امروز ساعت] LT",nextDay:"[فردا ساعت] LT",nextWeek:"dddd [ساعت] LT",lastDay:"[دیروز ساعت] LT",lastWeek:"dddd [پیش] [ساعت] LT",sameElse:"L"},relativeTime:{future:"در %s",past:"%s پیش",s:"چند ثانیه",ss:"ثانیه d%",m:"یک دقیقه",mm:"%d دقیقه",h:"یک ساعت",hh:"%d ساعت",d:"یک روز",dd:"%d روز",M:"یک ماه",MM:"%d ماه",y:"یک سال",yy:"%d سال"},preparse:function(e){return e.replace(/[۰-۹]/g,function(e){return t[e]}).replace(/،/g,",")},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]}).replace(/,/g,"،")},dayOfMonthOrdinalParse:/\d{1,2}م/,ordinal:"%dم",week:{dow:6,doy:12}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(122);var n=t(1);n.datepickerLocale("fi","fi",{closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("fi",{buttonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,n,r){var s="";switch(n){
-case"s":return r?"muutaman sekunnin":"muutama sekunti";case"ss":return r?"sekunnin":"sekuntia";case"m":return r?"minuutin":"minuutti";case"mm":s=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":s=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":s=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":s=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":s=r?"vuoden":"vuotta"}return s=t(e,r)+" "+s}function t(e,a){return e<10?a?r[e]:n[e]:e}var n="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),r=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",n[7],n[8],n[9]];return e.defineLocale("fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] HH.mm",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] HH.mm",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] HH.mm",llll:"ddd, Do MMM YYYY, [klo] HH.mm"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(124);var n=t(1);n.datepickerLocale("fr-ca","fr-CA",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"yy-mm-dd",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("fr-ca",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("fr-ca",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(126);var n=t(1);n.datepickerLocale("fr-ch","fr-CH",{closeText:"Fermer",prevText:"&#x3C;Préc",nextText:"Suiv&#x3E;",currentText:"Courant",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avril","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sm",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("fr-ch",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("fr-ch",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|e)/,ordinal:function(e,a){switch(a){default:case"M":case"Q":case"D":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(128);var n=t(1);n.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,a){switch(a){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(130);var n=t(1);n.datepickerLocale("gl","gl",{closeText:"Pechar",prevText:"&#x3C;Ant",nextText:"Seg&#x3E;",currentText:"Hoxe",monthNames:["Xaneiro","Febreiro","Marzo","Abril","Maio","Xuño","Xullo","Agosto","Setembro","Outubro","Novembro","Decembro"],monthNamesShort:["Xan","Feb","Mar","Abr","Mai","Xuñ","Xul","Ago","Set","Out","Nov","Dec"],dayNames:["Domingo","Luns","Martes","Mércores","Xoves","Venres","Sábado"],dayNamesShort:["Dom","Lun","Mar","Mér","Xov","Ven","Sáb"],dayNamesMin:["Do","Lu","Ma","Mé","Xo","Ve","Sá"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("gl",{buttonText:{month:"Mes",week:"Semana",day:"Día",list:"Axenda"},allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("gl",{months:"xaneiro_febreiro_marzo_abril_maio_xuño_xullo_agosto_setembro_outubro_novembro_decembro".split("_"),monthsShort:"xan._feb._mar._abr._mai._xuñ._xul._ago._set._out._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"domingo_luns_martes_mércores_xoves_venres_sábado".split("_"),weekdaysShort:"dom._lun._mar._mér._xov._ven._sáb.".split("_"),weekdaysMin:"do_lu_ma_mé_xo_ve_sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY H:mm",LLLL:"dddd, D [de] MMMM [de] YYYY H:mm"},calendar:{sameDay:function(){return"[hoxe "+(1!==this.hours()?"ás":"á")+"] LT"},nextDay:function(){return"[mañá "+(1!==this.hours()?"ás":"á")+"] LT"},nextWeek:function(){return"dddd ["+(1!==this.hours()?"ás":"a")+"] LT"},lastDay:function(){return"[onte "+(1!==this.hours()?"á":"a")+"] LT"},lastWeek:function(){return"[o] dddd [pasado "+(1!==this.hours()?"ás":"a")+"] LT"},sameElse:"L"},relativeTime:{future:function(e){return 0===e.indexOf("un")?"n"+e:"en "+e},past:"hai %s",s:"uns segundos",ss:"%d segundos",m:"un minuto",mm:"%d minutos",h:"unha hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(132);var n=t(1);n.datepickerLocale("he","he",{closeText:"סגור",prevText:"&#x3C;הקודם",nextText:"הבא&#x3E;",currentText:"היום",monthNames:["ינואר","פברואר","מרץ","אפריל","מאי","יוני","יולי","אוגוסט","ספטמבר","אוקטובר","נובמבר","דצמבר"],monthNamesShort:["ינו","פבר","מרץ","אפר","מאי","יוני","יולי","אוג","ספט","אוק","נוב","דצמ"],dayNames:["ראשון","שני","שלישי","רביעי","חמישי","שישי","שבת"],dayNamesShort:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],dayNamesMin:["א'","ב'","ג'","ד'","ה'","ו'","שבת"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!0,showMonthAfterYear:!1,yearSuffix:""}),n.locale("he",{buttonText:{month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekNumberTitle:"שבוע"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("he",{months:"ינואר_פברואר_מרץ_אפריל_מאי_יוני_יולי_אוגוסט_ספטמבר_אוקטובר_נובמבר_דצמבר".split("_"),monthsShort:"ינו׳_פבר׳_מרץ_אפר׳_מאי_יוני_יולי_אוג׳_ספט׳_אוק׳_נוב׳_דצמ׳".split("_"),weekdays:"ראשון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),weekdaysShort:"א׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),weekdaysMin:"א_ב_ג_ד_ה_ו_ש".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [ב]MMMM YYYY",LLL:"D [ב]MMMM YYYY HH:mm",LLLL:"dddd, D [ב]MMMM YYYY HH:mm",l:"D/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[היום ב־]LT",nextDay:"[מחר ב־]LT",nextWeek:"dddd [בשעה] LT",lastDay:"[אתמול ב־]LT",lastWeek:"[ביום] dddd [האחרון בשעה] LT",sameElse:"L"},relativeTime:{future:"בעוד %s",past:"לפני %s",s:"מספר שניות",ss:"%d שניות",m:"דקה",mm:"%d דקות",h:"שעה",hh:function(e){return 2===e?"שעתיים":e+" שעות"},d:"יום",dd:function(e){return 2===e?"יומיים":e+" ימים"},M:"חודש",MM:function(e){return 2===e?"חודשיים":e+" חודשים"},y:"שנה",yy:function(e){return 2===e?"שנתיים":e%10==0&&10!==e?e+" שנה":e+" שנים"}},meridiemParse:/אחה"צ|לפנה"צ|אחרי הצהריים|לפני הצהריים|לפנות בוקר|בבוקר|בערב/i,isPM:function(e){return/^(אחה"צ|אחרי הצהריים|בערב)$/.test(e)},meridiem:function(e,a,t){return e<5?"לפנות בוקר":e<10?"בבוקר":e<12?t?'לפנה"צ':"לפני הצהריים":e<18?t?'אחה"צ':"אחרי הצהריים":"בערב"}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(134);var n=t(1);n.datepickerLocale("hi","hi",{closeText:"बंद",prevText:"पिछला",nextText:"अगला",currentText:"आज",monthNames:["जनवरी ","फरवरी","मार्च","अप्रेल","मई","जून","जूलाई","अगस्त ","सितम्बर","अक्टूबर","नवम्बर","दिसम्बर"],monthNamesShort:["जन","फर","मार्च","अप्रेल","मई","जून","जूलाई","अग","सित","अक्ट","नव","दि"],dayNames:["रविवार","सोमवार","मंगलवार","बुधवार","गुरुवार","शुक्रवार","शनिवार"],dayNamesShort:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],dayNamesMin:["रवि","सोम","मंगल","बुध","गुरु","शुक्र","शनि"],weekHeader:"हफ्ता",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("hi",{buttonText:{month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={1:"१",2:"२",3:"३",4:"४",5:"५",6:"६",7:"७",8:"८",9:"९",0:"०"},t={"१":"1","२":"2","३":"3","४":"4","५":"5","६":"6","७":"7","८":"8","९":"9","०":"0"};return e.defineLocale("hi",{months:"जनवरी_फ़रवरी_मार्च_अप्रैल_मई_जून_जुलाई_अगस्त_सितम्बर_अक्टूबर_नवम्बर_दिसम्बर".split("_"),monthsShort:"जन._फ़र._मार्च_अप्रै._मई_जून_जुल._अग._सित._अक्टू._नव._दिस.".split("_"),monthsParseExact:!0,weekdays:"रविवार_सोमवार_मंगलवार_बुधवार_गुरूवार_शुक्रवार_शनिवार".split("_"),weekdaysShort:"रवि_सोम_मंगल_बुध_गुरू_शुक्र_शनि".split("_"),weekdaysMin:"र_सो_मं_बु_गु_शु_श".split("_"),longDateFormat:{LT:"A h:mm बजे",LTS:"A h:mm:ss बजे",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY, A h:mm बजे",LLLL:"dddd, D MMMM YYYY, A h:mm बजे"},calendar:{sameDay:"[आज] LT",nextDay:"[कल] LT",nextWeek:"dddd, LT",lastDay:"[कल] LT",lastWeek:"[पिछले] dddd, LT",sameElse:"L"},relativeTime:{future:"%s में",past:"%s पहले",s:"कुछ ही क्षण",ss:"%d सेकंड",m:"एक मिनट",mm:"%d मिनट",h:"एक घंटा",hh:"%d घंटे",d:"एक दिन",dd:"%d दिन",M:"एक महीने",MM:"%d महीने",y:"एक वर्ष",yy:"%d वर्ष"},preparse:function(e){return e.replace(/[१२३४५६७८९०]/g,function(e){return t[e]})},postformat:function(e){return e.replace(/\d/g,function(e){return a[e]})},meridiemParse:/रात|सुबह|दोपहर|शाम/,meridiemHour:function(e,a){return 12===e&&(e=0),"रात"===a?e<4?e:e+12:"सुबह"===a?e:"दोपहर"===a?e>=10?e:e+12:"शाम"===a?e+12:void 0},meridiem:function(e,a,t){return e<4?"रात":e<10?"सुबह":e<17?"दोपहर":e<20?"शाम":"रात"},week:{dow:0,doy:6}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(136);var n=t(1);n.datepickerLocale("hr","hr",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Siječanj","Veljača","Ožujak","Travanj","Svibanj","Lipanj","Srpanj","Kolovoz","Rujan","Listopad","Studeni","Prosinac"],monthNamesShort:["Sij","Velj","Ožu","Tra","Svi","Lip","Srp","Kol","Ruj","Lis","Stu","Pro"],dayNames:["Nedjelja","Ponedjeljak","Utorak","Srijeda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sri","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Tje",dateFormat:"dd.mm.yy.",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("hr",{buttonText:{prev:"Prijašnji",next:"Sljedeći",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t){var n=e+" ";switch(t){case"ss":return n+=1===e?"sekunda":2===e||3===e||4===e?"sekunde":"sekundi";case"m":return a?"jedna minuta":"jedne minute";case"mm":return n+=1===e?"minuta":2===e||3===e||4===e?"minute":"minuta";case"h":return a?"jedan sat":"jednog sata";case"hh":return n+=1===e?"sat":2===e||3===e||4===e?"sata":"sati";case"dd":return n+=1===e?"dan":"dana";case"MM":return n+=1===e?"mjesec":2===e||3===e||4===e?"mjeseca":"mjeseci";case"yy":return n+=1===e?"godina":2===e||3===e||4===e?"godine":"godina"}}return e.defineLocale("hr",{months:{format:"siječnja_veljače_ožujka_travnja_svibnja_lipnja_srpnja_kolovoza_rujna_listopada_studenoga_prosinca".split("_"),standalone:"siječanj_veljača_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_")},monthsShort:"sij._velj._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),monthsParseExact:!0,weekdays:"nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sri._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedjelju] [u] LT";case 3:return"[u] [srijedu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[jučer u] LT",lastWeek:function(){switch(this.day()){case 0:case 3:return"[prošlu] dddd [u] LT";case 6:return"[prošle] [subote] [u] LT";case 1:case 2:case 4:case 5:return"[prošli] dddd [u] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"prije %s",s:"par sekundi",ss:a,m:a,mm:a,h:a,hh:a,d:"dan",dd:a,M:"mjesec",MM:a,y:"godinu",yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(138);var n=t(1);n.datepickerLocale("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),n.locale("hu",{buttonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető események"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r=e;switch(t){case"s":return n||a?"néhány másodperc":"néhány másodperce";case"ss":return r+(n||a)?" másodperc":" másodperce";case"m":return"egy"+(n||a?" perc":" perce");case"mm":return r+(n||a?" perc":" perce");case"h":return"egy"+(n||a?" óra":" órája");case"hh":return r+(n||a?" óra":" órája");case"d":return"egy"+(n||a?" nap":" napja");case"dd":return r+(n||a?" nap":" napja");case"M":return"egy"+(n||a?" hónap":" hónapja");case"MM":return r+(n||a?" hónap":" hónapja");case"y":return"egy"+(n||a?" év":" éve");case"yy":return r+(n||a?" év":" éve")}return""}function t(e){return(e?"":"[múlt] ")+"["+n[this.day()]+"] LT[-kor]"}var n="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");return e.defineLocale("hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D. H:mm",LLLL:"YYYY. MMMM D., dddd H:mm"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,a,t){return e<12?!0===t?"de":"DE":!0===t?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return t.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return t.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(140);var n=t(1);n.datepickerLocale("id","id",{closeText:"Tutup",prevText:"&#x3C;mundur",nextText:"maju&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Maret","April","Mei","Juni","Juli","Agustus","September","Oktober","Nopember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Mei","Jun","Jul","Agus","Sep","Okt","Nop","Des"],dayNames:["Minggu","Senin","Selasa","Rabu","Kamis","Jumat","Sabtu"],dayNamesShort:["Min","Sen","Sel","Rab","kam","Jum","Sab"],dayNamesMin:["Mg","Sn","Sl","Rb","Km","jm","Sb"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("id",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("id",{months:"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember".split("_"),monthsShort:"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Agt_Sep_Okt_Nov_Des".split("_"),weekdays:"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu".split("_"),weekdaysShort:"Min_Sen_Sel_Rab_Kam_Jum_Sab".split("_"),weekdaysMin:"Mg_Sn_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|siang|sore|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"siang"===a?e>=11?e:e+12:"sore"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"siang":e<19?"sore":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Besok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kemarin pukul] LT",lastWeek:"dddd [lalu pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lalu",s:"beberapa detik",ss:"%d detik",m:"semenit",mm:"%d menit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(142);var n=t(1);n.datepickerLocale("is","is",{closeText:"Loka",prevText:"&#x3C; Fyrri",nextText:"Næsti &#x3E;",currentText:"Í dag",monthNames:["Janúar","Febrúar","Mars","Apríl","Maí","Júní","Júlí","Ágúst","September","Október","Nóvember","Desember"],monthNamesShort:["Jan","Feb","Mar","Apr","Maí","Jún","Júl","Ágú","Sep","Okt","Nóv","Des"],dayNames:["Sunnudagur","Mánudagur","Þriðjudagur","Miðvikudagur","Fimmtudagur","Föstudagur","Laugardagur"],dayNamesShort:["Sun","Mán","Þri","Mið","Fim","Fös","Lau"],dayNamesMin:["Su","Má","Þr","Mi","Fi","Fö","La"],weekHeader:"Vika",dateFormat:"dd.mm.yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("is",{buttonText:{month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e){return e%100==11||e%10!=1}function t(e,t,n,r){var s=e+" ";switch(n){case"s":return t||r?"nokkrar sekúndur":"nokkrum sekúndum";case"ss":return a(e)?s+(t||r?"sekúndur":"sekúndum"):s+"sekúnda";case"m":return t?"mínúta":"mínútu";case"mm":return a(e)?s+(t||r?"mínútur":"mínútum"):t?s+"mínúta":s+"mínútu";case"hh":return a(e)?s+(t||r?"klukkustundir":"klukkustundum"):s+"klukkustund";case"d":return t?"dagur":r?"dag":"degi";case"dd":return a(e)?t?s+"dagar":s+(r?"daga":"dögum"):t?s+"dagur":s+(r?"dag":"degi");case"M":return t?"mánuður":r?"mánuð":"mánuði";case"MM":return a(e)?t?s+"mánuðir":s+(r?"mánuði":"mánuðum"):t?s+"mánuður":s+(r?"mánuð":"mánuði");case"y":return t||r?"ár":"ári";case"yy":return a(e)?s+(t||r?"ár":"árum"):s+(t||r?"ár":"ári")}}return e.defineLocale("is",{months:"janúar_febrúar_mars_apríl_maí_júní_júlí_ágúst_september_október_nóvember_desember".split("_"),monthsShort:"jan_feb_mar_apr_maí_jún_júl_ágú_sep_okt_nóv_des".split("_"),weekdays:"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur".split("_"),weekdaysShort:"sun_mán_þri_mið_fim_fös_lau".split("_"),weekdaysMin:"Su_Má_Þr_Mi_Fi_Fö_La".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd, D. MMMM YYYY [kl.] H:mm"},calendar:{sameDay:"[í dag kl.] LT",nextDay:"[á morgun kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[í gær kl.] LT",lastWeek:"[síðasta] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"eftir %s",past:"fyrir %s síðan",s:t,ss:t,m:t,mm:t,h:"klukkustund",hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(144);var n=t(1);n.datepickerLocale("it","it",{closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("it",{buttonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"domenica_lunedì_martedì_mercoledì_giovedì_venerdì_sabato".split("_"),weekdaysShort:"dom_lun_mar_mer_gio_ven_sab".split("_"),weekdaysMin:"do_lu_ma_me_gi_ve_sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",ss:"%d secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(146);var n=t(1);n.datepickerLocale("ja","ja",{closeText:"閉じる",prevText:"&#x3C;前",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),n.locale("ja",{buttonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"イベントが表示されないように"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日 HH:mm dddd",l:"YYYY/MM/DD",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日 HH:mm dddd"},meridiemParse:/午前|午後/i,isPM:function(e){return"午後"===e},meridiem:function(e,a,t){return e<12?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}日/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"日";default:return e}},relativeTime:{future:"%s後",past:"%s前",s:"数秒",ss:"%d秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(148);var n=t(1);n.datepickerLocale("ka","ka",{closeText:"დახურვა",prevText:"წინა",nextText:"შემდეგი",currentText:"დღეს",monthNames:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"],monthNamesShort:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],dayNames:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"],dayNamesShort:["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],dayNamesMin:["კვ","ორ","სა","ოთ","ხუ","პა","შა"],weekHeader:"კვ",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ka",{buttonText:{month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ka",{months:{standalone:"იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი".split("_"),format:"იანვარს_თებერვალს_მარტს_აპრილის_მაისს_ივნისს_ივლისს_აგვისტს_სექტემბერს_ოქტომბერს_ნოემბერს_დეკემბერს".split("_")},monthsShort:"იან_თებ_მარ_აპრ_მაი_ივნ_ივლ_აგვ_სექ_ოქტ_ნოე_დეკ".split("_"),weekdays:{standalone:"კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი".split("_"),format:"კვირას_ორშაბათს_სამშაბათს_ოთხშაბათს_ხუთშაბათს_პარასკევს_შაბათს".split("_"),isFormat:/(წინა|შემდეგ)/},weekdaysShort:"კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ".split("_"),weekdaysMin:"კვ_ორ_სა_ოთ_ხუ_პა_შა".split("_"),longDateFormat:{LT:"h:mm A",LTS:"h:mm:ss A",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY h:mm A",LLLL:"dddd, D MMMM YYYY h:mm A"},calendar:{sameDay:"[დღეს] LT[-ზე]",nextDay:"[ხვალ] LT[-ზე]",lastDay:"[გუშინ] LT[-ზე]",nextWeek:"[შემდეგ] dddd LT[-ზე]",lastWeek:"[წინა] dddd LT-ზე",sameElse:"L"},relativeTime:{future:function(e){return/(წამი|წუთი|საათი|წელი)/.test(e)?e.replace(/ი$/,"ში"):e+"ში"},past:function(e){return/(წამი|წუთი|საათი|დღე|თვე)/.test(e)?e.replace(/(ი|ე)$/,"ის უკან"):/წელი/.test(e)?e.replace(/წელი$/,"წლის უკან"):void 0},s:"რამდენიმე წამი",ss:"%d წამი",m:"წუთი",mm:"%d წუთი",h:"საათი",hh:"%d საათი",d:"დღე",dd:"%d დღე",M:"თვე",MM:"%d თვე",y:"წელი",yy:"%d წელი"},dayOfMonthOrdinalParse:/0|1-ლი|მე-\d{1,2}|\d{1,2}-ე/,ordinal:function(e){return 0===e?e:1===e?e+"-ლი":e<20||e<=100&&e%20==0||e%100==0?"მე-"+e:e+"-ე"},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(150);var n=t(1);n.datepickerLocale("kk","kk",{closeText:"Жабу",prevText:"&#x3C;Алдыңғы",nextText:"Келесі&#x3E;",currentText:"Бүгін",monthNames:["Қаңтар","Ақпан","Наурыз","Сәуір","Мамыр","Маусым","Шілде","Тамыз","Қыркүйек","Қазан","Қараша","Желтоқсан"],
-monthNamesShort:["Қаң","Ақп","Нау","Сәу","Мам","Мау","Шіл","Там","Қыр","Қаз","Қар","Жел"],dayNames:["Жексенбі","Дүйсенбі","Сейсенбі","Сәрсенбі","Бейсенбі","Жұма","Сенбі"],dayNamesShort:["жкс","дсн","ссн","срс","бсн","жма","снб"],dayNamesMin:["Жк","Дс","Сс","Ср","Бс","Жм","Сн"],weekHeader:"Не",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("kk",{buttonText:{month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={0:"-ші",1:"-ші",2:"-ші",3:"-ші",4:"-ші",5:"-ші",6:"-шы",7:"-ші",8:"-ші",9:"-шы",10:"-шы",20:"-шы",30:"-шы",40:"-шы",50:"-ші",60:"-шы",70:"-ші",80:"-ші",90:"-шы",100:"-ші"};return e.defineLocale("kk",{months:"қаңтар_ақпан_наурыз_сәуір_мамыр_маусым_шілде_тамыз_қыркүйек_қазан_қараша_желтоқсан".split("_"),monthsShort:"қаң_ақп_нау_сәу_мам_мау_шіл_там_қыр_қаз_қар_жел".split("_"),weekdays:"жексенбі_дүйсенбі_сейсенбі_сәрсенбі_бейсенбі_жұма_сенбі".split("_"),weekdaysShort:"жек_дүй_сей_сәр_бей_жұм_сен".split("_"),weekdaysMin:"жк_дй_сй_ср_бй_жм_сн".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Бүгін сағат] LT",nextDay:"[Ертең сағат] LT",nextWeek:"dddd [сағат] LT",lastDay:"[Кеше сағат] LT",lastWeek:"[Өткен аптаның] dddd [сағат] LT",sameElse:"L"},relativeTime:{future:"%s ішінде",past:"%s бұрын",s:"бірнеше секунд",ss:"%d секунд",m:"бір минут",mm:"%d минут",h:"бір сағат",hh:"%d сағат",d:"бір күн",dd:"%d күн",M:"бір ай",MM:"%d ай",y:"бір жыл",yy:"%d жыл"},dayOfMonthOrdinalParse:/\d{1,2}-(ші|шы)/,ordinal:function(e){var t=e%10,n=e>=100?100:null;return e+(a[e]||a[t]||a[n])},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(152);var n=t(1);n.datepickerLocale("ko","ko",{closeText:"닫기",prevText:"이전달",nextText:"다음달",currentText:"오늘",monthNames:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],monthNamesShort:["1월","2월","3월","4월","5월","6월","7월","8월","9월","10월","11월","12월"],dayNames:["일요일","월요일","화요일","수요일","목요일","금요일","토요일"],dayNamesShort:["일","월","화","수","목","금","토"],dayNamesMin:["일","월","화","수","목","금","토"],weekHeader:"주",dateFormat:"yy. m. d.",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"년"}),n.locale("ko",{buttonText:{month:"월",week:"주",day:"일",list:"일정목록"},allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ko",{months:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),monthsShort:"1월_2월_3월_4월_5월_6월_7월_8월_9월_10월_11월_12월".split("_"),weekdays:"일요일_월요일_화요일_수요일_목요일_금요일_토요일".split("_"),weekdaysShort:"일_월_화_수_목_금_토".split("_"),weekdaysMin:"일_월_화_수_목_금_토".split("_"),longDateFormat:{LT:"A h:mm",LTS:"A h:mm:ss",L:"YYYY.MM.DD.",LL:"YYYY년 MMMM D일",LLL:"YYYY년 MMMM D일 A h:mm",LLLL:"YYYY년 MMMM D일 dddd A h:mm",l:"YYYY.MM.DD.",ll:"YYYY년 MMMM D일",lll:"YYYY년 MMMM D일 A h:mm",llll:"YYYY년 MMMM D일 dddd A h:mm"},calendar:{sameDay:"오늘 LT",nextDay:"내일 LT",nextWeek:"dddd LT",lastDay:"어제 LT",lastWeek:"지난주 dddd LT",sameElse:"L"},relativeTime:{future:"%s 후",past:"%s 전",s:"몇 초",ss:"%d초",m:"1분",mm:"%d분",h:"한 시간",hh:"%d시간",d:"하루",dd:"%d일",M:"한 달",MM:"%d달",y:"일 년",yy:"%d년"},dayOfMonthOrdinalParse:/\d{1,2}(일|월|주)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"일";case"M":return e+"월";case"w":case"W":return e+"주";default:return e}},meridiemParse:/오전|오후/,isPM:function(e){return"오후"===e},meridiem:function(e,a,t){return e<12?"오전":"오후"}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(154);var n=t(1);n.datepickerLocale("lb","lb",{closeText:"Fäerdeg",prevText:"Zréck",nextText:"Weider",currentText:"Haut",monthNames:["Januar","Februar","Mäerz","Abrëll","Mee","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mäe","Abr","Mee","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonndeg","Méindeg","Dënschdeg","Mëttwoch","Donneschdeg","Freideg","Samschdeg"],dayNamesShort:["Son","Méi","Dën","Mët","Don","Fre","Sam"],dayNamesMin:["So","Mé","Dë","Më","Do","Fr","Sa"],weekHeader:"W",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("lb",{buttonText:{month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r={m:["eng Minutt","enger Minutt"],h:["eng Stonn","enger Stonn"],d:["een Dag","engem Dag"],M:["ee Mount","engem Mount"],y:["ee Joer","engem Joer"]};return a?r[t][0]:r[t][1]}function t(e){return r(e.substr(0,e.indexOf(" ")))?"a "+e:"an "+e}function n(e){return r(e.substr(0,e.indexOf(" ")))?"viru "+e:"virun "+e}function r(e){if(e=parseInt(e,10),isNaN(e))return!1;if(e<0)return!0;if(e<10)return 4<=e&&e<=7;if(e<100){var a=e%10,t=e/10;return r(0===a?t:a)}if(e<1e4){for(;e>=10;)e/=10;return r(e)}return e/=1e3,r(e)}return e.defineLocale("lb",{months:"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg".split("_"),weekdaysShort:"So._Mé._Dë._Më._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mé_Dë_Më_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm [Auer]",LTS:"H:mm:ss [Auer]",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm [Auer]",LLLL:"dddd, D. MMMM YYYY H:mm [Auer]"},calendar:{sameDay:"[Haut um] LT",sameElse:"L",nextDay:"[Muer um] LT",nextWeek:"dddd [um] LT",lastDay:"[Gëschter um] LT",lastWeek:function(){switch(this.day()){case 2:case 4:return"[Leschten] dddd [um] LT";default:return"[Leschte] dddd [um] LT"}}},relativeTime:{future:t,past:n,s:"e puer Sekonnen",ss:"%d Sekonnen",m:a,mm:"%d Minutten",h:a,hh:"%d Stonnen",d:a,dd:"%d Deeg",M:a,MM:"%d Méint",y:a,yy:"%d Joer"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(156);var n=t(1);n.datepickerLocale("lt","lt",{closeText:"Uždaryti",prevText:"&#x3C;Atgal",nextText:"Pirmyn&#x3E;",currentText:"Šiandien",monthNames:["Sausis","Vasaris","Kovas","Balandis","Gegužė","Birželis","Liepa","Rugpjūtis","Rugsėjis","Spalis","Lapkritis","Gruodis"],monthNamesShort:["Sau","Vas","Kov","Bal","Geg","Bir","Lie","Rugp","Rugs","Spa","Lap","Gru"],dayNames:["sekmadienis","pirmadienis","antradienis","trečiadienis","ketvirtadienis","penktadienis","šeštadienis"],dayNamesShort:["sek","pir","ant","tre","ket","pen","šeš"],dayNamesMin:["Se","Pr","An","Tr","Ke","Pe","Še"],weekHeader:"SAV",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),n.locale("lt",{buttonText:{month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){return a?"kelios sekundės":n?"kelių sekundžių":"kelias sekundes"}function t(e,a,t,n){return a?r(t)[0]:n?r(t)[1]:r(t)[2]}function n(e){return e%10==0||e>10&&e<20}function r(e){return d[e].split("_")}function s(e,a,s,d){var i=e+" ";return 1===e?i+t(e,a,s[0],d):a?i+(n(e)?r(s)[1]:r(s)[0]):d?i+r(s)[1]:i+(n(e)?r(s)[1]:r(s)[2])}var d={ss:"sekundė_sekundžių_sekundes",m:"minutė_minutės_minutę",mm:"minutės_minučių_minutes",h:"valanda_valandos_valandą",hh:"valandos_valandų_valandas",d:"diena_dienos_dieną",dd:"dienos_dienų_dienas",M:"mėnuo_mėnesio_mėnesį",MM:"mėnesiai_mėnesių_mėnesius",y:"metai_metų_metus",yy:"metai_metų_metus"};return e.defineLocale("lt",{months:{format:"sausio_vasario_kovo_balandžio_gegužės_birželio_liepos_rugpjūčio_rugsėjo_spalio_lapkričio_gruodžio".split("_"),standalone:"sausis_vasaris_kovas_balandis_gegužė_birželis_liepa_rugpjūtis_rugsėjis_spalis_lapkritis_gruodis".split("_"),isFormat:/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?|MMMM?(\[[^\[\]]*\]|\s)+D[oD]?/},monthsShort:"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),weekdays:{format:"sekmadienį_pirmadienį_antradienį_trečiadienį_ketvirtadienį_penktadienį_šeštadienį".split("_"),standalone:"sekmadienis_pirmadienis_antradienis_trečiadienis_ketvirtadienis_penktadienis_šeštadienis".split("_"),isFormat:/dddd HH:mm/},weekdaysShort:"Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),weekdaysMin:"S_P_A_T_K_Pn_Š".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY [m.] MMMM D [d.]",LLL:"YYYY [m.] MMMM D [d.], HH:mm [val.]",LLLL:"YYYY [m.] MMMM D [d.], dddd, HH:mm [val.]",l:"YYYY-MM-DD",ll:"YYYY [m.] MMMM D [d.]",lll:"YYYY [m.] MMMM D [d.], HH:mm [val.]",llll:"YYYY [m.] MMMM D [d.], ddd, HH:mm [val.]"},calendar:{sameDay:"[Šiandien] LT",nextDay:"[Rytoj] LT",nextWeek:"dddd LT",lastDay:"[Vakar] LT",lastWeek:"[Praėjusį] dddd LT",sameElse:"L"},relativeTime:{future:"po %s",past:"prieš %s",s:a,ss:s,m:t,mm:s,h:t,hh:s,d:t,dd:s,M:t,MM:s,y:t,yy:s},dayOfMonthOrdinalParse:/\d{1,2}-oji/,ordinal:function(e){return e+"-oji"},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(158);var n=t(1);n.datepickerLocale("lv","lv",{closeText:"Aizvērt",prevText:"Iepr.",nextText:"Nāk.",currentText:"Šodien",monthNames:["Janvāris","Februāris","Marts","Aprīlis","Maijs","Jūnijs","Jūlijs","Augusts","Septembris","Oktobris","Novembris","Decembris"],monthNamesShort:["Jan","Feb","Mar","Apr","Mai","Jūn","Jūl","Aug","Sep","Okt","Nov","Dec"],dayNames:["svētdiena","pirmdiena","otrdiena","trešdiena","ceturtdiena","piektdiena","sestdiena"],dayNamesShort:["svt","prm","otr","tre","ctr","pkt","sst"],dayNamesMin:["Sv","Pr","Ot","Tr","Ct","Pk","Ss"],weekHeader:"Ned.",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("lv",{buttonText:{month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t){return t?a%10==1&&a%100!=11?e[2]:e[3]:a%10==1&&a%100!=11?e[0]:e[1]}function t(e,t,n){return e+" "+a(s[n],e,t)}function n(e,t,n){return a(s[n],e,t)}function r(e,a){return a?"dažas sekundes":"dažām sekundēm"}var s={ss:"sekundes_sekundēm_sekunde_sekundes".split("_"),m:"minūtes_minūtēm_minūte_minūtes".split("_"),mm:"minūtes_minūtēm_minūte_minūtes".split("_"),h:"stundas_stundām_stunda_stundas".split("_"),hh:"stundas_stundām_stunda_stundas".split("_"),d:"dienas_dienām_diena_dienas".split("_"),dd:"dienas_dienām_diena_dienas".split("_"),M:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),MM:"mēneša_mēnešiem_mēnesis_mēneši".split("_"),y:"gada_gadiem_gads_gadi".split("_"),yy:"gada_gadiem_gads_gadi".split("_")};return e.defineLocale("lv",{months:"janvāris_februāris_marts_aprīlis_maijs_jūnijs_jūlijs_augusts_septembris_oktobris_novembris_decembris".split("_"),monthsShort:"jan_feb_mar_apr_mai_jūn_jūl_aug_sep_okt_nov_dec".split("_"),weekdays:"svētdiena_pirmdiena_otrdiena_trešdiena_ceturtdiena_piektdiena_sestdiena".split("_"),weekdaysShort:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysMin:"Sv_P_O_T_C_Pk_S".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY.",LL:"YYYY. [gada] D. MMMM",LLL:"YYYY. [gada] D. MMMM, HH:mm",LLLL:"YYYY. [gada] D. MMMM, dddd, HH:mm"},calendar:{sameDay:"[Šodien pulksten] LT",nextDay:"[Rīt pulksten] LT",nextWeek:"dddd [pulksten] LT",lastDay:"[Vakar pulksten] LT",lastWeek:"[Pagājušā] dddd [pulksten] LT",sameElse:"L"},relativeTime:{future:"pēc %s",past:"pirms %s",s:r,ss:t,m:n,mm:t,h:n,hh:t,d:n,dd:t,M:n,MM:t,y:n,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(160);var n=t(1);n.datepickerLocale("mk","mk",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Денес",monthNames:["Јануари","Февруари","Март","Април","Мај","Јуни","Јули","Август","Септември","Октомври","Ноември","Декември"],monthNamesShort:["Јан","Фев","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Ное","Дек"],dayNames:["Недела","Понеделник","Вторник","Среда","Четврток","Петок","Сабота"],dayNamesShort:["Нед","Пон","Вто","Сре","Чет","Пет","Саб"],dayNamesMin:["Не","По","Вт","Ср","Че","Пе","Са"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("mk",{buttonText:{month:"Месец",week:"Недела",day:"Ден",list:"График"},allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("mk",{months:"јануари_февруари_март_април_мај_јуни_јули_август_септември_октомври_ноември_декември".split("_"),monthsShort:"јан_фев_мар_апр_мај_јун_јул_авг_сеп_окт_ное_дек".split("_"),weekdays:"недела_понеделник_вторник_среда_четврток_петок_сабота".split("_"),weekdaysShort:"нед_пон_вто_сре_чет_пет_саб".split("_"),weekdaysMin:"нe_пo_вт_ср_че_пе_сa".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"D.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[Денес во] LT",nextDay:"[Утре во] LT",nextWeek:"[Во] dddd [во] LT",lastDay:"[Вчера во] LT",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return"[Изминатата] dddd [во] LT";case 1:case 2:case 4:case 5:return"[Изминатиот] dddd [во] LT"}},sameElse:"L"},relativeTime:{future:"после %s",past:"пред %s",s:"неколку секунди",ss:"%d секунди",m:"минута",mm:"%d минути",h:"час",hh:"%d часа",d:"ден",dd:"%d дена",M:"месец",MM:"%d месеци",y:"година",yy:"%d години"},dayOfMonthOrdinalParse:/\d{1,2}-(ев|ен|ти|ви|ри|ми)/,ordinal:function(e){var a=e%10,t=e%100;return 0===e?e+"-ев":0===t?e+"-ен":t>10&&t<20?e+"-ти":1===a?e+"-ви":2===a?e+"-ри":7===a||8===a?e+"-ми":e+"-ти"},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(162);var n=t(1);n.datepickerLocale("ms-my","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ms-my",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ms-my",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(164);var n=t(1);n.datepickerLocale("ms","ms",{closeText:"Tutup",prevText:"&#x3C;Sebelum",nextText:"Selepas&#x3E;",currentText:"hari ini",monthNames:["Januari","Februari","Mac","April","Mei","Jun","Julai","Ogos","September","Oktober","November","Disember"],monthNamesShort:["Jan","Feb","Mac","Apr","Mei","Jun","Jul","Ogo","Sep","Okt","Nov","Dis"],dayNames:["Ahad","Isnin","Selasa","Rabu","Khamis","Jumaat","Sabtu"],dayNamesShort:["Aha","Isn","Sel","Rab","kha","Jum","Sab"],dayNamesMin:["Ah","Is","Se","Ra","Kh","Ju","Sa"],weekHeader:"Mg",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ms",{buttonText:{month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("ms",{months:"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember".split("_"),monthsShort:"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis".split("_"),weekdays:"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu".split("_"),weekdaysShort:"Ahd_Isn_Sel_Rab_Kha_Jum_Sab".split("_"),weekdaysMin:"Ah_Is_Sl_Rb_Km_Jm_Sb".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [pukul] HH.mm",LLLL:"dddd, D MMMM YYYY [pukul] HH.mm"},meridiemParse:/pagi|tengahari|petang|malam/,meridiemHour:function(e,a){return 12===e&&(e=0),"pagi"===a?e:"tengahari"===a?e>=11?e:e+12:"petang"===a||"malam"===a?e+12:void 0},meridiem:function(e,a,t){return e<11?"pagi":e<15?"tengahari":e<19?"petang":"malam"},calendar:{sameDay:"[Hari ini pukul] LT",nextDay:"[Esok pukul] LT",nextWeek:"dddd [pukul] LT",lastDay:"[Kelmarin pukul] LT",lastWeek:"dddd [lepas pukul] LT",sameElse:"L"},relativeTime:{future:"dalam %s",past:"%s yang lepas",s:"beberapa saat",ss:"%d saat",m:"seminit",mm:"%d minit",h:"sejam",hh:"%d jam",d:"sehari",dd:"%d hari",M:"sebulan",MM:"%d bulan",y:"setahun",yy:"%d tahun"},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(166);var n=t(1);n.datepickerLocale("nb","nb",{closeText:"Lukk",prevText:"&#xAB;Forrige",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["søn","man","tir","ons","tor","fre","lør"],dayNames:["søndag","mandag","tirsdag","onsdag","torsdag","fredag","lørdag"],dayNamesMin:["sø","ma","ti","on","to","fr","lø"],weekHeader:"Uke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("nb",{buttonText:{month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("nb",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.".split("_"),monthsParseExact:!0,weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"sø._ma._ti._on._to._fr._lø.".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] HH:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[i dag kl.] LT",nextDay:"[i morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[i går kl.] LT",lastWeek:"[forrige] dddd [kl.] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"noen sekunder",ss:"%d sekunder",m:"ett minutt",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dager",M:"en måned",MM:"%d måneder",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(168);var n=t(1);n.datepickerLocale("nl-be","nl-BE",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("nl-be",{buttonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;return e.defineLocale("nl-be",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,n){return e?/-MMM-/.test(n)?t[e.month()]:a[e.month()]:a},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(170);var n=t(1);n.datepickerLocale("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("nl",{buttonText:{year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),t="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_"),n=[/^jan/i,/^feb/i,/^maart|mrt.?$/i,/^apr/i,/^mei$/i,/^jun[i.]?$/i,/^jul[i.]?$/i,/^aug/i,/^sep/i,/^okt/i,/^nov/i,/^dec/i],r=/^(januari|februari|maart|april|mei|april|ju[nl]i|augustus|september|oktober|november|december|jan\.?|feb\.?|mrt\.?|apr\.?|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i;return e.defineLocale("nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,n){return e?/-MMM-/.test(n)?t[e.month()]:a[e.month()]:a},monthsRegex:r,monthsShortRegex:r,monthsStrictRegex:/^(januari|februari|maart|mei|ju[nl]i|april|augustus|september|oktober|november|december)/i,monthsShortStrictRegex:/^(jan\.?|feb\.?|mrt\.?|apr\.?|mei|ju[nl]\.?|aug\.?|sep\.?|okt\.?|nov\.?|dec\.?)/i,monthsParse:n,longMonthsParse:n,shortMonthsParse:n,weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"zo_ma_di_wo_do_vr_za".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",ss:"%d seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},dayOfMonthOrdinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(172);var n=t(1);n.datepickerLocale("nn","nn",{closeText:"Lukk",prevText:"&#xAB;Førre",nextText:"Neste&#xBB;",currentText:"I dag",monthNames:["januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember"],monthNamesShort:["jan","feb","mar","apr","mai","jun","jul","aug","sep","okt","nov","des"],dayNamesShort:["sun","mån","tys","ons","tor","fre","lau"],dayNames:["sundag","måndag","tysdag","onsdag","torsdag","fredag","laurdag"],dayNamesMin:["su","må","ty","on","to","fr","la"],weekHeader:"Veke",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("nn",{buttonText:{month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("nn",{months:"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember".split("_"),monthsShort:"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),weekdays:"sundag_måndag_tysdag_onsdag_torsdag_fredag_laurdag".split("_"),weekdaysShort:"sun_mån_tys_ons_tor_fre_lau".split("_"),weekdaysMin:"su_må_ty_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY [kl.] H:mm",LLLL:"dddd D. MMMM YYYY [kl.] HH:mm"},calendar:{sameDay:"[I dag klokka] LT",nextDay:"[I morgon klokka] LT",nextWeek:"dddd [klokka] LT",lastDay:"[I går klokka] LT",lastWeek:"[Føregåande] dddd [klokka] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s sidan",s:"nokre sekund",ss:"%d sekund",m:"eit minutt",mm:"%d minutt",h:"ein time",hh:"%d timar",d:"ein dag",dd:"%d dagar",M:"ein månad",MM:"%d månader",y:"eit år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(174);var n=t(1);n.datepickerLocale("pl","pl",{closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"Następny&#x3E;",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("pl",{buttonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e){return e%10<5&&e%10>1&&~~(e/10)%10!=1}function t(e,t,n){var r=e+" ";switch(n){case"ss":return r+(a(e)?"sekundy":"sekund");case"m":return t?"minuta":"minutę";case"mm":return r+(a(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(a(e)?"godziny":"godzin");case"MM":return r+(a(e)?"miesiące":"miesięcy");case"yy":return r+(a(e)?"lata":"lat")}}var n="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),r="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");return e.defineLocale("pl",{months:function(e,a){return e?""===a?"("+r[e.month()]+"|"+n[e.month()]+")":/D MMMM/.test(a)?r[e.month()]:n[e.month()]:n},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"ndz_pon_wt_śr_czw_pt_sob".split("_"),weekdaysMin:"Nd_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:function(){switch(this.day()){case 0:return"[W niedzielę o] LT";case 2:return"[We wtorek o] LT";case 3:return"[W środę o] LT";case 6:return"[W sobotę o] LT";default:return"[W] dddd [o] LT"}},lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",ss:t,m:t,mm:t,h:t,hh:t,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:t,y:"rok",yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(176);var n=t(1);n.datepickerLocale("pt-br","pt-BR",{closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("pt-br",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] HH:mm",
-LLLL:"dddd, D [de] MMMM [de] YYYY [às] HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"poucos segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº"})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(178);var n=t(1);n.datepickerLocale("pt","pt",{closeText:"Fechar",prevText:"Anterior",nextText:"Seguinte",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sem",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("pt",{buttonText:{month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("pt",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"Domingo_Segunda-feira_Terça-feira_Quarta-feira_Quinta-feira_Sexta-feira_Sábado".split("_"),weekdaysShort:"Dom_Seg_Ter_Qua_Qui_Sex_Sáb".split("_"),weekdaysMin:"Do_2ª_3ª_4ª_5ª_6ª_Sá".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY HH:mm",LLLL:"dddd, D [de] MMMM [de] YYYY HH:mm"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"há %s",s:"segundos",ss:"%d segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},dayOfMonthOrdinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(180);var n=t(1);n.datepickerLocale("ro","ro",{closeText:"Închide",prevText:"&#xAB; Luna precedentă",nextText:"Luna următoare &#xBB;",currentText:"Azi",monthNames:["Ianuarie","Februarie","Martie","Aprilie","Mai","Iunie","Iulie","August","Septembrie","Octombrie","Noiembrie","Decembrie"],monthNamesShort:["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Duminică","Luni","Marţi","Miercuri","Joi","Vineri","Sâmbătă"],dayNamesShort:["Dum","Lun","Mar","Mie","Joi","Vin","Sâm"],dayNamesMin:["Du","Lu","Ma","Mi","Jo","Vi","Sâ"],weekHeader:"Săpt",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ro",{buttonText:{prev:"precedentă",next:"următoare",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t){var n={ss:"secunde",mm:"minute",hh:"ore",dd:"zile",MM:"luni",yy:"ani"},r=" ";return(e%100>=20||e>=100&&e%100==0)&&(r=" de "),e+r+n[t]}return e.defineLocale("ro",{months:"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie".split("_"),monthsShort:"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"duminică_luni_marți_miercuri_joi_vineri_sâmbătă".split("_"),weekdaysShort:"Dum_Lun_Mar_Mie_Joi_Vin_Sâm".split("_"),weekdaysMin:"Du_Lu_Ma_Mi_Jo_Vi_Sâ".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY H:mm",LLLL:"dddd, D MMMM YYYY H:mm"},calendar:{sameDay:"[azi la] LT",nextDay:"[mâine la] LT",nextWeek:"dddd [la] LT",lastDay:"[ieri la] LT",lastWeek:"[fosta] dddd [la] LT",sameElse:"L"},relativeTime:{future:"peste %s",past:"%s în urmă",s:"câteva secunde",ss:a,m:"un minut",mm:a,h:"o oră",hh:a,d:"o zi",dd:a,M:"o lună",MM:a,y:"un an",yy:a},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(182);var n=t(1);n.datepickerLocale("ru","ru",{closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("ru",{buttonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a){var t=e.split("_");return a%10==1&&a%100!=11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(e,t,n){var r={ss:t?"секунда_секунды_секунд":"секунду_секунды_секунд",mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===n?t?"минута":"минуту":e+" "+a(r[n],+e)}var n=[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[йя]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i];return e.defineLocale("ru",{months:{format:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_"),standalone:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_")},monthsShort:{format:"янв._февр._мар._апр._мая_июня_июля_авг._сент._окт._нояб._дек.".split("_"),standalone:"янв._февр._март_апр._май_июнь_июль_авг._сент._окт._нояб._дек.".split("_")},weekdays:{standalone:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),format:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_"),isFormat:/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/},weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:n,longMonthsParse:n,shortMonthsParse:n,monthsRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsShortRegex:/^(январ[ья]|янв\.?|феврал[ья]|февр?\.?|марта?|мар\.?|апрел[ья]|апр\.?|ма[йя]|июн[ья]|июн\.?|июл[ья]|июл\.?|августа?|авг\.?|сентябр[ья]|сент?\.?|октябр[ья]|окт\.?|ноябр[ья]|нояб?\.?|декабр[ья]|дек\.?)/i,monthsStrictRegex:/^(январ[яь]|феврал[яь]|марта?|апрел[яь]|ма[яй]|июн[яь]|июл[яь]|августа?|сентябр[яь]|октябр[яь]|ноябр[яь]|декабр[яь])/i,monthsShortStrictRegex:/^(янв\.|февр?\.|мар[т.]|апр\.|ма[яй]|июн[ья.]|июл[ья.]|авг\.|сент?\.|окт\.|нояб?\.|дек\.)/i,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., H:mm",LLLL:"dddd, D MMMM YYYY г., H:mm"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В следующее] dddd [в] LT";case 1:case 2:case 4:return"[В следующий] dddd [в] LT";case 3:case 5:case 6:return"[В следующую] dddd [в] LT"}},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",ss:t,m:t,mm:t,h:"час",hh:t,d:"день",dd:t,M:"месяц",MM:t,y:"год",yy:t},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночи":e<12?"утра":e<17?"дня":"вечера"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(184);var n=t(1);n.datepickerLocale("sk","sk",{closeText:"Zavrieť",prevText:"&#x3C;Predchádzajúci",nextText:"Nasledujúci&#x3E;",currentText:"Dnes",monthNames:["január","február","marec","apríl","máj","jún","júl","august","september","október","november","december"],monthNamesShort:["Jan","Feb","Mar","Apr","Máj","Jún","Júl","Aug","Sep","Okt","Nov","Dec"],dayNames:["nedeľa","pondelok","utorok","streda","štvrtok","piatok","sobota"],dayNamesShort:["Ned","Pon","Uto","Str","Štv","Pia","Sob"],dayNamesMin:["Ne","Po","Ut","St","Št","Pia","So"],weekHeader:"Ty",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("sk",{buttonText:{month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e){return e>1&&e<5}function t(e,t,n,r){var s=e+" ";switch(n){case"s":return t||r?"pár sekúnd":"pár sekundami";case"ss":return t||r?s+(a(e)?"sekundy":"sekúnd"):s+"sekundami";case"m":return t?"minúta":r?"minútu":"minútou";case"mm":return t||r?s+(a(e)?"minúty":"minút"):s+"minútami";case"h":return t?"hodina":r?"hodinu":"hodinou";case"hh":return t||r?s+(a(e)?"hodiny":"hodín"):s+"hodinami";case"d":return t||r?"deň":"dňom";case"dd":return t||r?s+(a(e)?"dni":"dní"):s+"dňami";case"M":return t||r?"mesiac":"mesiacom";case"MM":return t||r?s+(a(e)?"mesiace":"mesiacov"):s+"mesiacmi";case"y":return t||r?"rok":"rokom";case"yy":return t||r?s+(a(e)?"roky":"rokov"):s+"rokmi"}}var n="január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),r="jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");return e.defineLocale("sk",{months:n,monthsShort:r,weekdays:"nedeľa_pondelok_utorok_streda_štvrtok_piatok_sobota".split("_"),weekdaysShort:"ne_po_ut_st_št_pi_so".split("_"),weekdaysMin:"ne_po_ut_st_št_pi_so".split("_"),longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd D. MMMM YYYY H:mm"},calendar:{sameDay:"[dnes o] LT",nextDay:"[zajtra o] LT",nextWeek:function(){switch(this.day()){case 0:return"[v nedeľu o] LT";case 1:case 2:return"[v] dddd [o] LT";case 3:return"[v stredu o] LT";case 4:return"[vo štvrtok o] LT";case 5:return"[v piatok o] LT";case 6:return"[v sobotu o] LT"}},lastDay:"[včera o] LT",lastWeek:function(){switch(this.day()){case 0:return"[minulú nedeľu o] LT";case 1:case 2:return"[minulý] dddd [o] LT";case 3:return"[minulú stredu o] LT";case 4:case 5:return"[minulý] dddd [o] LT";case 6:return"[minulú sobotu o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"pred %s",s:t,ss:t,m:t,mm:t,h:t,hh:t,d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(186);var n=t(1);n.datepickerLocale("sl","sl",{closeText:"Zapri",prevText:"&#x3C;Prejšnji",nextText:"Naslednji&#x3E;",currentText:"Trenutni",monthNames:["Januar","Februar","Marec","April","Maj","Junij","Julij","Avgust","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljek","Torek","Sreda","Četrtek","Petek","Sobota"],dayNamesShort:["Ned","Pon","Tor","Sre","Čet","Pet","Sob"],dayNamesMin:["Ne","Po","To","Sr","Če","Pe","So"],weekHeader:"Teden",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("sl",{buttonText:{month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a,t,n){var r=e+" ";switch(t){case"s":return a||n?"nekaj sekund":"nekaj sekundami";case"ss":return r+=1===e?a?"sekundo":"sekundi":2===e?a||n?"sekundi":"sekundah":e<5?a||n?"sekunde":"sekundah":"sekund";case"m":return a?"ena minuta":"eno minuto";case"mm":return r+=1===e?a?"minuta":"minuto":2===e?a||n?"minuti":"minutama":e<5?a||n?"minute":"minutami":a||n?"minut":"minutami";case"h":return a?"ena ura":"eno uro";case"hh":return r+=1===e?a?"ura":"uro":2===e?a||n?"uri":"urama":e<5?a||n?"ure":"urami":a||n?"ur":"urami";case"d":return a||n?"en dan":"enim dnem";case"dd":return r+=1===e?a||n?"dan":"dnem":2===e?a||n?"dni":"dnevoma":a||n?"dni":"dnevi";case"M":return a||n?"en mesec":"enim mesecem";case"MM":return r+=1===e?a||n?"mesec":"mesecem":2===e?a||n?"meseca":"mesecema":e<5?a||n?"mesece":"meseci":a||n?"mesecev":"meseci";case"y":return a||n?"eno leto":"enim letom";case"yy":return r+=1===e?a||n?"leto":"letom":2===e?a||n?"leti":"letoma":e<5?a||n?"leta":"leti":a||n?"let":"leti"}}return e.defineLocale("sl",{months:"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december".split("_"),monthsShort:"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljek_torek_sreda_četrtek_petek_sobota".split("_"),weekdaysShort:"ned._pon._tor._sre._čet._pet._sob.".split("_"),weekdaysMin:"ne_po_to_sr_če_pe_so".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danes ob] LT",nextDay:"[jutri ob] LT",nextWeek:function(){switch(this.day()){case 0:return"[v] [nedeljo] [ob] LT";case 3:return"[v] [sredo] [ob] LT";case 6:return"[v] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[v] dddd [ob] LT"}},lastDay:"[včeraj ob] LT",lastWeek:function(){switch(this.day()){case 0:return"[prejšnjo] [nedeljo] [ob] LT";case 3:return"[prejšnjo] [sredo] [ob] LT";case 6:return"[prejšnjo] [soboto] [ob] LT";case 1:case 2:case 4:case 5:return"[prejšnji] dddd [ob] LT"}},sameElse:"L"},relativeTime:{future:"čez %s",past:"pred %s",s:a,ss:a,m:a,mm:a,h:a,hh:a,d:a,dd:a,M:a,MM:a,y:a,yy:a},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(188);var n=t(1);n.datepickerLocale("sq","sq",{closeText:"mbylle",prevText:"&#x3C;mbrapa",nextText:"Përpara&#x3E;",currentText:"sot",monthNames:["Janar","Shkurt","Mars","Prill","Maj","Qershor","Korrik","Gusht","Shtator","Tetor","Nëntor","Dhjetor"],monthNamesShort:["Jan","Shk","Mar","Pri","Maj","Qer","Kor","Gus","Sht","Tet","Nën","Dhj"],dayNames:["E Diel","E Hënë","E Martë","E Mërkurë","E Enjte","E Premte","E Shtune"],dayNamesShort:["Di","Hë","Ma","Më","En","Pr","Sh"],dayNamesMin:["Di","Hë","Ma","Më","En","Pr","Sh"],weekHeader:"Ja",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("sq",{buttonText:{month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},allDayHtml:"Gjithë<br/>ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("sq",{months:"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),monthsShort:"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),weekdays:"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë".split("_"),weekdaysShort:"Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),weekdaysMin:"D_H_Ma_Më_E_P_Sh".split("_"),weekdaysParseExact:!0,meridiemParse:/PD|MD/,isPM:function(e){return"M"===e.charAt(0)},meridiem:function(e,a,t){return e<12?"PD":"MD"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Sot në] LT",nextDay:"[Nesër në] LT",nextWeek:"dddd [në] LT",lastDay:"[Dje në] LT",lastWeek:"dddd [e kaluar në] LT",sameElse:"L"},relativeTime:{future:"në %s",past:"%s më parë",s:"disa sekonda",ss:"%d sekonda",m:"një minutë",mm:"%d minuta",h:"një orë",hh:"%d orë",d:"një ditë",dd:"%d ditë",M:"një muaj",MM:"%d muaj",y:"një vit",yy:"%d vite"},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(190);var n=t(1);n.datepickerLocale("sr-cyrl","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("sr-cyrl",{buttonText:{prev:"Претходна",next:"следећи",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={words:{ss:["секунда","секунде","секунди"],m:["један минут","једне минуте"],mm:["минут","минуте","минута"],h:["један сат","једног сата"],hh:["сат","сата","сати"],dd:["дан","дана","дана"],MM:["месец","месеца","месеци"],yy:["година","године","година"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(e,t,n){var r=a.words[n];return 1===n.length?t?r[0]:r[1]:e+" "+a.correctGrammaticalCase(e,r)}};return e.defineLocale("sr-cyrl",{months:"јануар_фебруар_март_април_мај_јун_јул_август_септембар_октобар_новембар_децембар".split("_"),monthsShort:"јан._феб._мар._апр._мај_јун_јул_авг._сеп._окт._нов._дец.".split("_"),monthsParseExact:!0,weekdays:"недеља_понедељак_уторак_среда_четвртак_петак_субота".split("_"),weekdaysShort:"нед._пон._уто._сре._чет._пет._суб.".split("_"),weekdaysMin:"не_по_ут_ср_че_пе_су".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[данас у] LT",nextDay:"[сутра у] LT",nextWeek:function(){switch(this.day()){case 0:return"[у] [недељу] [у] LT";case 3:return"[у] [среду] [у] LT";case 6:return"[у] [суботу] [у] LT";case 1:case 2:case 4:case 5:return"[у] dddd [у] LT"}},lastDay:"[јуче у] LT",lastWeek:function(){return["[прошле] [недеље] [у] LT","[прошлог] [понедељка] [у] LT","[прошлог] [уторка] [у] LT","[прошле] [среде] [у] LT","[прошлог] [четвртка] [у] LT","[прошлог] [петка] [у] LT","[прошле] [суботе] [у] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"за %s",past:"пре %s",s:"неколико секунди",ss:a.translate,m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"дан",dd:a.translate,M:"месец",MM:a.translate,y:"годину",yy:a.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(192);var n=t(1);n.datepickerLocale("sr","sr-SR",{closeText:"Zatvori",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Danas",monthNames:["Januar","Februar","Mart","April","Maj","Jun","Jul","Avgust","Septembar","Oktobar","Novembar","Decembar"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Avg","Sep","Okt","Nov","Dec"],dayNames:["Nedelja","Ponedeljak","Utorak","Sreda","Četvrtak","Petak","Subota"],dayNamesShort:["Ned","Pon","Uto","Sre","Čet","Pet","Sub"],dayNamesMin:["Ne","Po","Ut","Sr","Če","Pe","Su"],weekHeader:"Sed",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("sr",{buttonText:{prev:"Prethodna",next:"Sledeći",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={words:{ss:["sekunda","sekunde","sekundi"],m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,a){return 1===e?a[0]:e>=2&&e<=4?a[1]:a[2]},translate:function(e,t,n){var r=a.words[n];return 1===n.length?t?r[0]:r[1]:e+" "+a.correctGrammaticalCase(e,r)}};return e.defineLocale("sr",{months:"januar_februar_mart_april_maj_jun_jul_avgust_septembar_oktobar_novembar_decembar".split("_"),monthsShort:"jan._feb._mar._apr._maj_jun_jul_avg._sep._okt._nov._dec.".split("_"),monthsParseExact:!0,weekdays:"nedelja_ponedeljak_utorak_sreda_četvrtak_petak_subota".split("_"),weekdaysShort:"ned._pon._uto._sre._čet._pet._sub.".split("_"),weekdaysMin:"ne_po_ut_sr_če_pe_su".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY H:mm",LLLL:"dddd, D. MMMM YYYY H:mm"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){return["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"][this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",ss:a.translate,m:a.translate,mm:a.translate,h:a.translate,hh:a.translate,d:"dan",dd:a.translate,M:"mesec",MM:a.translate,y:"godinu",yy:a.translate},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(194);var n=t(1);n.datepickerLocale("sv","sv",{closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"v. ",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("sv",{buttonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY [kl.] HH:mm",LLLL:"dddd D MMMM YYYY [kl.] HH:mm",lll:"D MMM YYYY HH:mm",llll:"ddd D MMM YYYY HH:mm"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"[På] dddd LT",lastWeek:"[I] dddd[s] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",ss:"%d sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},dayOfMonthOrdinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var a=e%10;return e+(1==~~(e%100/10)?"e":1===a?"a":2===a?"a":"e")},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(196);var n=t(1);n.datepickerLocale("th","th",{closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("th",{buttonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"ม.ค._ก.พ._มี.ค._เม.ย._พ.ค._มิ.ย._ก.ค._ส.ค._ก.ย._ต.ค._พ.ย._ธ.ค.".split("_"),monthsParseExact:!0,weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"H:mm",LTS:"H:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา H:mm",LLLL:"วันddddที่ D MMMM YYYY เวลา H:mm"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e,a,t){return e<12?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",ss:"%d วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(198);var n=t(1);n.datepickerLocale("tr","tr",{closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("tr",{buttonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Herhangi bir etkinlik görüntülemek için"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){var a={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};return e.defineLocale("tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[gelecek] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",ss:"%d saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinal:function(e,t){switch(t){case"d":case"D":case"Do":case"DD":return e;default:if(0===e)return e+"'ıncı";var n=e%10,r=e%100-n,s=e>=100?100:null;return e+(a[n]||a[r]||a[s])}},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(200);var n=t(1);n.datepickerLocale("uk","uk",{closeText:"Закрити",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Сьогодні",monthNames:["Січень","Лютий","Березень","Квітень","Травень","Червень","Липень","Серпень","Вересень","Жовтень","Листопад","Грудень"],monthNamesShort:["Січ","Лют","Бер","Кві","Тра","Чер","Лип","Сер","Вер","Жов","Лис","Гру"],dayNames:["неділя","понеділок","вівторок","середа","четвер","п’ятниця","субота"],dayNamesShort:["нед","пнд","вів","срд","чтв","птн","сбт"],dayNamesMin:["Нд","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Тиж",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("uk",{buttonText:{month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){function a(e,a){var t=e.split("_");return a%10==1&&a%100!=11?t[0]:a%10>=2&&a%10<=4&&(a%100<10||a%100>=20)?t[1]:t[2]}function t(e,t,n){var r={ss:t?"секунда_секунди_секунд":"секунду_секунди_секунд",mm:t?"хвилина_хвилини_хвилин":"хвилину_хвилини_хвилин",hh:t?"година_години_годин":"годину_години_годин",dd:"день_дні_днів",MM:"місяць_місяці_місяців",yy:"рік_роки_років"};return"m"===n?t?"хвилина":"хвилину":"h"===n?t?"година":"годину":e+" "+a(r[n],+e)}function n(e,a){var t={nominative:"неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота".split("_"),accusative:"неділю_понеділок_вівторок_середу_четвер_п’ятницю_суботу".split("_"),genitive:"неділі_понеділка_вівторка_середи_четверга_п’ятниці_суботи".split("_")};return e?t[/(\[[ВвУу]\]) ?dddd/.test(a)?"accusative":/\[?(?:минулої|наступної)? ?\] ?dddd/.test(a)?"genitive":"nominative"][e.day()]:t.nominative}function r(e){return function(){return e+"о"+(11===this.hours()?"б":"")+"] LT"}}return e.defineLocale("uk",{months:{format:"січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня".split("_"),standalone:"січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень".split("_")},monthsShort:"січ_лют_бер_квіт_трав_черв_лип_серп_вер_жовт_лист_груд".split("_"),weekdays:n,weekdaysShort:"нд_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"нд_пн_вт_ср_чт_пт_сб".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY р.",LLL:"D MMMM YYYY р., HH:mm",LLLL:"dddd, D MMMM YYYY р., HH:mm"},calendar:{sameDay:r("[Сьогодні "),nextDay:r("[Завтра "),lastDay:r("[Вчора "),nextWeek:r("[У] dddd ["),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return r("[Минулої] dddd [").call(this);case 1:case 2:case 4:return r("[Минулого] dddd [").call(this)}},sameElse:"L"},relativeTime:{future:"за %s",past:"%s тому",s:"декілька секунд",ss:t,m:t,mm:t,h:"годину",hh:t,d:"день",dd:t,M:"місяць",MM:t,y:"рік",yy:t},meridiemParse:/ночі|ранку|дня|вечора/,isPM:function(e){return/^(дня|вечора)$/.test(e)},meridiem:function(e,a,t){return e<4?"ночі":e<12?"ранку":e<17?"дня":"вечора"},dayOfMonthOrdinalParse:/\d{1,2}-(й|го)/,ordinal:function(e,a){switch(a){case"M":case"d":case"DDD":case"w":case"W":return e+"-й"
-;case"D":return e+"-го";default:return e}},week:{dow:1,doy:7}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(202);var n=t(1);n.datepickerLocale("vi","vi",{closeText:"Đóng",prevText:"&#x3C;Trước",nextText:"Tiếp&#x3E;",currentText:"Hôm nay",monthNames:["Tháng Một","Tháng Hai","Tháng Ba","Tháng Tư","Tháng Năm","Tháng Sáu","Tháng Bảy","Tháng Tám","Tháng Chín","Tháng Mười","Tháng Mười Một","Tháng Mười Hai"],monthNamesShort:["Tháng 1","Tháng 2","Tháng 3","Tháng 4","Tháng 5","Tháng 6","Tháng 7","Tháng 8","Tháng 9","Tháng 10","Tháng 11","Tháng 12"],dayNames:["Chủ Nhật","Thứ Hai","Thứ Ba","Thứ Tư","Thứ Năm","Thứ Sáu","Thứ Bảy"],dayNamesShort:["CN","T2","T3","T4","T5","T6","T7"],dayNamesMin:["CN","T2","T3","T4","T5","T6","T7"],weekHeader:"Tu",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),n.locale("vi",{buttonText:{month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("vi",{months:"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12".split("_"),monthsShort:"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12".split("_"),monthsParseExact:!0,weekdays:"chủ nhật_thứ hai_thứ ba_thứ tư_thứ năm_thứ sáu_thứ bảy".split("_"),weekdaysShort:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysMin:"CN_T2_T3_T4_T5_T6_T7".split("_"),weekdaysParseExact:!0,meridiemParse:/sa|ch/i,isPM:function(e){return/^ch$/i.test(e)},meridiem:function(e,a,t){return e<12?t?"sa":"SA":t?"ch":"CH"},longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM [năm] YYYY",LLL:"D MMMM [năm] YYYY HH:mm",LLLL:"dddd, D MMMM [năm] YYYY HH:mm",l:"DD/M/YYYY",ll:"D MMM YYYY",lll:"D MMM YYYY HH:mm",llll:"ddd, D MMM YYYY HH:mm"},calendar:{sameDay:"[Hôm nay lúc] LT",nextDay:"[Ngày mai lúc] LT",nextWeek:"dddd [tuần tới lúc] LT",lastDay:"[Hôm qua lúc] LT",lastWeek:"dddd [tuần rồi lúc] LT",sameElse:"L"},relativeTime:{future:"%s tới",past:"%s trước",s:"vài giây",ss:"%d giây",m:"một phút",mm:"%d phút",h:"một giờ",hh:"%d giờ",d:"một ngày",dd:"%d ngày",M:"một tháng",MM:"%d tháng",y:"một năm",yy:"%d năm"},dayOfMonthOrdinalParse:/\d{1,2}/,ordinal:function(e){return e},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(204);var n=t(1);n.datepickerLocale("zh-cn","zh-CN",{closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),n.locale("zh-cn",{buttonText:{month:"月",week:"周",day:"日",list:"日程"},allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上午"===a?e:"下午"===a||"晚上"===a?e+12:e>=11?e:e+12},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上午":n<1230?"中午":n<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}})})},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0}),t(206);var n=t(1);n.datepickerLocale("zh-tw","zh-TW",{closeText:"關閉",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy/mm/dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),n.locale("zh-tw",{buttonText:{month:"月",week:"週",day:"天",list:"活動列表"},allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"})},function(e,a,t){!function(e,a){a(t(0))}(0,function(e){return e.defineLocale("zh-tw",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"週日_週一_週二_週三_週四_週五_週六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日 HH:mm",LLLL:"YYYY年M月D日dddd HH:mm",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,a){return 12===e&&(e=0),"凌晨"===a||"早上"===a||"上午"===a?e:"中午"===a?e>=11?e:e+12:"下午"===a||"晚上"===a?e+12:void 0},meridiem:function(e,a,t){var n=100*e+a;return n<600?"凌晨":n<900?"早上":n<1130?"上午":n<1230?"中午":n<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|週)/,ordinal:function(e,a){switch(a){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"週";default:return e}},relativeTime:{future:"%s內",past:"%s前",s:"幾秒",ss:"%d 秒",m:"1 分鐘",mm:"%d 分鐘",h:"1 小時",hh:"%d 小時",d:"1 天",dd:"%d 天",M:"1 個月",MM:"%d 個月",y:"1 年",yy:"%d 年"}})})},,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,function(e,a,t){t(65),t(67),t(69),t(71),t(73),t(75),t(77),t(79),t(81),t(83),t(85),t(87),t(89),t(91),t(93),t(95),t(97),t(99),t(101),t(103),t(105),t(107),t(109),t(111),t(113),t(115),t(117),t(119),t(121),t(123),t(125),t(127),t(129),t(131),t(133),t(135),t(137),t(139),t(141),t(143),t(145),t(147),t(149),t(151),t(153),t(155),t(157),t(159),t(161),t(163),t(165),t(167),t(169),t(171),t(173),t(175),t(177),t(179),t(181),t(183),t(185),t(187),t(189),t(191),t(193),t(195),t(197),t(199),t(201),t(203),t(205),e.exports=t(435)},function(e,a,t){Object.defineProperty(a,"__esModule",{value:!0});var n=t(0),r=t(1);n.locale("en"),r.locale("en"),window.jQuery.datepicker&&window.jQuery.datepicker.setDefaults(window.jQuery.datepicker.regional[""])}])});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/locale/de.js b/backoffice/vendors/fullcalendar/locale/de.js
deleted file mode 100644 (file)
index 0e42bbf..0000000
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("moment"),require("fullcalendar")):"function"==typeof define&&define.amd?define(["moment","fullcalendar"],t):"object"==typeof exports?t(require("moment"),require("fullcalendar")):t(e.moment,e.FullCalendar)}("undefined"!=typeof self?self:this,function(e,t){return function(e){function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=95)}({0:function(t,n){t.exports=e},1:function(e,n){e.exports=t},95:function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),n(96);var r=n(1);r.datepickerLocale("de","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),r.locale("de",{buttonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"})},96:function(e,t,n){!function(e,t){t(n(0))}(0,function(e){function t(e,t,n,r){var a={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[e+" Tage",e+" Tagen"],M:["ein Monat","einem Monat"],MM:[e+" Monate",e+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[e+" Jahre",e+" Jahren"]};return t?a[n][0]:a[n][1]}return e.defineLocale("de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.".split("_"),monthsParseExact:!0,weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY HH:mm",LLLL:"dddd, D. MMMM YYYY HH:mm"},calendar:{sameDay:"[heute um] LT [Uhr]",sameElse:"L",nextDay:"[morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",ss:"%d Sekunden",m:t,mm:"%d Minuten",h:t,hh:"%d Stunden",d:t,dd:t,M:t,MM:t,y:t,yy:t},dayOfMonthOrdinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}})})}})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/locale/en-gb.js b/backoffice/vendors/fullcalendar/locale/en-gb.js
deleted file mode 100644 (file)
index 1105634..0000000
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("moment"),require("fullcalendar")):"function"==typeof define&&define.amd?define(["moment","fullcalendar"],t):"object"==typeof exports?t(require("moment"),require("fullcalendar")):t(e.moment,e.FullCalendar)}("undefined"!=typeof self?self:this,function(e,t){return function(e){function t(a){if(r[a])return r[a].exports;var n=r[a]={i:a,l:!1,exports:{}};return e[a].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,a){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:a})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=103)}({0:function(t,r){t.exports=e},1:function(e,r){e.exports=t},103:function(e,t,r){Object.defineProperty(t,"__esModule",{value:!0}),r(104);var a=r(1);a.datepickerLocale("en-gb","en-GB",{closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),a.locale("en-gb")},104:function(e,t,r){!function(e,t){t(r(0))}(0,function(e){return e.defineLocale("en-gb",{months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd, D MMMM YYYY HH:mm"},calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},dayOfMonthOrdinalParse:/\d{1,2}(st|nd|rd|th)/,ordinal:function(e){var t=e%10;return e+(1==~~(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")},week:{dow:1,doy:4}})})}})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/locale/fr.js b/backoffice/vendors/fullcalendar/locale/fr.js
deleted file mode 100644 (file)
index 7cb715f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,r){"object"==typeof exports&&"object"==typeof module?module.exports=r(require("moment"),require("fullcalendar")):"function"==typeof define&&define.amd?define(["moment","fullcalendar"],r):"object"==typeof exports?r(require("moment"),require("fullcalendar")):r(e.moment,e.FullCalendar)}("undefined"!=typeof self?self:this,function(e,r){return function(e){function r(t){if(n[t])return n[t].exports;var a=n[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,r),a.l=!0,a.exports}var n={};return r.m=e,r.c=n,r.d=function(e,n,t){r.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:t})},r.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(n,"a",n),n},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=127)}({0:function(r,n){r.exports=e},1:function(e,n){e.exports=r},127:function(e,r,n){Object.defineProperty(r,"__esModule",{value:!0}),n(128);var t=n(1);t.datepickerLocale("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.locale("fr",{buttonText:{year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"})},128:function(e,r,n){!function(e,r){r(n(0))}(0,function(e){return e.defineLocale("fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),monthsParseExact:!0,weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"di_lu_ma_me_je_ve_sa".split("_"),weekdaysParseExact:!0,longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY HH:mm",LLLL:"dddd D MMMM YYYY HH:mm"},calendar:{sameDay:"[Aujourd’hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",ss:"%d secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},dayOfMonthOrdinalParse:/\d{1,2}(er|)/,ordinal:function(e,r){switch(r){case"D":return e+(1===e?"er":"");default:case"M":case"Q":case"DDD":case"d":return e+(1===e?"er":"e");case"w":case"W":return e+(1===e?"re":"e")}},week:{dow:1,doy:4}})})}})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/luxon/LICENSE.txt b/backoffice/vendors/fullcalendar/luxon/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/luxon/README.md b/backoffice/vendors/fullcalendar/luxon/README.md
new file mode 100644 (file)
index 0000000..4c42b50
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Luxon Plugin
+
+A connector to the Luxon date library
+
+[View the docs &raquo;](https://fullcalendar.io/docs/luxon-plugin)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/luxon/main.d.ts b/backoffice/vendors/fullcalendar/luxon/main.d.ts
new file mode 100644 (file)
index 0000000..5fc8022
--- /dev/null
@@ -0,0 +1,8 @@
+declare module "@fullcalendar/luxon" {
+    import { DateTime as LuxonDateTime, Duration as LuxonDuration } from "luxon";
+    import { Calendar, Duration } from "@fullcalendar/core";
+    export function toDateTime(date: Date, calendar: Calendar): LuxonDateTime;
+    export function toDuration(duration: Duration, calendar: Calendar): LuxonDuration;
+    const _default_10: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_10;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/luxon/main.js b/backoffice/vendors/fullcalendar/luxon/main.js
new file mode 100644 (file)
index 0000000..e66dde3
--- /dev/null
@@ -0,0 +1,162 @@
+/*!
+FullCalendar Luxon Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('luxon'), require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', 'luxon', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarLuxon = {}, global.luxon, global.FullCalendar));
+}(this, function (exports, luxon, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    function toDateTime(date, calendar) {
+        if (!(calendar instanceof core.Calendar)) {
+            throw new Error('must supply a Calendar instance');
+        }
+        return luxon.DateTime.fromJSDate(date, {
+            zone: calendar.dateEnv.timeZone,
+            locale: calendar.dateEnv.locale.codes[0]
+        });
+    }
+    function toDuration(duration, calendar) {
+        if (!(calendar instanceof core.Calendar)) {
+            throw new Error('must supply a Calendar instance');
+        }
+        return luxon.Duration.fromObject(__assign({}, duration, { locale: calendar.dateEnv.locale.codes[0] }));
+    }
+    var LuxonNamedTimeZone = /** @class */ (function (_super) {
+        __extends(LuxonNamedTimeZone, _super);
+        function LuxonNamedTimeZone() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        LuxonNamedTimeZone.prototype.offsetForArray = function (a) {
+            return arrayToLuxon(a, this.timeZoneName).offset;
+        };
+        LuxonNamedTimeZone.prototype.timestampToArray = function (ms) {
+            return luxonToArray(luxon.DateTime.fromMillis(ms, {
+                zone: this.timeZoneName
+            }));
+        };
+        return LuxonNamedTimeZone;
+    }(core.NamedTimeZoneImpl));
+    function formatWithCmdStr(cmdStr, arg) {
+        var cmd = parseCmdStr(cmdStr);
+        if (arg.end) {
+            var start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
+            var end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
+            return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.separator);
+        }
+        return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
+    }
+    var main = core.createPlugin({
+        cmdFormatter: formatWithCmdStr,
+        namedTimeZonedImpl: LuxonNamedTimeZone
+    });
+    function luxonToArray(datetime) {
+        return [
+            datetime.year,
+            datetime.month - 1,
+            datetime.day,
+            datetime.hour,
+            datetime.minute,
+            datetime.second,
+            datetime.millisecond
+        ];
+    }
+    function arrayToLuxon(arr, timeZone, locale) {
+        return luxon.DateTime.fromObject({
+            zone: timeZone,
+            locale: locale,
+            year: arr[0],
+            month: arr[1] + 1,
+            day: arr[2],
+            hour: arr[3],
+            minute: arr[4],
+            second: arr[5],
+            millisecond: arr[6]
+        });
+    }
+    function parseCmdStr(cmdStr) {
+        var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
+        if (parts) {
+            var middle = parseCmdStr(parts[2]);
+            return {
+                head: parts[1],
+                middle: middle,
+                tail: parts[3],
+                whole: parts[1] + middle.whole + parts[3]
+            };
+        }
+        else {
+            return {
+                head: null,
+                middle: null,
+                tail: null,
+                whole: cmdStr
+            };
+        }
+    }
+    function formatRange(cmd, formatStart, formatEnd, separator) {
+        if (cmd.middle) {
+            var startHead = formatStart(cmd.head);
+            var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+            var startTail = formatStart(cmd.tail);
+            var endHead = formatEnd(cmd.head);
+            var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+            var endTail = formatEnd(cmd.tail);
+            if (startHead === endHead && startTail === endTail) {
+                return startHead +
+                    (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
+                    startTail;
+            }
+        }
+        return formatStart(cmd.whole) + separator + formatEnd(cmd.whole);
+    }
+
+    exports.default = main;
+    exports.toDateTime = toDateTime;
+    exports.toDuration = toDuration;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/luxon/main.min.js b/backoffice/vendors/fullcalendar/luxon/main.min.js
new file mode 100644 (file)
index 0000000..7c960ce
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Luxon Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("luxon"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","luxon","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarLuxon={},e.luxon,e.FullCalendar))}(this,function(e,t,n){"use strict";function o(e,t){function n(){this.constructor=e}f(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}function r(e,o){if(!(o instanceof n.Calendar))throw new Error("must supply a Calendar instance");return t.DateTime.fromJSDate(e,{zone:o.dateEnv.timeZone,locale:o.dateEnv.locale.codes[0]})}function a(e,o){if(!(o instanceof n.Calendar))throw new Error("must supply a Calendar instance");return t.Duration.fromObject(m({},e,{locale:o.dateEnv.locale.codes[0]}))}function i(e,t){var n=c(e);if(t.end){var o=u(t.start.array,t.timeZone,t.localeCodes[0]),r=u(t.end.array,t.timeZone,t.localeCodes[0]);return d(n,o.toFormat.bind(o),r.toFormat.bind(r),t.separator)}return u(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)}function l(e){return[e.year,e.month-1,e.day,e.hour,e.minute,e.second,e.millisecond]}function u(e,n,o){return t.DateTime.fromObject({zone:n,locale:o,year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]})}function c(e){var t=e.match(/^(.*?)\{(.*)\}(.*)$/);if(t){var n=c(t[2]);return{head:t[1],middle:n,tail:t[3],whole:t[1]+n.whole+t[3]}}return{head:null,middle:null,tail:null,whole:e}}function d(e,t,n,o){if(e.middle){var r=t(e.head),a=d(e.middle,t,n,o),i=t(e.tail),l=n(e.head),u=d(e.middle,t,n,o),c=n(e.tail);if(r===l&&i===c)return r+(a===u?a:a+o+u)+i}return t(e.whole)+o+n(e.whole)}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var f=function(e,t){return(f=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},m=function(){return m=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++){t=arguments[n];for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},m.apply(this,arguments)},s=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return o(n,e),n.prototype.offsetForArray=function(e){return u(e,this.timeZoneName).offset},n.prototype.timestampToArray=function(e){return l(t.DateTime.fromMillis(e,{zone:this.timeZoneName}))},n}(n.NamedTimeZoneImpl),p=n.createPlugin({cmdFormatter:i,namedTimeZonedImpl:s});e.default=p,e.toDateTime=r,e.toDuration=a,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/luxon/package.json b/backoffice/vendors/fullcalendar/luxon/package.json
new file mode 100644 (file)
index 0000000..93a8997
--- /dev/null
@@ -0,0 +1,63 @@
+{
+  "_from": "@fullcalendar/luxon@^4.1.0",
+  "_id": "@fullcalendar/luxon@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-z/GBThh16+i4/L+0bzqhY695tyJygeFE/0xyd1Q8WgQfISNwCoBfUB4vRIzkk1AzraCkm/s696yLRieG+bV5Fw==",
+  "_location": "/@fullcalendar/luxon",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@fullcalendar/luxon@^4.1.0",
+    "name": "@fullcalendar/luxon",
+    "escapedName": "@fullcalendar%2fluxon",
+    "scope": "@fullcalendar",
+    "rawSpec": "^4.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^4.1.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/luxon/-/luxon-4.1.0.tgz",
+  "_shasum": "b71e0f7138de59182869563b28cd1bbb2ad1f9dc",
+  "_spec": "@fullcalendar/luxon@^4.1.0",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "A connector to the Luxon date library",
+  "docs": "https://fullcalendar.io/docs/luxon-plugin",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/luxon",
+  "peerDependencies": {
+    "luxon": "^1.12.1",
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Luxon Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/moment-timezone/LICENSE.txt b/backoffice/vendors/fullcalendar/moment-timezone/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/moment-timezone/README.md b/backoffice/vendors/fullcalendar/moment-timezone/README.md
new file mode 100644 (file)
index 0000000..e84412a
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Moment Timezone Plugin
+
+A connector to the moment-timezone library
+
+[View the docs &raquo;](https://fullcalendar.io/docs/moment-plugins#moment-timezone)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/moment-timezone/main.d.ts b/backoffice/vendors/fullcalendar/moment-timezone/main.d.ts
new file mode 100644 (file)
index 0000000..ebfc5c2
--- /dev/null
@@ -0,0 +1,5 @@
+declare module "@fullcalendar/moment-timezone" {
+    import "@fullcalendar/moment-timezone/builds/moment-timezone-with-data";
+    const _default_12: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_12;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/moment-timezone/main.js b/backoffice/vendors/fullcalendar/moment-timezone/main.js
new file mode 100644 (file)
index 0000000..460063a
--- /dev/null
@@ -0,0 +1,64 @@
+/*!
+FullCalendar Moment Timezone Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('moment-timezone/builds/moment-timezone-with-data'), require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', 'moment', 'moment-timezone/builds/moment-timezone-with-data', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarMomentTimezone = {}, global.moment, global.moment, global.FullCalendar));
+}(this, function (exports, moment, momentTimezoneWithData, core) { 'use strict';
+
+    moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var MomentNamedTimeZone = /** @class */ (function (_super) {
+        __extends(MomentNamedTimeZone, _super);
+        function MomentNamedTimeZone() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        MomentNamedTimeZone.prototype.offsetForArray = function (a) {
+            return moment.tz(a, this.timeZoneName).utcOffset();
+        };
+        MomentNamedTimeZone.prototype.timestampToArray = function (ms) {
+            return moment.tz(ms, this.timeZoneName).toArray();
+        };
+        return MomentNamedTimeZone;
+    }(core.NamedTimeZoneImpl));
+    var main = core.createPlugin({
+        namedTimeZonedImpl: MomentNamedTimeZone
+    });
+
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/moment-timezone/main.min.js b/backoffice/vendors/fullcalendar/moment-timezone/main.min.js
new file mode 100644 (file)
index 0000000..96d742e
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Moment Timezone Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("moment-timezone/builds/moment-timezone-with-data"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","moment-timezone/builds/moment-timezone-with-data","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarMomentTimezone={},e.moment,e.moment,e.FullCalendar))}(this,function(e,t,n,o){"use strict";function r(e,t){function n(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}t=t&&t.hasOwnProperty("default")?t.default:t;/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},u=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return r(n,e),n.prototype.offsetForArray=function(e){return t.tz(e,this.timeZoneName).utcOffset()},n.prototype.timestampToArray=function(e){return t.tz(e,this.timeZoneName).toArray()},n}(o.NamedTimeZoneImpl),m=o.createPlugin({namedTimeZonedImpl:u});e.default=m,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/moment-timezone/package.json b/backoffice/vendors/fullcalendar/moment-timezone/package.json
new file mode 100644 (file)
index 0000000..8e4758b
--- /dev/null
@@ -0,0 +1,64 @@
+{
+  "_from": "@fullcalendar/moment-timezone@^4.1.0",
+  "_id": "@fullcalendar/moment-timezone@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-eGzR0xZhC2q2wiXCxopupeK6/u3z7a6kBBwdeAY+EJMlDV53FJHwXli1f4Y7WO+Z6wAiRWIia/RtSabWl7o/7A==",
+  "_location": "/@fullcalendar/moment-timezone",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@fullcalendar/moment-timezone@^4.1.0",
+    "name": "@fullcalendar/moment-timezone",
+    "escapedName": "@fullcalendar%2fmoment-timezone",
+    "scope": "@fullcalendar",
+    "rawSpec": "^4.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^4.1.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/moment-timezone/-/moment-timezone-4.1.0.tgz",
+  "_shasum": "dd3637583bfcc64fb2daa76d5723205b2353131c",
+  "_spec": "@fullcalendar/moment-timezone@^4.1.0",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "A connector to the moment-timezone library",
+  "docs": "https://fullcalendar.io/docs/moment-plugins#moment-timezone",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/moment-timezone",
+  "peerDependencies": {
+    "moment": "^2.24.0",
+    "moment-timezone": "^0.5.25",
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Moment Timezone Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/moment/LICENSE.txt b/backoffice/vendors/fullcalendar/moment/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/moment/README.md b/backoffice/vendors/fullcalendar/moment/README.md
new file mode 100644 (file)
index 0000000..854e436
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Moment Plugin
+
+A connector to the MomentJS date library
+
+[View the docs &raquo;](https://fullcalendar.io/docs/moment-plugins)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/moment/main.d.ts b/backoffice/vendors/fullcalendar/moment/main.d.ts
new file mode 100644 (file)
index 0000000..658cf61
--- /dev/null
@@ -0,0 +1,8 @@
+declare module "@fullcalendar/moment" {
+    import moment from "moment";
+    import { Calendar, Duration } from "@fullcalendar/core";
+    export function toMoment(date: Date, calendar: Calendar): moment.Moment;
+    export function toDuration(fcDuration: Duration): moment.Duration;
+    const _default_11: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_11;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/moment/main.js b/backoffice/vendors/fullcalendar/moment/main.js
new file mode 100644 (file)
index 0000000..0245943
--- /dev/null
@@ -0,0 +1,103 @@
+/*!
+FullCalendar Moment Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', 'moment', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarMoment = {}, global.moment, global.FullCalendar));
+}(this, function (exports, moment, core) { 'use strict';
+
+    moment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;
+
+    function toMoment(date, calendar) {
+        if (!(calendar instanceof core.Calendar)) {
+            throw new Error('must supply a Calendar instance');
+        }
+        return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
+    }
+    function toDuration(fcDuration) {
+        return moment.duration(fcDuration); // momment accepts all the props that fc.Duration already has!
+    }
+    function formatWithCmdStr(cmdStr, arg) {
+        var cmd = parseCmdStr(cmdStr);
+        if (arg.end) {
+            var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
+            var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
+            return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
+        }
+        return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
+    }
+    var main = core.createPlugin({
+        cmdFormatter: formatWithCmdStr
+    });
+    function createMomentFormatFunc(mom) {
+        return function (cmdStr) {
+            return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
+        };
+    }
+    function convertToMoment(input, timeZone, timeZoneOffset, locale) {
+        var mom;
+        if (timeZone === 'local') {
+            mom = moment(input);
+        }
+        else if (timeZone === 'UTC') {
+            mom = moment.utc(input);
+        }
+        else if (moment.tz) {
+            mom = moment.tz(input, timeZone);
+        }
+        else {
+            mom = moment.utc(input);
+            if (timeZoneOffset != null) {
+                mom.utcOffset(timeZoneOffset);
+            }
+        }
+        mom.locale(locale);
+        return mom;
+    }
+    function parseCmdStr(cmdStr) {
+        var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
+        if (parts) {
+            var middle = parseCmdStr(parts[2]);
+            return {
+                head: parts[1],
+                middle: middle,
+                tail: parts[3],
+                whole: parts[1] + middle.whole + parts[3]
+            };
+        }
+        else {
+            return {
+                head: null,
+                middle: null,
+                tail: null,
+                whole: cmdStr
+            };
+        }
+    }
+    function formatRange(cmd, formatStart, formatEnd, separator) {
+        if (cmd.middle) {
+            var startHead = formatStart(cmd.head);
+            var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+            var startTail = formatStart(cmd.tail);
+            var endHead = formatEnd(cmd.head);
+            var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
+            var endTail = formatEnd(cmd.tail);
+            if (startHead === endHead && startTail === endTail) {
+                return startHead +
+                    (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
+                    startTail;
+            }
+        }
+        return formatStart(cmd.whole) + separator + formatEnd(cmd.whole);
+    }
+
+    exports.default = main;
+    exports.toDuration = toDuration;
+    exports.toMoment = toMoment;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/moment/main.min.js b/backoffice/vendors/fullcalendar/moment/main.min.js
new file mode 100644 (file)
index 0000000..fe78d9f
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Moment Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarMoment={},e.moment,e.FullCalendar))}(this,function(e,t,n){"use strict";function r(e,t){if(!(t instanceof n.Calendar))throw new Error("must supply a Calendar instance");return u(e,t.dateEnv.timeZone,null,t.dateEnv.locale.codes[0])}function a(e){return t.duration(e)}function o(e,t){var n=i(e);if(t.end){var r=u(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),a=u(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return d(n,l(r),l(a),t.separator)}return u(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(n.whole)}function l(e){return function(t){return t?e.format(t):""}}function u(e,n,r,a){var o;return"local"===n?o=t(e):"UTC"===n?o=t.utc(e):t.tz?o=t.tz(e,n):(o=t.utc(e),null!=r&&o.utcOffset(r)),o.locale(a),o}function i(e){var t=e.match(/^(.*?)\{(.*)\}(.*)$/);if(t){var n=i(t[2]);return{head:t[1],middle:n,tail:t[3],whole:t[1]+n.whole+t[3]}}return{head:null,middle:null,tail:null,whole:e}}function d(e,t,n,r){if(e.middle){var a=t(e.head),o=d(e.middle,t,n,r),l=t(e.tail),u=n(e.head),i=d(e.middle,t,n,r),f=n(e.tail);if(a===u&&l===f)return a+(o===i?o:o+r+i)+l}return t(e.whole)+r+n(e.whole)}t=t&&t.hasOwnProperty("default")?t.default:t;var f=n.createPlugin({cmdFormatter:o});e.default=f,e.toDuration=a,e.toMoment=r,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/moment/package.json b/backoffice/vendors/fullcalendar/moment/package.json
new file mode 100644 (file)
index 0000000..db67dbe
--- /dev/null
@@ -0,0 +1,63 @@
+{
+  "_from": "@fullcalendar/moment@^4.1.0",
+  "_id": "@fullcalendar/moment@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-gaGT3X+o3HjIQb/evAtgVvIAa2m43dxI4p5tY3XHdBMSthsJ49Q0+L7S+KUK/btE6SMm/6NC6xlDb/zTyEDVCw==",
+  "_location": "/@fullcalendar/moment",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@fullcalendar/moment@^4.1.0",
+    "name": "@fullcalendar/moment",
+    "escapedName": "@fullcalendar%2fmoment",
+    "scope": "@fullcalendar",
+    "rawSpec": "^4.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^4.1.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/moment/-/moment-4.1.0.tgz",
+  "_shasum": "12fafb189524a822587a947d67cb459fbdce181a",
+  "_spec": "@fullcalendar/moment@^4.1.0",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "A connector to the MomentJS date library",
+  "docs": "https://fullcalendar.io/docs/moment-plugins",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/moment",
+  "peerDependencies": {
+    "moment": "^2.24.0",
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Moment Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/resource-common/LICENSE.md b/backoffice/vendors/fullcalendar/resource-common/LICENSE.md
new file mode 100644 (file)
index 0000000..5229663
--- /dev/null
@@ -0,0 +1,18 @@
+
+For complete licensing information, visit:
+http://fullcalendar.io/scheduler/license
+
+FullCalendar Scheduler is tri-licensed, meaning you must choose
+one of three licenses to use. Here is a summary of those licenses:
+
+- Commercial License
+  (a paid license, meant for commercial use)
+  http://fullcalendar.io/scheduler/license-details
+
+- Creative Commons Non-Commercial No-Derivatives
+  (meant for trial and non-commercial use)
+  https://creativecommons.org/licenses/by-nc-nd/4.0/
+
+- GPLv3 License
+  (meant for open-source projects)
+  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/backoffice/vendors/fullcalendar/resource-common/README.md b/backoffice/vendors/fullcalendar/resource-common/README.md
new file mode 100644 (file)
index 0000000..ddc4db0
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Resources Common Plugin
+
+Offers base support for resources. Required for all resource-related plugins.
+
+[View the docs &raquo;](https://fullcalendar.io/docs/scheduler)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/backoffice/vendors/fullcalendar/resource-common/main.d.ts b/backoffice/vendors/fullcalendar/resource-common/main.d.ts
new file mode 100644 (file)
index 0000000..50bb92f
--- /dev/null
@@ -0,0 +1,566 @@
+declare module "@fullcalendar/resource-common/structs/resource" {
+    import { ConstraintInput, AllowFunc, EventStore, Calendar, EventUi, BusinessHoursInput } from "@fullcalendar/core";
+    export interface ResourceInput {
+        id?: string;
+        parentId?: string;
+        children?: ResourceInput[];
+        title?: string;
+        businessHours?: BusinessHoursInput;
+        eventEditable?: boolean;
+        eventStartEditable?: boolean;
+        eventDurationEditable?: boolean;
+        eventConstraint?: ConstraintInput;
+        eventOverlap?: boolean;
+        eventAllow?: AllowFunc;
+        eventClassName?: string[] | string;
+        eventClassNames?: string[] | string;
+        eventBackgroundColor?: string;
+        eventBorderColor?: string;
+        eventTextColor?: string;
+        eventColor?: string;
+        extendedProps?: {
+            [extendedProp: string]: any;
+        };
+        [otherProp: string]: any;
+    }
+    export interface Resource {
+        id: string;
+        parentId: string;
+        title: string;
+        businessHours: EventStore | null;
+        ui: EventUi;
+        extendedProps: {
+            [extendedProp: string]: any;
+        };
+    }
+    export type ResourceHash = {
+        [resourceId: string]: Resource;
+    };
+    export function parseResource(input: ResourceInput, parentId: string, store: ResourceHash, calendar: Calendar): Resource;
+    export function getPublicId(id: string): string;
+}
+
+declare module "@fullcalendar/resource-common/resource-sources/resource-func" {
+    import { ResourceSourceError } from "@fullcalendar/resource-common/structs/resource-source";
+    import { ResourceInput } from "@fullcalendar/resource-common/structs/resource";
+    export type ResourceFunc = (arg: {
+        start: Date;
+        end: Date;
+        timeZone: string;
+    }, successCallback: (events: ResourceInput[]) => void, failureCallback: (errorObj: ResourceSourceError) => void) => any;
+}
+
+declare module "@fullcalendar/resource-common/structs/resource-source" {
+    import { DateRange, Calendar } from "@fullcalendar/core";
+    import { ResourceInput } from "@fullcalendar/resource-common/structs/resource";
+    import { ResourceFunc } from "@fullcalendar/resource-common/resource-sources/resource-func";
+    export type ResourceSourceError = {
+        message: string;
+        xhr?: XMLHttpRequest;
+        [otherProp: string]: any;
+    };
+    export type ResourceFetcher = (arg: {
+        resourceSource: ResourceSource;
+        calendar: Calendar;
+        range: DateRange | null;
+    }, success: (res: {
+        rawResources: ResourceInput[];
+        xhr?: XMLHttpRequest;
+    }) => void, failure: (error: ResourceSourceError) => void) => void;
+    export interface ExtendedResourceSourceInput {
+        id?: string;
+        resources?: ResourceInput[];
+        url?: string;
+        method?: string;
+        extraParams?: object | (() => object);
+    }
+    export type ResourceSourceInput = ResourceInput[] | ExtendedResourceSourceInput | ResourceFunc | string;
+    export interface ResourceSource {
+        _raw: any;
+        sourceId: string;
+        sourceDefId: number;
+        meta: any;
+        publicId: string;
+        isFetching: boolean;
+        latestFetchId: string;
+        fetchRange: DateRange | null;
+    }
+    export interface ResourceSourceDef {
+        ignoreRange?: boolean;
+        parseMeta: (raw: ResourceSourceInput) => object | null;
+        fetch: ResourceFetcher;
+    }
+    export function registerResourceSourceDef(def: ResourceSourceDef): void;
+    export function getResourceSourceDef(id: number): ResourceSourceDef;
+    export function doesSourceIgnoreRange(source: ResourceSource): boolean;
+    export function parseResourceSource(input: ResourceSourceInput): ResourceSource;
+}
+
+declare module "@fullcalendar/resource-common/reducers/resourceSource" {
+    import { Calendar, DateProfile } from "@fullcalendar/core";
+    import { ResourceSource } from "@fullcalendar/resource-common/structs/resource-source";
+    import { ResourceAction } from "@fullcalendar/resource-common/reducers/resources";
+    export default function (source: ResourceSource | undefined, action: ResourceAction, dateProfile: DateProfile, calendar: Calendar): ResourceSource | null;
+}
+
+declare module "@fullcalendar/resource-common/reducers/resourceStore" {
+    import { Calendar } from "@fullcalendar/core";
+    import { ResourceAction } from "@fullcalendar/resource-common/reducers/resources";
+    import { ResourceHash } from "@fullcalendar/resource-common/structs/resource";
+    import { ResourceSource } from "@fullcalendar/resource-common/structs/resource-source";
+    export default function (store: ResourceHash | undefined, action: ResourceAction, source: ResourceSource, calendar: Calendar): ResourceHash;
+}
+
+declare module "@fullcalendar/resource-common/reducers/resources" {
+    import { Calendar, CalendarState, Action, DateRange } from "@fullcalendar/core";
+    import { ResourceSource, ResourceSourceError } from "@fullcalendar/resource-common/structs/resource-source";
+    import { ResourceHash, ResourceInput } from "@fullcalendar/resource-common/structs/resource";
+    import { ResourceEntityExpansions } from "@fullcalendar/resource-common/reducers/resourceEntityExpansions";
+    module '@fullcalendar/core' {
+        interface CalendarState {
+            resourceSource?: ResourceSource | null;
+            resourceStore?: ResourceHash;
+            resourceEntityExpansions?: ResourceEntityExpansions;
+        }
+    }
+    module '@fullcalendar/core' {
+        interface Calendar {
+            dispatch(action: ResourceAction): any;
+        }
+    }
+    export type ResourceAction = Action | {
+        type: 'FETCH_RESOURCE';
+    } | {
+        type: 'RECEIVE_RESOURCES';
+        rawResources: ResourceInput[];
+        fetchId: string;
+        fetchRange: DateRange | null;
+    } | {
+        type: 'RECEIVE_RESOURCE_ERROR';
+        error: ResourceSourceError;
+        fetchId: string;
+        fetchRange: DateRange | null;
+    } | {
+        type: 'ADD_RESOURCE';
+        resourceHash: ResourceHash;
+    } | // use a hash because needs to accept children
+    {
+        type: 'REMOVE_RESOURCE';
+        resourceId: string;
+    } | {
+        type: 'SET_RESOURCE_PROP';
+        resourceId: string;
+        propName: string;
+        propValue: any;
+    } | {
+        type: 'SET_RESOURCE_ENTITY_EXPANDED';
+        id: string;
+        isExpanded: boolean;
+    } | {
+        type: 'RESET_RESOURCES';
+    } | {
+        type: 'RESET_RESOURCE_SOURCE';
+        resourceSourceInput: any;
+    } | {
+        type: 'REFETCH_RESOURCES';
+    };
+    export default function (state: CalendarState, action: ResourceAction, calendar: Calendar): {
+        resourceSource: ResourceSource;
+        resourceStore: ResourceHash;
+        resourceEntityExpansions: ResourceEntityExpansions;
+        eventSources: import("@fullcalendar/core").EventSourceHash;
+        eventSourceLoadingLevel: number;
+        loadingLevel: number;
+        viewType: string;
+        currentDate: Date;
+        dateProfile: import("@fullcalendar/core").DateProfile;
+        eventStore: import("@fullcalendar/core").EventStore;
+        dateSelection: import("@fullcalendar/core").DateSpan;
+        eventSelection: string;
+        eventDrag: import("@fullcalendar/core").EventInteractionState;
+        eventResize: import("@fullcalendar/core").EventInteractionState;
+    };
+}
+
+declare module "@fullcalendar/resource-common/reducers/resourceEntityExpansions" {
+    import { ResourceAction } from "@fullcalendar/resource-common/reducers/resources";
+    export type ResourceEntityExpansions = {
+        [id: string]: boolean;
+    };
+    export function reduceResourceEntityExpansions(expansions: ResourceEntityExpansions, action: ResourceAction): ResourceEntityExpansions;
+}
+
+declare module "@fullcalendar/resource-common/View" {
+    import { View, ViewProps, ViewSpec, ViewPropsTransformer, CalendarComponentProps, EventUi, EventUiHash, EventDefHash, EventStore, DateRange } from "@fullcalendar/core";
+    import { ResourceHash } from "@fullcalendar/resource-common/structs/resource";
+    import { ResourceEntityExpansions } from "@fullcalendar/resource-common/reducers/resourceEntityExpansions";
+    export interface ResourceViewProps extends ViewProps {
+        resourceStore: ResourceHash;
+        resourceEntityExpansions: ResourceEntityExpansions;
+    }
+    export class ResourceDataAdder implements ViewPropsTransformer {
+        filterResources: typeof filterResources;
+        transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, view: View): {
+            resourceStore: ResourceHash;
+            resourceEntityExpansions: ResourceEntityExpansions;
+        };
+    }
+    function filterResources(resourceStore: ResourceHash, doFilterResourcesWithEvents: boolean, eventStore: EventStore, activeRange: DateRange): ResourceHash;
+    export class ResourceEventConfigAdder implements ViewPropsTransformer {
+        buildResourceEventUis: typeof buildResourceEventUis;
+        injectResourceEventUis: typeof injectResourceEventUis;
+        transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps): {
+            eventUiBases: {
+                [key: string]: EventUi;
+            };
+        };
+    }
+    function buildResourceEventUis(resourceStore: ResourceHash): {
+        [key: string]: EventUi;
+    };
+    function injectResourceEventUis(eventUiBases: EventUiHash, eventDefs: EventDefHash, resourceEventUis: EventUiHash): {
+        [key: string]: EventUi;
+    };
+}
+
+declare module "@fullcalendar/resource-common/structs/event" {
+    import { EventDef } from "@fullcalendar/core";
+    module '@fullcalendar/core' {
+        interface EventDef {
+            resourceIds: string[];
+            resourceEditable: boolean;
+        }
+    }
+    export function parseEventDef(def: EventDef, props: any, leftovers: any): void;
+}
+
+declare module "@fullcalendar/resource-common/EventDragging" {
+    import { EventMutation, Hit, EventDef, Calendar } from "@fullcalendar/core";
+    module '@fullcalendar/core' {
+        interface EventMutation {
+            resourceMutation?: {
+                matchResourceId: string;
+                setResourceId: string;
+            };
+        }
+    }
+    export function massageEventDragMutation(eventMutation: EventMutation, hit0: Hit, hit1: Hit): void;
+    export function applyEventDefMutation(eventDef: EventDef, mutation: EventMutation, calendar: Calendar): void;
+    export function computeResourceEditable(eventDef: EventDef, calendar: Calendar): boolean;
+    export function transformEventDrop(mutation: EventMutation, calendar: Calendar): {
+        oldResource: import("@fullcalendar/resource-common").ResourceApi;
+        newResource: import("@fullcalendar/resource-common").ResourceApi;
+    };
+}
+
+declare module "@fullcalendar/resource-common/DateSelecting" {
+    import { Hit } from "@fullcalendar/core";
+    export function transformDateSelectionJoin(hit0: Hit, hit1: Hit): false | {
+        resourceId: any;
+    };
+}
+
+declare module "@fullcalendar/resource-common/api/ResourceApi" {
+    import { Calendar, EventApi } from "@fullcalendar/core";
+    import { Resource } from "@fullcalendar/resource-common/structs/resource";
+    export { ResourceApi as default, ResourceApi };
+    class ResourceApi {
+        _calendar: Calendar;
+        _resource: Resource;
+        constructor(calendar: Calendar, rawResource: Resource);
+        setProp(name: string, value: any): void;
+        remove(): void;
+        getParent(): ResourceApi | null;
+        getChildren(): ResourceApi[];
+        getEvents(): EventApi[];
+        readonly id: string;
+        readonly title: string;
+        readonly eventConstraint: any;
+        readonly eventOverlap: any;
+        readonly eventAllow: any;
+        readonly eventBackgroundColor: string;
+        readonly eventBorderColor: string;
+        readonly eventTextColor: string;
+        readonly eventClassNames: string[];
+        readonly extendedProps: any;
+    }
+}
+
+declare module "@fullcalendar/resource-common/Calendar" {
+    import { DateSpan, Calendar } from "@fullcalendar/core";
+    import ResourceApi from "@fullcalendar/resource-common/api/ResourceApi";
+    import { ResourceInput } from "@fullcalendar/resource-common/structs/resource";
+    import { ResourceSourceInput } from "@fullcalendar/resource-common/structs/resource-source";
+    module '@fullcalendar/core' {
+        interface DatePointApi {
+            resource?: ResourceApi;
+        }
+        interface DateSpanApi {
+            resource?: ResourceApi;
+        }
+        interface Calendar {
+            addResource(input: ResourceInput): ResourceApi;
+            getResourceById(id: string): ResourceApi | null;
+            getResources(): ResourceApi[];
+            getTopLevelResources(): ResourceApi[];
+            rerenderResources(): void;
+            refetchResources(): void;
+        }
+        interface OptionsInput {
+            schedulerLicenseKey?: string;
+            resources?: ResourceSourceInput;
+            resourceLabelText?: string;
+            resourceOrder?: any;
+            filterResourcesWithEvents?: any;
+            resourceText?: any;
+            resourceGroupField?: any;
+            resourceGroupText?: any;
+            resourceAreaWidth?: any;
+            resourceColumns?: any;
+            resourcesInitiallyExpanded?: any;
+            slotWidth?: any;
+            datesAboveResources?: any;
+            resourceRender?: any;
+        }
+    }
+    export function transformDatePoint(dateSpan: DateSpan, calendar: Calendar): {
+        resource: ResourceApi;
+    } | {
+        resource?: undefined;
+    };
+    export function transformDateSpan(dateSpan: DateSpan, calendar: Calendar): {
+        resource: ResourceApi;
+    } | {
+        resource?: undefined;
+    };
+}
+
+declare module "@fullcalendar/resource-common/common/ResourceSplitter" {
+    import { Splitter, SplittableProps, DateSpan, EventDef } from "@fullcalendar/core";
+    import { ResourceHash } from "@fullcalendar/resource-common/structs/resource";
+    export interface SplittableResourceProps extends SplittableProps {
+        resourceStore: ResourceHash;
+    }
+    export { ResourceSplitter as default, ResourceSplitter };
+    class ResourceSplitter extends Splitter<SplittableResourceProps> {
+        getKeyInfo(props: SplittableResourceProps): {
+            '': {};
+        };
+        getKeysForDateSpan(dateSpan: DateSpan): string[];
+        getKeysForEventDef(eventDef: EventDef): string[];
+    }
+}
+
+declare module "@fullcalendar/resource-common/validation" {
+    import { SplittableProps, Calendar } from "@fullcalendar/core";
+    export function isPropsValidWithResources(props: SplittableProps, calendar: Calendar): boolean;
+}
+
+declare module "@fullcalendar/resource-common/ExternalElementDragging" {
+    import { DateSpan } from "@fullcalendar/core";
+    export function transformExternalDef(dateSpan: DateSpan): {
+        resourceId: any;
+    } | {
+        resourceId?: undefined;
+    };
+}
+
+declare module "@fullcalendar/resource-common/EventResizing" {
+    import { Hit } from "@fullcalendar/core";
+    export function transformEventResizeJoin(hit0: Hit, hit1: Hit): false | object;
+}
+
+declare module "@fullcalendar/resource-common/api/EventApi" {
+    import ResourceApi from "@fullcalendar/resource-common/api/ResourceApi";
+    module '@fullcalendar/core' {
+        interface EventApi {
+            getResources: () => ResourceApi[];
+            setResources: (resources: (string | ResourceApi)[]) => void;
+        }
+    }
+}
+
+declare module "@fullcalendar/resource-common/license" {
+    import { Calendar } from "@fullcalendar/core";
+    export function injectLicenseWarning(containerEl: HTMLElement, calendar: Calendar): void;
+}
+
+declare module "@fullcalendar/resource-common/option-change-handlers" {
+    import { Calendar } from "@fullcalendar/core";
+    const _default: {
+        resources: typeof handleResources;
+    };
+    export default _default;
+    function handleResources(newSourceInput: any, calendar: Calendar): void;
+}
+
+declare module "@fullcalendar/resource-common/resource-sources/resource-array" { }
+
+declare module "@fullcalendar/resource-common/resource-sources/resource-json-feed" { }
+
+declare module "@fullcalendar/resource-common/common/resource-rendering" {
+    import { Resource } from "@fullcalendar/resource-common/structs/resource";
+    export function buildResourceTextFunc(resourceTextSetting: any, calendar: any): (resource: Resource) => any;
+}
+
+declare module "@fullcalendar/resource-common/common/ResourceDayHeader" {
+    import { Component, ComponentContext, DateMarker, DateProfile, DateFormatter } from "@fullcalendar/core";
+    import { Resource } from "@fullcalendar/resource-common/structs/resource";
+    export interface ResourceDayHeaderProps {
+        dates: DateMarker[];
+        dateProfile: DateProfile;
+        datesRepDistinctDays: boolean;
+        resources: Resource[];
+        renderIntroHtml?: () => string;
+    }
+    export { ResourceDayHeader as default, ResourceDayHeader };
+    class ResourceDayHeader extends Component<ResourceDayHeaderProps> {
+        datesAboveResources: boolean;
+        resourceTextFunc: (resource: Resource) => string;
+        dateFormat: DateFormatter;
+        el: HTMLElement;
+        thead: HTMLElement;
+        constructor(context: ComponentContext, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: ResourceDayHeaderProps): void;
+        renderResourceRow(resources: Resource[]): string;
+        renderDayAndResourceRows(dates: DateMarker[], resources: Resource[]): string;
+        renderResourceAndDayRows(resources: Resource[], dates: DateMarker[]): string;
+        renderResourceCell(resource: Resource, colspan: number, date?: DateMarker): string;
+        renderDateCell(date: DateMarker, colspan: number, resource?: Resource): string;
+        buildTr(cellHtmls: string[]): string;
+        processResourceEls(resources: Resource[]): void;
+    }
+}
+
+declare module "@fullcalendar/resource-common/common/resource-day-table" {
+    import { SlicedProps, EventDef, Splitter, DayTable, DayTableCell, SplittableProps, DateSpan, Seg, EventSegUiInteractionState } from "@fullcalendar/core";
+    import { Resource } from "@fullcalendar/resource-common/structs/resource";
+    export interface ResourceDayTableCell extends DayTableCell {
+        resource: Resource;
+    }
+    export abstract class AbstractResourceDayTable {
+        cells: ResourceDayTableCell[][];
+        rowCnt: number;
+        colCnt: number;
+        dayTable: DayTable;
+        resources: Resource[];
+        resourceIndex: ResourceIndex;
+        constructor(dayTable: DayTable, resources: Resource[]);
+        abstract computeCol(dateI: any, resourceI: any): number;
+        abstract computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): {
+            firstCol: number;
+            lastCol: number;
+            isStart: boolean;
+            isEnd: boolean;
+        }[];
+        buildCells(): ResourceDayTableCell[][];
+    }
+    export class ResourceDayTable extends AbstractResourceDayTable {
+        computeCol(dateI: any, resourceI: any): any;
+        computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): {
+            firstCol: any;
+            lastCol: any;
+            isStart: boolean;
+            isEnd: boolean;
+        }[];
+    }
+    export class DayResourceTable extends AbstractResourceDayTable {
+        computeCol(dateI: any, resourceI: any): any;
+        computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): any[];
+    }
+    export class ResourceIndex {
+        indicesById: {
+            [resourceId: string]: number;
+        };
+        ids: string[];
+        length: number;
+        constructor(resources: Resource[]);
+    }
+    export interface VResourceProps extends SplittableProps {
+        resourceDayTable: AbstractResourceDayTable;
+    }
+    export class VResourceSplitter extends Splitter<VResourceProps> {
+        getKeyInfo(props: VResourceProps): any;
+        getKeysForDateSpan(dateSpan: DateSpan): string[];
+        getKeysForEventDef(eventDef: EventDef): string[];
+    }
+    export abstract class VResourceJoiner<SegType extends Seg> {
+        private joinDateSelection;
+        private joinBusinessHours;
+        private joinFgEvents;
+        private joinBgEvents;
+        private joinEventDrags;
+        private joinEventResizes;
+        joinProps(propSets: {
+            [resourceId: string]: SlicedProps<SegType>;
+        }, resourceDayTable: AbstractResourceDayTable): SlicedProps<SegType>;
+        joinSegs(resourceDayTable: AbstractResourceDayTable, ...segGroups: SegType[][]): SegType[];
+        expandSegs(resourceDayTable: AbstractResourceDayTable, segs: SegType[]): any[];
+        joinInteractions(resourceDayTable: AbstractResourceDayTable, ...interactions: EventSegUiInteractionState[]): EventSegUiInteractionState;
+        abstract transformSeg(seg: SegType, resourceDayTable: AbstractResourceDayTable, resourceI: number): SegType[];
+    }
+}
+
+declare module "@fullcalendar/resource-common/common/resource-hierarchy" {
+    import { ResourceHash, Resource } from "@fullcalendar/resource-common/structs/resource";
+    import { ResourceEntityExpansions } from "@fullcalendar/resource-common/reducers/resourceEntityExpansions";
+    export interface Group {
+        value: any;
+        spec: any;
+    }
+    export interface GroupNode {
+        id: string;
+        isExpanded: boolean;
+        group: Group;
+    }
+    export interface ResourceNode {
+        id: string;
+        rowSpans: number[];
+        depth: number;
+        isExpanded: boolean;
+        hasChildren: boolean;
+        resource: Resource;
+        resourceFields: any;
+    }
+    export function flattenResources(resourceStore: ResourceHash, orderSpecs: any): Resource[];
+    export function buildRowNodes(resourceStore: ResourceHash, groupSpecs: any, orderSpecs: any, isVGrouping: boolean, expansions: ResourceEntityExpansions, expansionDefault: boolean): (GroupNode | ResourceNode)[];
+    export function buildResourceFields(resource: Resource): {
+        id: string;
+        parentId: string;
+        title: string;
+        businessHours: import("@fullcalendar/core").EventStore;
+        ui: import("@fullcalendar/core").EventUi;
+        extendedProps: {
+            [extendedProp: string]: any;
+        };
+        startEditable: boolean;
+        durationEditable: boolean;
+        constraints: import("@fullcalendar/core").Constraint[];
+        overlap: boolean;
+        allows: import("@fullcalendar/core").AllowFunc[];
+        backgroundColor: string;
+        borderColor: string;
+        textColor: string;
+        classNames: string[];
+    };
+    export function isGroupsEqual(group0: Group, group1: Group): boolean;
+}
+
+declare module "@fullcalendar/resource-common" {
+    import "@fullcalendar/resource-common/api/EventApi";
+    import "@fullcalendar/resource-common/resource-sources/resource-array";
+    import "@fullcalendar/resource-common/resource-sources/resource-func";
+    import "@fullcalendar/resource-common/resource-sources/resource-json-feed";
+    const _default_1: import("@fullcalendar/core").PluginDef;
+    export default _default_1;
+    export { default as ResourceDayHeader } from "@fullcalendar/resource-common/common/ResourceDayHeader";
+    export { VResourceJoiner, AbstractResourceDayTable, ResourceDayTable, DayResourceTable, VResourceSplitter } from "@fullcalendar/resource-common/common/resource-day-table";
+    export { Resource, ResourceHash } from "@fullcalendar/resource-common/structs/resource";
+    export { ResourceViewProps } from "@fullcalendar/resource-common/View";
+    export { flattenResources, Group, isGroupsEqual, GroupNode, ResourceNode, buildRowNodes, buildResourceFields } from "@fullcalendar/resource-common/common/resource-hierarchy";
+    export { buildResourceTextFunc } from "@fullcalendar/resource-common/common/resource-rendering";
+    export { default as ResourceApi } from "@fullcalendar/resource-common/api/ResourceApi";
+    export { computeResourceEditable } from "@fullcalendar/resource-common/EventDragging";
+    export { default as ResourceSplitter } from "@fullcalendar/resource-common/common/ResourceSplitter";
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-common/main.js b/backoffice/vendors/fullcalendar/resource-common/main.js
new file mode 100644 (file)
index 0000000..54473f5
--- /dev/null
@@ -0,0 +1,1570 @@
+/*!
+FullCalendar Resources Common Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarResourceCommon = {}, global.FullCalendar));
+}(this, function (exports, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    var ResourceDataAdder = /** @class */ (function () {
+        function ResourceDataAdder() {
+            this.filterResources = core.memoize(filterResources);
+        }
+        ResourceDataAdder.prototype.transform = function (viewProps, viewSpec, calendarProps, view) {
+            if (viewSpec.class.needsResourceData) {
+                return {
+                    resourceStore: this.filterResources(calendarProps.resourceStore, view.opt('filterResourcesWithEvents'), calendarProps.eventStore, calendarProps.dateProfile.activeRange),
+                    resourceEntityExpansions: calendarProps.resourceEntityExpansions
+                };
+            }
+        };
+        return ResourceDataAdder;
+    }());
+    function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {
+        if (doFilterResourcesWithEvents) {
+            var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);
+            var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);
+            __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));
+            return core.filterHash(resourceStore, function (resource, resourceId) {
+                return hasEvents_1[resourceId];
+            });
+        }
+        else {
+            return resourceStore;
+        }
+    }
+    function filterEventInstancesInRange(eventInstances, activeRange) {
+        return core.filterHash(eventInstances, function (eventInstance) {
+            return core.rangesIntersect(eventInstance.range, activeRange);
+        });
+    }
+    function computeHasEvents(eventInstances, eventDefs) {
+        var hasEvents = {};
+        for (var instanceId in eventInstances) {
+            var instance = eventInstances[instanceId];
+            for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {
+                var resourceId = _a[_i];
+                hasEvents[resourceId] = true;
+            }
+        }
+        return hasEvents;
+    }
+    /*
+    mark resources as having events if any of their ancestors have them
+    NOTE: resourceStore might not have all the resources that hasEvents{} has keyed
+    */
+    function computeAncestorHasEvents(hasEvents, resourceStore) {
+        var res = {};
+        for (var resourceId in hasEvents) {
+            var resource = void 0;
+            while ((resource = resourceStore[resourceId])) {
+                resourceId = resource.parentId; // now functioning as the parentId
+                if (resourceId) {
+                    res[resourceId] = true;
+                }
+                else {
+                    break;
+                }
+            }
+        }
+        return res;
+    }
+    // for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)
+    var ResourceEventConfigAdder = /** @class */ (function () {
+        function ResourceEventConfigAdder() {
+            this.buildResourceEventUis = core.memoizeOutput(buildResourceEventUis, core.isObjectsSimilar);
+            this.injectResourceEventUis = core.memoize(injectResourceEventUis);
+        }
+        ResourceEventConfigAdder.prototype.transform = function (viewProps, viewSpec, calendarProps) {
+            if (!viewSpec.class.needsResourceData) { // is a non-resource view?
+                return {
+                    eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))
+                };
+            }
+        };
+        return ResourceEventConfigAdder;
+    }());
+    function buildResourceEventUis(resourceStore) {
+        return core.mapHash(resourceStore, function (resource) {
+            return resource.ui;
+        });
+    }
+    function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {
+        return core.mapHash(eventUiBases, function (eventUi, defId) {
+            if (defId) { // not the '' key
+                return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);
+            }
+            else {
+                return eventUi;
+            }
+        });
+    }
+    function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {
+        var parts = [];
+        // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts
+        for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {
+            var resourceId = _a[_i];
+            if (resourceEventUis[resourceId]) {
+                parts.unshift(resourceEventUis[resourceId]);
+            }
+        }
+        parts.unshift(origEventUi);
+        return core.combineEventUis(parts);
+    }
+
+    var RESOURCE_SOURCE_PROPS = {
+        id: String
+    };
+    var defs = [];
+    var uid = 0;
+    function registerResourceSourceDef(def) {
+        defs.push(def);
+    }
+    function getResourceSourceDef(id) {
+        return defs[id];
+    }
+    function doesSourceIgnoreRange(source) {
+        return Boolean(defs[source.sourceDefId].ignoreRange);
+    }
+    function parseResourceSource(input) {
+        for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
+            var def = defs[i];
+            var meta = def.parseMeta(input);
+            if (meta) {
+                var res = parseResourceSourceProps((typeof input === 'object' && input) ? input : {}, meta, i);
+                res._raw = core.freezeRaw(input);
+                return res;
+            }
+        }
+        return null;
+    }
+    function parseResourceSourceProps(input, meta, sourceDefId) {
+        var props = core.refineProps(input, RESOURCE_SOURCE_PROPS);
+        props.sourceId = String(uid++);
+        props.sourceDefId = sourceDefId;
+        props.meta = meta;
+        props.publicId = props.id;
+        props.isFetching = false;
+        props.latestFetchId = '';
+        props.fetchRange = null;
+        delete props.id;
+        return props;
+    }
+
+    function reduceResourceSource (source, action, dateProfile, calendar) {
+        switch (action.type) {
+            case 'INIT':
+                return createSource(calendar.opt('resources'), calendar);
+            case 'RESET_RESOURCE_SOURCE':
+                return createSource(action.resourceSourceInput, calendar, true);
+            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+            case 'NEXT':
+            case 'SET_DATE':
+            case 'SET_VIEW_TYPE':
+                return handleRange(source, dateProfile.activeRange, calendar);
+            case 'RECEIVE_RESOURCES':
+            case 'RECEIVE_RESOURCE_ERROR':
+                return receiveResponse(source, action.fetchId, action.fetchRange);
+            case 'REFETCH_RESOURCES':
+                return fetchSource(source, dateProfile.activeRange, calendar);
+            default:
+                return source;
+        }
+    }
+    var uid$1 = 0;
+    function createSource(input, calendar, forceFetch) {
+        if (input) {
+            var source = parseResourceSource(input);
+            if (forceFetch || !calendar.opt('refetchResourcesOnNavigate')) { // because assumes handleRange will do it later
+                source = fetchSource(source, null, calendar);
+            }
+            return source;
+        }
+        return null;
+    }
+    function handleRange(source, activeRange, calendar) {
+        if (calendar.opt('refetchResourcesOnNavigate') &&
+            !doesSourceIgnoreRange(source) &&
+            (!source.fetchRange || !core.rangesEqual(source.fetchRange, activeRange))) {
+            return fetchSource(source, activeRange, calendar);
+        }
+        else {
+            return source;
+        }
+    }
+    function fetchSource(source, fetchRange, calendar) {
+        var sourceDef = getResourceSourceDef(source.sourceDefId);
+        var fetchId = String(uid$1++);
+        sourceDef.fetch({
+            resourceSource: source,
+            calendar: calendar,
+            range: fetchRange
+        }, function (res) {
+            // HACK
+            // do before calling dispatch in case dispatch renders synchronously
+            calendar.afterSizingTriggers._resourcesRendered = [null]; // fire once
+            calendar.dispatch({
+                type: 'RECEIVE_RESOURCES',
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                rawResources: res.rawResources
+            });
+        }, function (error) {
+            calendar.dispatch({
+                type: 'RECEIVE_RESOURCE_ERROR',
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                error: error
+            });
+        });
+        return __assign({}, source, { isFetching: true, latestFetchId: fetchId });
+    }
+    function receiveResponse(source, fetchId, fetchRange) {
+        if (fetchId === source.latestFetchId) {
+            return __assign({}, source, { isFetching: false, fetchRange: fetchRange });
+        }
+        return source;
+    }
+
+    var RESOURCE_PROPS = {
+        id: String,
+        title: String,
+        parentId: String,
+        businessHours: null,
+        children: null,
+        extendedProps: null
+    };
+    var PRIVATE_ID_PREFIX = '_fc:';
+    var uid$2 = 0;
+    /*
+    needs a full store so that it can populate children too
+    */
+    function parseResource(input, parentId, store, calendar) {
+        if (parentId === void 0) { parentId = ''; }
+        var leftovers0 = {};
+        var props = core.refineProps(input, RESOURCE_PROPS, {}, leftovers0);
+        var leftovers1 = {};
+        var ui = core.processScopedUiProps('event', leftovers0, calendar, leftovers1);
+        if (!props.id) {
+            props.id = PRIVATE_ID_PREFIX + (uid$2++);
+        }
+        if (!props.parentId) { // give precedence to the parentId property
+            props.parentId = parentId;
+        }
+        props.businessHours = props.businessHours ? core.parseBusinessHours(props.businessHours, calendar) : null;
+        props.ui = ui;
+        props.extendedProps = __assign({}, leftovers1, props.extendedProps);
+        // help out ResourceApi from having user modify props
+        Object.freeze(ui.classNames);
+        Object.freeze(props.extendedProps);
+        if (store[props.id]) ;
+        else {
+            store[props.id] = props;
+            if (props.children) {
+                for (var _i = 0, _a = props.children; _i < _a.length; _i++) {
+                    var childInput = _a[_i];
+                    parseResource(childInput, props.id, store, calendar);
+                }
+                delete props.children;
+            }
+        }
+        return props;
+    }
+    /*
+    TODO: use this in more places
+    */
+    function getPublicId(id) {
+        if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {
+            return '';
+        }
+        return id;
+    }
+
+    function reduceResourceStore (store, action, source, calendar) {
+        switch (action.type) {
+            case 'INIT':
+                return {};
+            case 'RECEIVE_RESOURCES':
+                return receiveRawResources(store, action.rawResources, action.fetchId, source, calendar);
+            case 'ADD_RESOURCE':
+                return addResource(store, action.resourceHash);
+            case 'REMOVE_RESOURCE':
+                return removeResource(store, action.resourceId);
+            case 'SET_RESOURCE_PROP':
+                return setResourceProp(store, action.resourceId, action.propName, action.propValue);
+            case 'RESET_RESOURCES':
+                // must make the calendar think each resource is a new object :/
+                return core.mapHash(store, function (resource) {
+                    return __assign({}, resource);
+                });
+            default:
+                return store;
+        }
+    }
+    function receiveRawResources(existingStore, inputs, fetchId, source, calendar) {
+        if (source.latestFetchId === fetchId) {
+            var nextStore = {};
+            for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
+                var input = inputs_1[_i];
+                parseResource(input, '', nextStore, calendar);
+            }
+            return nextStore;
+        }
+        else {
+            return existingStore;
+        }
+    }
+    function addResource(existingStore, additions) {
+        // TODO: warn about duplicate IDs
+        return __assign({}, existingStore, additions);
+    }
+    function removeResource(existingStore, resourceId) {
+        var newStore = __assign({}, existingStore);
+        delete newStore[resourceId];
+        // promote children
+        for (var childResourceId in newStore) { // a child, *maybe* but probably not
+            if (newStore[childResourceId].parentId === resourceId) {
+                newStore[childResourceId] = __assign({}, newStore[childResourceId], { parentId: '' });
+            }
+        }
+        return newStore;
+    }
+    function setResourceProp(existingStore, resourceId, name, value) {
+        var _a, _b;
+        var existingResource = existingStore[resourceId];
+        // TODO: sanitization
+        if (existingResource) {
+            return __assign({}, existingStore, (_a = {}, _a[resourceId] = __assign({}, existingResource, (_b = {}, _b[name] = value, _b)), _a));
+        }
+        else {
+            return existingStore;
+        }
+    }
+
+    function reduceResourceEntityExpansions(expansions, action) {
+        var _a;
+        switch (action.type) {
+            case 'INIT':
+                return {};
+            case 'SET_RESOURCE_ENTITY_EXPANDED':
+                return __assign({}, expansions, (_a = {}, _a[action.id] = action.isExpanded, _a));
+            default:
+                return expansions;
+        }
+    }
+
+    function resourcesReducers (state, action, calendar) {
+        var resourceSource = reduceResourceSource(state.resourceSource, action, state.dateProfile, calendar);
+        var resourceStore = reduceResourceStore(state.resourceStore, action, resourceSource, calendar);
+        var resourceEntityExpansions = reduceResourceEntityExpansions(state.resourceEntityExpansions, action);
+        return __assign({}, state, { resourceSource: resourceSource,
+            resourceStore: resourceStore,
+            resourceEntityExpansions: resourceEntityExpansions });
+    }
+
+    var RESOURCE_RELATED_PROPS = {
+        resourceId: String,
+        resourceIds: function (items) {
+            return (items || []).map(function (item) {
+                return String(item);
+            });
+        },
+        resourceEditable: Boolean
+    };
+    function parseEventDef(def, props, leftovers) {
+        var resourceRelatedProps = core.refineProps(props, RESOURCE_RELATED_PROPS, {}, leftovers);
+        var resourceIds = resourceRelatedProps.resourceIds;
+        if (resourceRelatedProps.resourceId) {
+            resourceIds.push(resourceRelatedProps.resourceId);
+        }
+        def.resourceIds = resourceIds;
+        def.resourceEditable = resourceRelatedProps.resourceEditable;
+    }
+
+    function massageEventDragMutation(eventMutation, hit0, hit1) {
+        var resource0 = hit0.dateSpan.resourceId;
+        var resource1 = hit1.dateSpan.resourceId;
+        if (resource0 && resource1 &&
+            resource0 !== resource1) {
+            eventMutation.resourceMutation = {
+                matchResourceId: resource0,
+                setResourceId: resource1
+            };
+        }
+    }
+    /*
+    TODO: all this would be much easier if we were using a hash!
+    */
+    function applyEventDefMutation(eventDef, mutation, calendar) {
+        var resourceMutation = mutation.resourceMutation;
+        if (resourceMutation && computeResourceEditable(eventDef, calendar)) {
+            var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);
+            if (index !== -1) {
+                var resourceIds = eventDef.resourceIds.slice(); // copy
+                resourceIds.splice(index, 1); // remove
+                if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there
+                    resourceIds.push(resourceMutation.setResourceId); // add
+                }
+                eventDef.resourceIds = resourceIds;
+            }
+        }
+    }
+    /*
+    HACK
+    TODO: use EventUi system instead of this
+    */
+    function computeResourceEditable(eventDef, calendar) {
+        var resourceEditable = eventDef.resourceEditable;
+        if (resourceEditable == null) {
+            var source = eventDef.sourceId && calendar.state.eventSources[eventDef.sourceId];
+            if (source) {
+                resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
+            }
+            if (resourceEditable == null) {
+                resourceEditable = calendar.opt('eventResourceEditable');
+                if (resourceEditable == null) {
+                    resourceEditable = calendar.opt('editable'); // TODO: use defaults system instead
+                }
+            }
+        }
+        return resourceEditable;
+    }
+    function transformEventDrop(mutation, calendar) {
+        var resourceMutation = mutation.resourceMutation;
+        if (resourceMutation) {
+            return {
+                oldResource: calendar.getResourceById(resourceMutation.matchResourceId),
+                newResource: calendar.getResourceById(resourceMutation.setResourceId)
+            };
+        }
+        else {
+            return {
+                oldResource: null,
+                newResource: null
+            };
+        }
+    }
+
+    function transformDateSelectionJoin(hit0, hit1) {
+        var resourceId0 = hit0.dateSpan.resourceId;
+        var resourceId1 = hit1.dateSpan.resourceId;
+        if (resourceId0 && resourceId1) {
+            if (hit0.component.allowAcrossResources === false &&
+                resourceId0 !== resourceId1) {
+                return false;
+            }
+            else {
+                return { resourceId: resourceId0 };
+            }
+        }
+    }
+
+    var ResourceApi = /** @class */ (function () {
+        function ResourceApi(calendar, rawResource) {
+            this._calendar = calendar;
+            this._resource = rawResource;
+        }
+        ResourceApi.prototype.setProp = function (name, value) {
+            this._calendar.dispatch({
+                type: 'SET_RESOURCE_PROP',
+                resourceId: this._resource.id,
+                propName: name,
+                propValue: value
+            });
+        };
+        ResourceApi.prototype.remove = function () {
+            this._calendar.dispatch({
+                type: 'REMOVE_RESOURCE',
+                resourceId: this._resource.id
+            });
+        };
+        ResourceApi.prototype.getParent = function () {
+            var calendar = this._calendar;
+            var parentId = this._resource.parentId;
+            if (parentId) {
+                return new ResourceApi(calendar, calendar.state.resourceSource[parentId]);
+            }
+            else {
+                return null;
+            }
+        };
+        ResourceApi.prototype.getChildren = function () {
+            var thisResourceId = this._resource.id;
+            var calendar = this._calendar;
+            var resourceStore = calendar.state.resourceStore;
+            var childApis = [];
+            for (var resourceId in resourceStore) {
+                if (resourceStore[resourceId].parentId === thisResourceId) {
+                    childApis.push(new ResourceApi(calendar, resourceStore[resourceId]));
+                }
+            }
+            return childApis;
+        };
+        /*
+        this is really inefficient!
+        TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state
+        */
+        ResourceApi.prototype.getEvents = function () {
+            var thisResourceId = this._resource.id;
+            var calendar = this._calendar;
+            var _a = calendar.state.eventStore, defs = _a.defs, instances = _a.instances;
+            var eventApis = [];
+            for (var instanceId in instances) {
+                var instance = instances[instanceId];
+                var def = defs[instance.defId];
+                if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!!
+                    eventApis.push(new core.EventApi(calendar, def, instance));
+                }
+            }
+            return eventApis;
+        };
+        Object.defineProperty(ResourceApi.prototype, "id", {
+            get: function () { return this._resource.id; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "title", {
+            get: function () { return this._resource.title; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventConstraint", {
+            get: function () { return this._resource.ui.constraints[0] || null; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventOverlap", {
+            get: function () { return this._resource.ui.overlap; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventAllow", {
+            get: function () { return this._resource.ui.allows[0] || null; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", {
+            get: function () { return this._resource.ui.backgroundColor; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventBorderColor", {
+            get: function () { return this._resource.ui.borderColor; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventTextColor", {
+            get: function () { return this._resource.ui.textColor; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventClassNames", {
+            // NOTE: user can't modify these because Object.freeze was called in event-def parsing
+            get: function () { return this._resource.ui.classNames; },
+            enumerable: true,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "extendedProps", {
+            get: function () { return this._resource.extendedProps; },
+            enumerable: true,
+            configurable: true
+        });
+        return ResourceApi;
+    }());
+
+    core.Calendar.prototype.addResource = function (input, scrollTo) {
+        var _a;
+        if (scrollTo === void 0) { scrollTo = true; }
+        var resourceHash;
+        var resource;
+        if (input instanceof ResourceApi) {
+            resource = input._resource;
+            resourceHash = (_a = {}, _a[resource.id] = resource, _a);
+        }
+        else {
+            resourceHash = {};
+            resource = parseResource(input, '', resourceHash, this);
+        }
+        // HACK
+        if (scrollTo) {
+            this.component.view.addScroll({ forcedRowId: resource.id });
+        }
+        this.dispatch({
+            type: 'ADD_RESOURCE',
+            resourceHash: resourceHash
+        });
+        return new ResourceApi(this, resource);
+    };
+    core.Calendar.prototype.getResourceById = function (id) {
+        id = String(id);
+        if (this.state.resourceStore) { // guard against calendar with no resource functionality
+            var rawResource = this.state.resourceStore[id];
+            if (rawResource) {
+                return new ResourceApi(this, rawResource);
+            }
+        }
+        return null;
+    };
+    core.Calendar.prototype.getResources = function () {
+        var resourceStore = this.state.resourceStore;
+        var resourceApis = [];
+        if (resourceStore) { // guard against calendar with no resource functionality
+            for (var resourceId in resourceStore) {
+                resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
+            }
+        }
+        return resourceApis;
+    };
+    core.Calendar.prototype.getTopLevelResources = function () {
+        var resourceStore = this.state.resourceStore;
+        var resourceApis = [];
+        if (resourceStore) { // guard against calendar with no resource functionality
+            for (var resourceId in resourceStore) {
+                if (!resourceStore[resourceId].parentId) {
+                    resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
+                }
+            }
+        }
+        return resourceApis;
+    };
+    core.Calendar.prototype.rerenderResources = function () {
+        this.dispatch({
+            type: 'RESET_RESOURCES'
+        });
+    };
+    core.Calendar.prototype.refetchResources = function () {
+        this.dispatch({
+            type: 'REFETCH_RESOURCES'
+        });
+    };
+    function transformDatePoint(dateSpan, calendar) {
+        return dateSpan.resourceId ?
+            { resource: calendar.getResourceById(dateSpan.resourceId) } :
+            {};
+    }
+    function transformDateSpan(dateSpan, calendar) {
+        return dateSpan.resourceId ?
+            { resource: calendar.getResourceById(dateSpan.resourceId) } :
+            {};
+    }
+
+    /*
+    splits things BASED OFF OF which resources they are associated with.
+    creates a '' entry which is when something has NO resource.
+    */
+    var ResourceSplitter = /** @class */ (function (_super) {
+        __extends(ResourceSplitter, _super);
+        function ResourceSplitter() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceSplitter.prototype.getKeyInfo = function (props) {
+            return __assign({ '': {} }, props.resourceStore // already has `ui` and `businessHours` keys!
+            );
+        };
+        ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
+            return [dateSpan.resourceId || ''];
+        };
+        ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
+            var resourceIds = eventDef.resourceIds;
+            if (!resourceIds.length) {
+                return [''];
+            }
+            return resourceIds;
+        };
+        return ResourceSplitter;
+    }(core.Splitter));
+
+    function isPropsValidWithResources(props, calendar) {
+        var splitter = new ResourceSplitter();
+        var sets = splitter.splitProps(__assign({}, props, { resourceStore: calendar.state.resourceStore }));
+        for (var resourceId in sets) {
+            var props_1 = sets[resourceId];
+            // merge in event data from the non-resource segment
+            if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one
+                props_1 = __assign({}, props_1, { eventStore: core.mergeEventStores(sets[''].eventStore, props_1.eventStore), eventUiBases: __assign({}, sets[''].eventUiBases, props_1.eventUiBases) });
+            }
+            if (!core.isPropsValid(props_1, calendar, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) {
+                return false;
+            }
+        }
+        return true;
+    }
+    function filterConfig(resourceId, config) {
+        return __assign({}, config, { constraints: filterConstraints(resourceId, config.constraints) });
+    }
+    function filterConstraints(resourceId, constraints) {
+        return constraints.map(function (constraint) {
+            var defs = constraint.defs;
+            if (defs) { // we are dealing with an EventStore
+                // if any of the events define constraints to resources that are NOT this resource,
+                // then this resource is unconditionally prohibited, which is what a `false` value does.
+                for (var defId in defs) {
+                    var resourceIds = defs[defId].resourceIds;
+                    if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too)
+                        return false;
+                    }
+                }
+            }
+            return constraint;
+        });
+    }
+
+    function transformExternalDef(dateSpan) {
+        return dateSpan.resourceId ?
+            { resourceId: dateSpan.resourceId } :
+            {};
+    }
+
+    function transformEventResizeJoin(hit0, hit1) {
+        var component = hit0.component;
+        if (component.allowAcrossResources === false &&
+            hit0.dateSpan.resourceId !== hit1.dateSpan.resourceId) {
+            return false;
+        }
+    }
+
+    core.EventApi.prototype.getResources = function () {
+        var calendar = this._calendar;
+        return this._def.resourceIds.map(function (resourceId) {
+            return calendar.getResourceById(resourceId);
+        });
+    };
+    core.EventApi.prototype.setResources = function (resources) {
+        var resourceIds = [];
+        // massage resources -> resourceIds
+        for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
+            var resource = resources_1[_i];
+            var resourceId = null;
+            if (typeof resource === 'string') {
+                resourceId = resource;
+            }
+            else if (typeof resource === 'number') {
+                resourceId = String(resource);
+            }
+            else if (resource instanceof ResourceApi) {
+                resourceId = resource.id; // guaranteed to always have an ID. hmmm
+            }
+            else {
+                console.warn('unknown resource type: ' + resource);
+            }
+            if (resourceId) {
+                resourceIds.push(resourceId);
+            }
+        }
+        this.mutate({
+            standardProps: {
+                resourceIds: resourceIds
+            }
+        });
+    };
+
+    var RELEASE_DATE = '2019-04-24'; // for Scheduler
+    var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too
+    var LICENSE_INFO_URL = 'http://fullcalendar.io/scheduler/license/';
+    var PRESET_LICENSE_KEYS = [
+        'GPL-My-Project-Is-Open-Source',
+        'CC-Attribution-NonCommercial-NoDerivatives'
+    ];
+    var CSS = {
+        position: 'absolute',
+        'z-index': 99999,
+        bottom: '1px',
+        left: '1px',
+        background: '#eee',
+        'border-color': '#ddd',
+        'border-style': 'solid',
+        'border-width': '1px 1px 0 0',
+        padding: '2px 4px',
+        'font-size': '12px',
+        'border-top-right-radius': '3px'
+    };
+    function injectLicenseWarning(containerEl, calendar) {
+        var key = calendar.opt('schedulerLicenseKey');
+        if (!isImmuneUrl(window.location.href) && !isValidKey(key)) {
+            core.appendToElement(containerEl, '<div class="fc-license-message" style="' + core.htmlEscape(core.cssToStr(CSS)) + '">' +
+                'Please use a valid license key. <a href="' + LICENSE_INFO_URL + '">More Info</a>' +
+                '</div>');
+        }
+    }
+    /*
+    This decryption is not meant to be bulletproof. Just a way to remind about an upgrade.
+    */
+    function isValidKey(key) {
+        if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {
+            return true;
+        }
+        var parts = (key || '').match(/^(\d+)\-fcs\-(\d+)$/);
+        if (parts && (parts[1].length === 10)) {
+            var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);
+            var releaseDate = new Date(core.config.mockSchedulerReleaseDate || RELEASE_DATE);
+            if (core.isValidDate(releaseDate)) { // token won't be replaced in dev mode
+                var minPurchaseDate = core.addDays(releaseDate, -UPGRADE_WINDOW);
+                if (minPurchaseDate < purchaseDate) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    function isImmuneUrl(url) {
+        return /\w+\:\/\/fullcalendar\.io\/|\/demos\/[\w-]+\.html$/.test(url);
+    }
+
+    var optionChangeHandlers = {
+        resources: handleResources
+    };
+    function handleResources(newSourceInput, calendar) {
+        var oldSourceInput = calendar.state.resourceSource._raw;
+        if (!core.isValuesSimilar(oldSourceInput, newSourceInput, 2)) {
+            calendar.dispatch({
+                type: 'RESET_RESOURCE_SOURCE',
+                resourceSourceInput: newSourceInput
+            });
+        }
+    }
+
+    registerResourceSourceDef({
+        ignoreRange: true,
+        parseMeta: function (raw) {
+            if (Array.isArray(raw)) {
+                return raw;
+            }
+            else if (Array.isArray(raw.resources)) {
+                return raw.resources;
+            }
+            return null;
+        },
+        fetch: function (arg, successCallback) {
+            successCallback({
+                rawResources: arg.resourceSource.meta
+            });
+        }
+    });
+
+    registerResourceSourceDef({
+        parseMeta: function (raw) {
+            if (typeof raw === 'function') {
+                return raw;
+            }
+            else if (typeof raw.resources === 'function') {
+                return raw.resources;
+            }
+            return null;
+        },
+        fetch: function (arg, success, failure) {
+            var dateEnv = arg.calendar.dateEnv;
+            var func = arg.resourceSource.meta;
+            var publicArg = {};
+            if (arg.range) {
+                publicArg = {
+                    start: dateEnv.toDate(arg.range.start),
+                    end: dateEnv.toDate(arg.range.end),
+                    startStr: dateEnv.formatIso(arg.range.start),
+                    endStr: dateEnv.formatIso(arg.range.end),
+                    timeZone: dateEnv.timeZone
+                };
+            }
+            // TODO: make more dry with EventSourceFunc
+            // TODO: accept a response?
+            core.unpromisify(func.bind(null, publicArg), function (rawResources) {
+                success({ rawResources: rawResources }); // needs an object response
+            }, failure // send errorObj directly to failure callback
+            );
+        }
+    });
+
+    registerResourceSourceDef({
+        parseMeta: function (raw) {
+            if (typeof raw === 'string') {
+                raw = { url: raw };
+            }
+            else if (!raw || typeof raw !== 'object' || !raw.url) {
+                return null;
+            }
+            return {
+                url: raw.url,
+                method: (raw.method || 'GET').toUpperCase(),
+                extraParams: raw.extraParams
+            };
+        },
+        fetch: function (arg, successCallback, failureCallback) {
+            var meta = arg.resourceSource.meta;
+            var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
+            core.requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {
+                successCallback({ rawResources: rawResources, xhr: xhr });
+            }, function (message, xhr) {
+                failureCallback({ message: message, xhr: xhr });
+            });
+        }
+    });
+    // TODO: somehow consolidate with event json feed
+    function buildRequestParams(meta, range, calendar) {
+        var dateEnv = calendar.dateEnv;
+        var startParam;
+        var endParam;
+        var timeZoneParam;
+        var customRequestParams;
+        var params = {};
+        if (range) {
+            // startParam = meta.startParam
+            // if (startParam == null) {
+            startParam = calendar.opt('startParam');
+            // }
+            // endParam = meta.endParam
+            // if (endParam == null) {
+            endParam = calendar.opt('endParam');
+            // }
+            // timeZoneParam = meta.timeZoneParam
+            // if (timeZoneParam == null) {
+            timeZoneParam = calendar.opt('timeZoneParam');
+            // }
+            params[startParam] = dateEnv.formatIso(range.start);
+            params[endParam] = dateEnv.formatIso(range.end);
+            if (dateEnv.timeZone !== 'local') {
+                params[timeZoneParam] = dateEnv.timeZone;
+            }
+        }
+        // retrieve any outbound GET/POST data from the options
+        if (typeof meta.extraParams === 'function') {
+            // supplied as a function that returns a key/value object
+            customRequestParams = meta.extraParams();
+        }
+        else {
+            // probably supplied as a straight key/value object
+            customRequestParams = meta.extraParams || {};
+        }
+        __assign(params, customRequestParams);
+        return params;
+    }
+
+    function buildResourceTextFunc(resourceTextSetting, calendar) {
+        if (typeof resourceTextSetting === 'function') {
+            return function (resource) {
+                return resourceTextSetting(new ResourceApi(calendar, resource));
+            };
+        }
+        else {
+            return function (resource) {
+                return resource.title || getPublicId(resource.id);
+            };
+        }
+    }
+
+    var ResourceDayHeader = /** @class */ (function (_super) {
+        __extends(ResourceDayHeader, _super);
+        function ResourceDayHeader(context, parentEl) {
+            var _this = _super.call(this, context) || this;
+            _this.datesAboveResources = _this.opt('datesAboveResources');
+            _this.resourceTextFunc = buildResourceTextFunc(_this.opt('resourceText'), _this.calendar);
+            parentEl.innerHTML = ''; // because might be nbsp
+            parentEl.appendChild(_this.el = core.htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
+                '<table class="' + _this.theme.getClass('tableGrid') + '">' +
+                '<thead></thead>' +
+                '</table>' +
+                '</div>'));
+            _this.thead = _this.el.querySelector('thead');
+            return _this;
+        }
+        ResourceDayHeader.prototype.destroy = function () {
+            core.removeElement(this.el);
+        };
+        ResourceDayHeader.prototype.render = function (props) {
+            var html;
+            this.dateFormat = core.createFormatter(this.opt('columnHeaderFormat') ||
+                core.computeFallbackHeaderFormat(props.datesRepDistinctDays, props.dates.length));
+            if (props.dates.length === 1) {
+                html = this.renderResourceRow(props.resources);
+            }
+            else {
+                if (this.datesAboveResources) {
+                    html = this.renderDayAndResourceRows(props.dates, props.resources);
+                }
+                else {
+                    html = this.renderResourceAndDayRows(props.resources, props.dates);
+                }
+            }
+            this.thead.innerHTML = html;
+            this.processResourceEls(props.resources);
+        };
+        ResourceDayHeader.prototype.renderResourceRow = function (resources) {
+            var _this = this;
+            var cellHtmls = resources.map(function (resource) {
+                return _this.renderResourceCell(resource, 1);
+            });
+            return this.buildTr(cellHtmls);
+        };
+        ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, resources) {
+            var dateHtmls = [];
+            var resourceHtmls = [];
+            for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
+                var date = dates_1[_i];
+                dateHtmls.push(this.renderDateCell(date, resources.length));
+                for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {
+                    var resource = resources_1[_a];
+                    resourceHtmls.push(this.renderResourceCell(resource, 1, date));
+                }
+            }
+            return this.buildTr(dateHtmls) +
+                this.buildTr(resourceHtmls);
+        };
+        ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates) {
+            var resourceHtmls = [];
+            var dateHtmls = [];
+            for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {
+                var resource = resources_2[_i];
+                resourceHtmls.push(this.renderResourceCell(resource, dates.length));
+                for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {
+                    var date = dates_2[_a];
+                    dateHtmls.push(this.renderDateCell(date, 1, resource));
+                }
+            }
+            return this.buildTr(resourceHtmls) +
+                this.buildTr(dateHtmls);
+        };
+        // Cell Rendering Utils
+        // ----------------------------------------------------------------------------------------------
+        // a cell with the resource name. might be associated with a specific day
+        ResourceDayHeader.prototype.renderResourceCell = function (resource, colspan, date) {
+            var dateEnv = this.dateEnv;
+            return '<th class="fc-resource-cell"' +
+                ' data-resource-id="' + resource.id + '"' +
+                (date ?
+                    ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
+                    '') +
+                (colspan > 1 ?
+                    ' colspan="' + colspan + '"' :
+                    '') +
+                '>' +
+                core.htmlEscape(this.resourceTextFunc(resource)) +
+                '</th>';
+        };
+        // a cell with date text. might have a resource associated with it
+        ResourceDayHeader.prototype.renderDateCell = function (date, colspan, resource) {
+            var props = this.props;
+            return core.renderDateCell(date, props.dateProfile, props.datesRepDistinctDays, props.dates.length * props.resources.length, this.dateFormat, this.context, colspan, resource ? 'data-resource-id="' + resource.id + '"' : '');
+        };
+        ResourceDayHeader.prototype.buildTr = function (cellHtmls) {
+            if (!cellHtmls.length) {
+                cellHtmls = ['<td>&nbsp;</td>'];
+            }
+            if (this.props.renderIntroHtml) {
+                cellHtmls = [this.props.renderIntroHtml()].concat(cellHtmls);
+            }
+            if (this.isRtl) {
+                cellHtmls.reverse();
+            }
+            return '<tr>' +
+                cellHtmls.join('') +
+                '</tr>';
+        };
+        // Post-rendering
+        // ----------------------------------------------------------------------------------------------
+        // given a container with already rendered resource cells
+        ResourceDayHeader.prototype.processResourceEls = function (resources) {
+            var _this = this;
+            var view = this.view;
+            core.findElements(this.thead, '.fc-resource-cell').forEach(function (node, col) {
+                col = col % resources.length;
+                if (_this.isRtl) {
+                    col = resources.length - 1 - col;
+                }
+                var resource = resources[col];
+                view.publiclyTrigger('resourceRender', [
+                    {
+                        resource: new ResourceApi(_this.calendar, resource),
+                        el: node,
+                        view: view
+                    }
+                ]);
+            });
+        };
+        return ResourceDayHeader;
+    }(core.Component));
+
+    var AbstractResourceDayTable = /** @class */ (function () {
+        function AbstractResourceDayTable(dayTable, resources) {
+            this.dayTable = dayTable;
+            this.resources = resources;
+            this.resourceIndex = new ResourceIndex(resources);
+            this.rowCnt = dayTable.rowCnt;
+            this.colCnt = dayTable.colCnt * resources.length;
+            this.cells = this.buildCells();
+        }
+        AbstractResourceDayTable.prototype.buildCells = function () {
+            var _a = this, rowCnt = _a.rowCnt, dayTable = _a.dayTable, resources = _a.resources;
+            var rows = [];
+            for (var row = 0; row < rowCnt; row++) {
+                var rowCells = [];
+                for (var dateCol = 0; dateCol < dayTable.colCnt; dateCol++) {
+                    for (var resourceCol = 0; resourceCol < resources.length; resourceCol++) {
+                        var resource = resources[resourceCol];
+                        var htmlAttrs = 'data-resource-id="' + resource.id + '"';
+                        rowCells[this.computeCol(dateCol, resourceCol)] = {
+                            date: dayTable.cells[row][dateCol].date,
+                            resource: resource,
+                            htmlAttrs: htmlAttrs
+                        };
+                    }
+                }
+                rows.push(rowCells);
+            }
+            return rows;
+        };
+        return AbstractResourceDayTable;
+    }());
+    /*
+    resources over dates
+    */
+    var ResourceDayTable = /** @class */ (function (_super) {
+        __extends(ResourceDayTable, _super);
+        function ResourceDayTable() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceDayTable.prototype.computeCol = function (dateI, resourceI) {
+            return resourceI * this.dayTable.colCnt + dateI;
+        };
+        /*
+        all date ranges are intact
+        */
+        ResourceDayTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
+            return [
+                {
+                    firstCol: this.computeCol(dateStartI, resourceI),
+                    lastCol: this.computeCol(dateEndI, resourceI),
+                    isStart: true,
+                    isEnd: true
+                }
+            ];
+        };
+        return ResourceDayTable;
+    }(AbstractResourceDayTable));
+    /*
+    dates over resources
+    */
+    var DayResourceTable = /** @class */ (function (_super) {
+        __extends(DayResourceTable, _super);
+        function DayResourceTable() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DayResourceTable.prototype.computeCol = function (dateI, resourceI) {
+            return dateI * this.resources.length + resourceI;
+        };
+        /*
+        every single day is broken up
+        */
+        DayResourceTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
+            var segs = [];
+            for (var i = dateStartI; i <= dateEndI; i++) {
+                var col = this.computeCol(i, resourceI);
+                segs.push({
+                    firstCol: col,
+                    lastCol: col,
+                    isStart: i === dateStartI,
+                    isEnd: i === dateEndI
+                });
+            }
+            return segs;
+        };
+        return DayResourceTable;
+    }(AbstractResourceDayTable));
+    var ResourceIndex = /** @class */ (function () {
+        function ResourceIndex(resources) {
+            var indicesById = {};
+            var ids = [];
+            for (var i = 0; i < resources.length; i++) {
+                var id = resources[i].id;
+                ids.push(id);
+                indicesById[id] = i;
+            }
+            this.ids = ids;
+            this.indicesById = indicesById;
+            this.length = resources.length;
+        }
+        return ResourceIndex;
+    }());
+    /*
+    TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter
+    */
+    var VResourceSplitter = /** @class */ (function (_super) {
+        __extends(VResourceSplitter, _super);
+        function VResourceSplitter() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        VResourceSplitter.prototype.getKeyInfo = function (props) {
+            var resourceDayTable = props.resourceDayTable;
+            var hash = core.mapHash(resourceDayTable.resourceIndex.indicesById, function (i) {
+                return resourceDayTable.resources[i]; // has `ui` AND `businessHours` keys!
+            }); // :(
+            hash[''] = {};
+            return hash;
+        };
+        VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
+            return [dateSpan.resourceId || ''];
+        };
+        VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
+            var resourceIds = eventDef.resourceIds;
+            if (!resourceIds.length) {
+                return [''];
+            }
+            return resourceIds;
+        };
+        return VResourceSplitter;
+    }(core.Splitter));
+    // joiner
+    var NO_SEGS = []; // for memoizing
+    var VResourceJoiner = /** @class */ (function () {
+        function VResourceJoiner() {
+            this.joinDateSelection = core.memoize(this.joinSegs);
+            this.joinBusinessHours = core.memoize(this.joinSegs);
+            this.joinFgEvents = core.memoize(this.joinSegs);
+            this.joinBgEvents = core.memoize(this.joinSegs);
+            this.joinEventDrags = core.memoize(this.joinInteractions);
+            this.joinEventResizes = core.memoize(this.joinInteractions);
+        }
+        /*
+        propSets also has a '' key for things with no resource
+        */
+        VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {
+            var dateSelectionSets = [];
+            var businessHoursSets = [];
+            var fgEventSets = [];
+            var bgEventSets = [];
+            var eventDrags = [];
+            var eventResizes = [];
+            var eventSelection = '';
+            var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key
+            for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
+                var key = keys_1[_i];
+                var props = propSets[key];
+                dateSelectionSets.push(props.dateSelectionSegs);
+                businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours
+                fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs
+                bgEventSets.push(props.bgEventSegs);
+                eventDrags.push(props.eventDrag);
+                eventResizes.push(props.eventResize);
+                eventSelection = eventSelection || props.eventSelection;
+            }
+            return {
+                dateSelectionSegs: this.joinDateSelection.apply(this, [resourceDayTable].concat(dateSelectionSets)),
+                businessHourSegs: this.joinBusinessHours.apply(this, [resourceDayTable].concat(businessHoursSets)),
+                fgEventSegs: this.joinFgEvents.apply(this, [resourceDayTable].concat(fgEventSets)),
+                bgEventSegs: this.joinBgEvents.apply(this, [resourceDayTable].concat(bgEventSets)),
+                eventDrag: this.joinEventDrags.apply(this, [resourceDayTable].concat(eventDrags)),
+                eventResize: this.joinEventResizes.apply(this, [resourceDayTable].concat(eventResizes)),
+                eventSelection: eventSelection
+            };
+        };
+        VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {
+            var segGroups = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                segGroups[_i - 1] = arguments[_i];
+            }
+            var resourceCnt = resourceDayTable.resources.length;
+            var transformedSegs = [];
+            for (var i = 0; i < resourceCnt; i++) {
+                for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {
+                    var seg = _b[_a];
+                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
+                }
+                for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource
+                    var seg = _d[_c];
+                    transformedSegs.push.apply(// one beyond. the all-resource
+                    transformedSegs, this.transformSeg(seg, resourceDayTable, i));
+                }
+            }
+            return transformedSegs;
+        };
+        /*
+        for expanding non-resource segs to all resources.
+        only for public use.
+        no memoizing.
+        */
+        VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {
+            var resourceCnt = resourceDayTable.resources.length;
+            var transformedSegs = [];
+            for (var i = 0; i < resourceCnt; i++) {
+                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                    var seg = segs_1[_i];
+                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
+                }
+            }
+            return transformedSegs;
+        };
+        VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {
+            var interactions = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                interactions[_i - 1] = arguments[_i];
+            }
+            var resourceCnt = resourceDayTable.resources.length;
+            var affectedInstances = {};
+            var transformedSegs = [];
+            var isEvent = false;
+            var sourceSeg = null;
+            for (var i = 0; i < resourceCnt; i++) {
+                var interaction = interactions[i];
+                if (interaction) {
+                    for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {
+                        var seg = _b[_a];
+                        transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
+                        );
+                    }
+                    __assign(affectedInstances, interaction.affectedInstances);
+                    isEvent = isEvent || interaction.isEvent;
+                    sourceSeg = sourceSeg || interaction.sourceSeg;
+                }
+                if (interactions[resourceCnt]) { // one beyond. the all-resource
+                    for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {
+                        var seg = _d[_c];
+                        transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
+                        );
+                    }
+                }
+            }
+            return {
+                affectedInstances: affectedInstances,
+                segs: transformedSegs,
+                isEvent: isEvent,
+                sourceSeg: sourceSeg
+            };
+        };
+        return VResourceJoiner;
+    }());
+
+    /*
+    doesn't accept grouping
+    */
+    function flattenResources(resourceStore, orderSpecs) {
+        return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true)
+            .map(function (node) {
+            return node.resource;
+        });
+    }
+    function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {
+        var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);
+        var flatNodes = [];
+        flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);
+        return flatNodes;
+    }
+    function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {
+        for (var i = 0; i < complexNodes.length; i++) {
+            var complexNode = complexNodes[i];
+            var group = complexNode.group;
+            if (group) {
+                if (isVGrouping) {
+                    var firstRowIndex = res.length;
+                    var rowSpanIndex = rowSpans.length;
+                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);
+                    if (firstRowIndex < res.length) {
+                        var firstRow = res[firstRowIndex];
+                        var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();
+                        firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;
+                    }
+                }
+                else {
+                    var id = group.spec.field + ':' + group.value;
+                    var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
+                    res.push({ id: id, group: group, isExpanded: isExpanded });
+                    if (isExpanded) {
+                        flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
+                    }
+                }
+            }
+            else if (complexNode.resource) {
+                var id = complexNode.resource.id;
+                var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
+                res.push({
+                    id: id,
+                    rowSpans: rowSpans,
+                    depth: depth,
+                    isExpanded: isExpanded,
+                    hasChildren: Boolean(complexNode.children.length),
+                    resource: complexNode.resource,
+                    resourceFields: complexNode.resourceFields
+                });
+                if (isExpanded) {
+                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
+                }
+            }
+        }
+    }
+    function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {
+        var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);
+        var builtNodes = [];
+        for (var resourceId in resourceNodes) {
+            var resourceNode = resourceNodes[resourceId];
+            if (!resourceNode.resource.parentId) {
+                insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);
+            }
+        }
+        return builtNodes;
+    }
+    function buildResourceNodes(resourceStore, orderSpecs) {
+        var nodeHash = {};
+        for (var resourceId in resourceStore) {
+            var resource = resourceStore[resourceId];
+            nodeHash[resourceId] = {
+                resource: resource,
+                resourceFields: buildResourceFields(resource),
+                children: []
+            };
+        }
+        for (var resourceId in resourceStore) {
+            var resource = resourceStore[resourceId];
+            if (resource.parentId) {
+                var parentNode = nodeHash[resource.parentId];
+                if (parentNode) {
+                    insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);
+                }
+            }
+        }
+        return nodeHash;
+    }
+    function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {
+        if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {
+            var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);
+            insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);
+        }
+        else {
+            insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);
+        }
+    }
+    function ensureGroupNodes(resourceNode, nodes, groupSpec) {
+        var groupValue = resourceNode.resourceFields[groupSpec.field];
+        var groupNode;
+        var newGroupIndex;
+        // find an existing group that matches, or determine the position for a new group
+        if (groupSpec.order) {
+            for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
+                var node = nodes[newGroupIndex];
+                if (node.group) {
+                    var cmp = core.flexibleCompare(groupValue, node.group.value) * groupSpec.order;
+                    if (cmp === 0) {
+                        groupNode = node;
+                        break;
+                    }
+                    else if (cmp < 0) {
+                        break;
+                    }
+                }
+            }
+        }
+        else { // the groups are unordered
+            for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
+                var node = nodes[newGroupIndex];
+                if (node.group && groupValue === node.group.value) {
+                    groupNode = node;
+                    break;
+                }
+            }
+        }
+        if (!groupNode) {
+            groupNode = {
+                group: {
+                    value: groupValue,
+                    spec: groupSpec
+                },
+                children: []
+            };
+            nodes.splice(newGroupIndex, 0, groupNode);
+        }
+        return groupNode;
+    }
+    function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {
+        var i;
+        for (i = 0; i < siblings.length; i++) {
+            var cmp = core.compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs);
+            if (cmp > 0) { // went 1 past. insert at i
+                break;
+            }
+        }
+        siblings.splice(i, 0, resourceNode);
+    }
+    function buildResourceFields(resource) {
+        var obj = __assign({}, resource.extendedProps, resource.ui, resource);
+        delete obj.ui;
+        delete obj.extendedProps;
+        return obj;
+    }
+    function isGroupsEqual(group0, group1) {
+        return group0.spec === group1.spec && group0.value === group1.value;
+    }
+
+    var main = core.createPlugin({
+        reducers: [resourcesReducers],
+        eventDefParsers: [parseEventDef],
+        eventDragMutationMassagers: [massageEventDragMutation],
+        eventDefMutationAppliers: [applyEventDefMutation],
+        dateSelectionTransformers: [transformDateSelectionJoin],
+        datePointTransforms: [transformDatePoint],
+        dateSpanTransforms: [transformDateSpan],
+        viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],
+        isPropsValid: isPropsValidWithResources,
+        externalDefTransforms: [transformExternalDef],
+        eventResizeJoinTransforms: [transformEventResizeJoin],
+        viewContainerModifiers: [injectLicenseWarning],
+        eventDropTransformers: [transformEventDrop],
+        optionChangeHandlers: optionChangeHandlers
+    });
+
+    exports.AbstractResourceDayTable = AbstractResourceDayTable;
+    exports.DayResourceTable = DayResourceTable;
+    exports.ResourceApi = ResourceApi;
+    exports.ResourceDayHeader = ResourceDayHeader;
+    exports.ResourceDayTable = ResourceDayTable;
+    exports.ResourceSplitter = ResourceSplitter;
+    exports.VResourceJoiner = VResourceJoiner;
+    exports.VResourceSplitter = VResourceSplitter;
+    exports.buildResourceFields = buildResourceFields;
+    exports.buildResourceTextFunc = buildResourceTextFunc;
+    exports.buildRowNodes = buildRowNodes;
+    exports.computeResourceEditable = computeResourceEditable;
+    exports.default = main;
+    exports.flattenResources = flattenResources;
+    exports.isGroupsEqual = isGroupsEqual;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/resource-common/main.min.js b/backoffice/vendors/fullcalendar/resource-common/main.min.js
new file mode 100644 (file)
index 0000000..1ca4ef1
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Resources Common Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):(e=e||self,r(e.FullCalendarResourceCommon={},e.FullCalendar))}(this,function(e,r){"use strict";function t(e,r){function t(){this.constructor=e}oe(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}function n(e,t,n,i){if(t){var a=o(n.instances,i),c=s(a,n.defs);return se(c,u(c,e)),r.filterHash(e,function(e,r){return c[r]})}return e}function o(e,t){return r.filterHash(e,function(e){return r.rangesIntersect(e.range,t)})}function s(e,r){var t={};for(var n in e)for(var o=e[n],s=0,u=r[o.defId].resourceIds;s<u.length;s++){var i=u[s];t[i]=!0}return t}function u(e,r){var t={};for(var n in e)for(var o=void 0;(o=r[n])&&(n=o.parentId);)t[n]=!0;return t}function i(e){return r.mapHash(e,function(e){return e.ui})}function a(e,t,n){return r.mapHash(e,function(e,r){return r?c(e,t[r],n):e})}function c(e,t,n){for(var o=[],s=0,u=t.resourceIds;s<u.length;s++){var i=u[s];n[i]&&o.unshift(n[i])}return o.unshift(e),r.combineEventUis(o)}function l(e){ce.push(e)}function d(e){return ce[e]}function f(e){return Boolean(ce[e.sourceDefId].ignoreRange)}function p(e){for(var t=ce.length-1;t>=0;t--){var n=ce[t],o=n.parseMeta(e);if(o){var s=h("object"==typeof e&&e?e:{},o,t);return s._raw=r.freezeRaw(e),s}}return null}function h(e,t,n){var o=r.refineProps(e,ae);return o.sourceId=String(le++),o.sourceDefId=n,o.meta=t,o.publicId=o.id,o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,delete o.id,o}function v(e,r,t,n){switch(r.type){case"INIT":return g(n.opt("resources"),n);case"RESET_RESOURCE_SOURCE":return g(r.resourceSourceInput,n,!0);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return R(e,t.activeRange,n);case"RECEIVE_RESOURCES":case"RECEIVE_RESOURCE_ERROR":return E(e,r.fetchId,r.fetchRange);case"REFETCH_RESOURCES":return y(e,t.activeRange,n);default:return e}}function g(e,r,t){if(e){var n=p(e);return!t&&r.opt("refetchResourcesOnNavigate")||(n=y(n,null,r)),n}return null}function R(e,t,n){return!n.opt("refetchResourcesOnNavigate")||f(e)||e.fetchRange&&r.rangesEqual(e.fetchRange,t)?e:y(e,t,n)}function y(e,r,t){var n=d(e.sourceDefId),o=String(de++);return n.fetch({resourceSource:e,calendar:t,range:r},function(e){t.afterSizingTriggers._resourcesRendered=[null],t.dispatch({type:"RECEIVE_RESOURCES",fetchId:o,fetchRange:r,rawResources:e.rawResources})},function(e){t.dispatch({type:"RECEIVE_RESOURCE_ERROR",fetchId:o,fetchRange:r,error:e})}),se({},e,{isFetching:!0,latestFetchId:o})}function E(e,r,t){return r===e.latestFetchId?se({},e,{isFetching:!1,fetchRange:t}):e}function m(e,t,n,o){void 0===t&&(t="");var s={},u=r.refineProps(e,fe,{},s),i={},a=r.processScopedUiProps("event",s,o,i);if(u.id||(u.id=pe+he++),u.parentId||(u.parentId=t),u.businessHours=u.businessHours?r.parseBusinessHours(u.businessHours,o):null,u.ui=a,u.extendedProps=se({},i,u.extendedProps),Object.freeze(a.classNames),Object.freeze(u.extendedProps),n[u.id]);else if(n[u.id]=u,u.children){for(var c=0,l=u.children;c<l.length;c++){var d=l[c];m(d,u.id,n,o)}delete u.children}return u}function S(e){return 0===e.indexOf(pe)?"":e}function I(e,t,n,o){switch(t.type){case"INIT":return{};case"RECEIVE_RESOURCES":return b(e,t.rawResources,t.fetchId,n,o);case"ADD_RESOURCE":return C(e,t.resourceHash);case"REMOVE_RESOURCE":return _(e,t.resourceId);case"SET_RESOURCE_PROP":return w(e,t.resourceId,t.propName,t.propValue);case"RESET_RESOURCES":return r.mapHash(e,function(e){return se({},e)});default:return e}}function b(e,r,t,n,o){if(n.latestFetchId===t){for(var s={},u=0,i=r;u<i.length;u++){var a=i[u];m(a,"",s,o)}return s}return e}function C(e,r){return se({},e,r)}function _(e,r){var t=se({},e);delete t[r];for(var n in t)t[n].parentId===r&&(t[n]=se({},t[n],{parentId:""}));return t}function w(e,r,t,n){var o,s,u=e[r];return u?se({},e,(o={},o[r]=se({},u,(s={},s[t]=n,s)),o)):e}function P(e,r){var t;switch(r.type){case"INIT":return{};case"SET_RESOURCE_ENTITY_EXPANDED":return se({},e,(t={},t[r.id]=r.isExpanded,t));default:return e}}function O(e,r,t){var n=v(e.resourceSource,r,e.dateProfile,t),o=I(e.resourceStore,r,n,t),s=P(e.resourceEntityExpansions,r);return se({},e,{resourceSource:n,resourceStore:o,resourceEntityExpansions:s})}function x(e,t,n){var o=r.refineProps(t,ve,{},n),s=o.resourceIds;o.resourceId&&s.push(o.resourceId),e.resourceIds=s,e.resourceEditable=o.resourceEditable}function T(e,r,t){var n=r.dateSpan.resourceId,o=t.dateSpan.resourceId;n&&o&&n!==o&&(e.resourceMutation={matchResourceId:n,setResourceId:o})}function D(e,r,t){var n=r.resourceMutation;if(n&&j(e,t)){var o=e.resourceIds.indexOf(n.matchResourceId);if(o!==-1){var s=e.resourceIds.slice();s.splice(o,1),s.indexOf(n.setResourceId)===-1&&s.push(n.setResourceId),e.resourceIds=s}}}function j(e,r){var t=e.resourceEditable;if(null==t){var n=e.sourceId&&r.state.eventSources[e.sourceId];n&&(t=n.extendedProps.resourceEditable),null==t&&(t=r.opt("eventResourceEditable"),null==t&&(t=r.opt("editable")))}return t}function F(e,r){var t=e.resourceMutation;return t?{oldResource:r.getResourceById(t.matchResourceId),newResource:r.getResourceById(t.setResourceId)}:{oldResource:null,newResource:null}}function U(e,r){var t=e.dateSpan.resourceId,n=r.dateSpan.resourceId;if(t&&n)return(e.component.allowAcrossResources!==!1||t===n)&&{resourceId:t}}function A(e,r){return e.resourceId?{resource:r.getResourceById(e.resourceId)}:{}}function H(e,r){return e.resourceId?{resource:r.getResourceById(e.resourceId)}:{}}function B(e,t){var n=new Re,o=n.splitProps(se({},e,{resourceStore:t.state.resourceStore}));for(var s in o){var u=o[s];if(s&&o[""]&&(u=se({},u,{eventStore:r.mergeEventStores(o[""].eventStore,u.eventStore),eventUiBases:se({},o[""].eventUiBases,u.eventUiBases)})),!r.isPropsValid(u,t,{resourceId:s},z.bind(null,s)))return!1}return!0}function z(e,r){return se({},r,{constraints:M(e,r.constraints)})}function M(e,r){return r.map(function(r){var t=r.defs;if(t)for(var n in t){var o=t[n].resourceIds;if(o.length&&o.indexOf(e)===-1)return!1}return r})}function V(e){return e.resourceId?{resourceId:e.resourceId}:{}}function N(e,r){var t=e.component;if(t.allowAcrossResources===!1&&e.dateSpan.resourceId!==r.dateSpan.resourceId)return!1}function k(e,t){var n=t.opt("schedulerLicenseKey");q(window.location.href)||K(n)||r.appendToElement(e,'<div class="fc-license-message" style="'+r.htmlEscape(r.cssToStr(Ie))+'">Please use a valid license key. <a href="'+me+'">More Info</a></div>')}function K(e){if(Se.indexOf(e)!==-1)return!0;var t=(e||"").match(/^(\d+)\-fcs\-(\d+)$/);if(t&&10===t[1].length){var n=new Date(1e3*parseInt(t[2],10)),o=new Date(r.config.mockSchedulerReleaseDate||ye);if(r.isValidDate(o)){var s=r.addDays(o,-Ee);if(s<n)return!0}}return!1}function q(e){return/\w+\:\/\/fullcalendar\.io\/|\/demos\/[\w-]+\.html$/.test(e)}function L(e,t){var n=t.state.resourceSource._raw;r.isValuesSimilar(n,e,2)||t.dispatch({type:"RESET_RESOURCE_SOURCE",resourceSourceInput:e})}function Z(e,r,t){var n,o,s,u,i=t.dateEnv,a={};return r&&(n=t.opt("startParam"),o=t.opt("endParam"),s=t.opt("timeZoneParam"),a[n]=i.formatIso(r.start),a[o]=i.formatIso(r.end),"local"!==i.timeZone&&(a[s]=i.timeZone)),u="function"==typeof e.extraParams?e.extraParams():e.extraParams||{},se(a,u),a}function G(e,r){return"function"==typeof e?function(t){return e(new ge(r,t))}:function(e){return e.title||S(e.id)}}function J(e,r){return W(e,[],r,!1,{},!0).map(function(e){return e.resource})}function W(e,r,t,n,o,s){var u=Y(e,n?-1:1,r,t),i=[];return X(u,i,n,[],0,o,s),i}function X(e,r,t,n,o,s,u){for(var i=0;i<e.length;i++){var a=e[i],c=a.group;if(c)if(t){var l=r.length,d=n.length;if(X(a.children,r,t,n.concat(0),o,s,u),l<r.length){var f=r[l],p=f.rowSpans=f.rowSpans.slice();p[d]=r.length-l}}else{var h=c.spec.field+":"+c.value,v=null!=s[h]?s[h]:u;r.push({id:h,group:c,isExpanded:v}),v&&X(a.children,r,t,n,o+1,s,u)}else if(a.resource){var h=a.resource.id,v=null!=s[h]?s[h]:u;r.push({id:h,rowSpans:n,depth:o,isExpanded:v,hasChildren:Boolean(a.children.length),resource:a.resource,resourceFields:a.resourceFields}),v&&X(a.children,r,t,n,o+1,s,u)}}}function Y(e,r,t,n){var o=$(e,n),s=[];for(var u in o){var i=o[u];i.resource.parentId||Q(i,s,t,0,r,n)}return s}function $(e,r){var t={};for(var n in e){var o=e[n];t[n]={resource:o,resourceFields:te(o),children:[]}}for(var n in e){var o=e[n];if(o.parentId){var s=t[o.parentId];s&&re(t[n],s.children,r)}}return t}function Q(e,r,t,n,o,s){if(t.length&&(o===-1||n<=o)){var u=ee(e,r,t[0]);Q(e,u.children,t.slice(1),n+1,o,s)}else re(e,r,s)}function ee(e,t,n){var o,s,u=e.resourceFields[n.field];if(n.order)for(s=0;s<t.length;s++){var i=t[s];if(i.group){var a=r.flexibleCompare(u,i.group.value)*n.order;if(0===a){o=i;break}if(a<0)break}}else for(s=0;s<t.length;s++){var i=t[s];if(i.group&&u===i.group.value){o=i;break}}return o||(o={group:{value:u,spec:n},children:[]},t.splice(s,0,o)),o}function re(e,t,n){var o;for(o=0;o<t.length;o++){var s=r.compareByFieldSpecs(t[o].resourceFields,e.resourceFields,n);if(s>0)break}t.splice(o,0,e)}function te(e){var r=se({},e.extendedProps,e.ui,e);return delete r.ui,delete r.extendedProps,r}function ne(e,r){return e.spec===r.spec&&e.value===r.value}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var oe=function(e,r){return(oe=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)},se=function(){return se=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++){r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},se.apply(this,arguments)},ue=function(){function e(){this.filterResources=r.memoize(n)}return e.prototype.transform=function(e,r,t,n){if(r["class"].needsResourceData)return{resourceStore:this.filterResources(t.resourceStore,n.opt("filterResourcesWithEvents"),t.eventStore,t.dateProfile.activeRange),resourceEntityExpansions:t.resourceEntityExpansions}},e}(),ie=function(){function e(){this.buildResourceEventUis=r.memoizeOutput(i,r.isObjectsSimilar),this.injectResourceEventUis=r.memoize(a)}return e.prototype.transform=function(e,r,t){if(!r["class"].needsResourceData)return{eventUiBases:this.injectResourceEventUis(e.eventUiBases,e.eventStore.defs,this.buildResourceEventUis(t.resourceStore))}},e}(),ae={id:String},ce=[],le=0,de=0,fe={id:String,title:String,parentId:String,businessHours:null,children:null,extendedProps:null},pe="_fc:",he=0,ve={resourceId:String,resourceIds:function(e){return(e||[]).map(function(e){return String(e)})},resourceEditable:Boolean},ge=function(){function e(e,r){this._calendar=e,this._resource=r}return e.prototype.setProp=function(e,r){this._calendar.dispatch({type:"SET_RESOURCE_PROP",resourceId:this._resource.id,propName:e,propValue:r})},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_RESOURCE",resourceId:this._resource.id})},e.prototype.getParent=function(){var r=this._calendar,t=this._resource.parentId;return t?new e(r,r.state.resourceSource[t]):null},e.prototype.getChildren=function(){var r=this._resource.id,t=this._calendar,n=t.state.resourceStore,o=[];for(var s in n)n[s].parentId===r&&o.push(new e(t,n[s]));return o},e.prototype.getEvents=function(){var e=this._resource.id,t=this._calendar,n=t.state.eventStore,o=n.defs,s=n.instances,u=[];for(var i in s){var a=s[i],c=o[a.defId];c.resourceIds.indexOf(e)!==-1&&u.push(new r.EventApi(t,c,a))}return u},Object.defineProperty(e.prototype,"id",{get:function(){return this._resource.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._resource.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventConstraint",{get:function(){return this._resource.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventOverlap",{get:function(){return this._resource.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventAllow",{get:function(){return this._resource.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventBackgroundColor",{get:function(){return this._resource.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventBorderColor",{get:function(){return this._resource.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventTextColor",{get:function(){return this._resource.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventClassNames",{get:function(){return this._resource.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._resource.extendedProps},enumerable:!0,configurable:!0}),e}();r.Calendar.prototype.addResource=function(e,r){var t;void 0===r&&(r=!0);var n,o;return e instanceof ge?(o=e._resource,t={},t[o.id]=o,n=t):(n={},o=m(e,"",n,this)),r&&this.component.view.addScroll({forcedRowId:o.id}),this.dispatch({type:"ADD_RESOURCE",resourceHash:n}),new ge(this,o)},r.Calendar.prototype.getResourceById=function(e){if(e=String(e),this.state.resourceStore){var r=this.state.resourceStore[e];if(r)return new ge(this,r)}return null},r.Calendar.prototype.getResources=function(){var e=this.state.resourceStore,r=[];if(e)for(var t in e)r.push(new ge(this,e[t]));return r},r.Calendar.prototype.getTopLevelResources=function(){var e=this.state.resourceStore,r=[];if(e)for(var t in e)e[t].parentId||r.push(new ge(this,e[t]));return r},r.Calendar.prototype.rerenderResources=function(){this.dispatch({type:"RESET_RESOURCES"})},r.Calendar.prototype.refetchResources=function(){this.dispatch({type:"REFETCH_RESOURCES"})};var Re=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t(r,e),r.prototype.getKeyInfo=function(e){return se({"":{}},e.resourceStore)},r.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},r.prototype.getKeysForEventDef=function(e){var r=e.resourceIds;return r.length?r:[""]},r}(r.Splitter);r.EventApi.prototype.getResources=function(){var e=this._calendar;return this._def.resourceIds.map(function(r){return e.getResourceById(r)})},r.EventApi.prototype.setResources=function(e){for(var r=[],t=0,n=e;t<n.length;t++){var o=n[t],s=null;"string"==typeof o?s=o:"number"==typeof o?s=String(o):o instanceof ge?s=o.id:console.warn("unknown resource type: "+o),s&&r.push(s)}this.mutate({standardProps:{resourceIds:r}})};var ye="2019-04-24",Ee=372,me="http://fullcalendar.io/scheduler/license/",Se=["GPL-My-Project-Is-Open-Source","CC-Attribution-NonCommercial-NoDerivatives"],Ie={position:"absolute","z-index":99999,bottom:"1px",left:"1px",background:"#eee","border-color":"#ddd","border-style":"solid","border-width":"1px 1px 0 0",padding:"2px 4px","font-size":"12px","border-top-right-radius":"3px"},be={resources:L};l({ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.resources)?e.resources:null},fetch:function(e,r){r({rawResources:e.resourceSource.meta})}}),l({parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.resources?e.resources:null},fetch:function(e,t,n){var o=e.calendar.dateEnv,s=e.resourceSource.meta,u={};e.range&&(u={start:o.toDate(e.range.start),end:o.toDate(e.range.end),startStr:o.formatIso(e.range.start),endStr:o.formatIso(e.range.end),timeZone:o.timeZone}),r.unpromisify(s.bind(null,u),function(e){t({rawResources:e})},n)}}),l({parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams}},fetch:function(e,t,n){var o=e.resourceSource.meta,s=Z(o,e.range,e.calendar);r.requestJson(o.method,o.url,s,function(e,r){t({rawResources:e,xhr:r})},function(e,r){n({message:e,xhr:r})})}});var Ce=function(e){function n(t,n){var o=e.call(this,t)||this;return o.datesAboveResources=o.opt("datesAboveResources"),o.resourceTextFunc=G(o.opt("resourceText"),o.calendar),n.innerHTML="",n.appendChild(o.el=r.htmlToElement('<div class="fc-row '+o.theme.getClass("headerRow")+'"><table class="'+o.theme.getClass("tableGrid")+'"><thead></thead></table></div>')),o.thead=o.el.querySelector("thead"),o}return t(n,e),n.prototype.destroy=function(){r.removeElement(this.el)},n.prototype.render=function(e){var t;this.dateFormat=r.createFormatter(this.opt("columnHeaderFormat")||r.computeFallbackHeaderFormat(e.datesRepDistinctDays,e.dates.length)),t=1===e.dates.length?this.renderResourceRow(e.resources):this.datesAboveResources?this.renderDayAndResourceRows(e.dates,e.resources):this.renderResourceAndDayRows(e.resources,e.dates),this.thead.innerHTML=t,this.processResourceEls(e.resources)},n.prototype.renderResourceRow=function(e){var r=this,t=e.map(function(e){return r.renderResourceCell(e,1)});return this.buildTr(t)},n.prototype.renderDayAndResourceRows=function(e,r){for(var t=[],n=[],o=0,s=e;o<s.length;o++){var u=s[o];t.push(this.renderDateCell(u,r.length));for(var i=0,a=r;i<a.length;i++){var c=a[i];n.push(this.renderResourceCell(c,1,u))}}return this.buildTr(t)+this.buildTr(n)},n.prototype.renderResourceAndDayRows=function(e,r){for(var t=[],n=[],o=0,s=e;o<s.length;o++){var u=s[o];t.push(this.renderResourceCell(u,r.length));for(var i=0,a=r;i<a.length;i++){var c=a[i];n.push(this.renderDateCell(c,1,u))}}return this.buildTr(t)+this.buildTr(n)},n.prototype.renderResourceCell=function(e,t,n){var o=this.dateEnv;return'<th class="fc-resource-cell" data-resource-id="'+e.id+'"'+(n?' data-date="'+o.formatIso(n,{omitTime:!0})+'"':"")+(t>1?' colspan="'+t+'"':"")+">"+r.htmlEscape(this.resourceTextFunc(e))+"</th>"},n.prototype.renderDateCell=function(e,t,n){var o=this.props;return r.renderDateCell(e,o.dateProfile,o.datesRepDistinctDays,o.dates.length*o.resources.length,this.dateFormat,this.context,t,n?'data-resource-id="'+n.id+'"':"")},n.prototype.buildTr=function(e){return e.length||(e=["<td>&nbsp;</td>"]),this.props.renderIntroHtml&&(e=[this.props.renderIntroHtml()].concat(e)),this.isRtl&&e.reverse(),"<tr>"+e.join("")+"</tr>"},n.prototype.processResourceEls=function(e){var t=this,n=this.view;r.findElements(this.thead,".fc-resource-cell").forEach(function(r,o){o%=e.length,t.isRtl&&(o=e.length-1-o);var s=e[o];n.publiclyTrigger("resourceRender",[{resource:new ge(t.calendar,s),el:r,view:n}])})},n}(r.Component),_e=function(){function e(e,r){this.dayTable=e,this.resources=r,this.resourceIndex=new Oe(r),this.rowCnt=e.rowCnt,this.colCnt=e.colCnt*r.length,this.cells=this.buildCells()}return e.prototype.buildCells=function(){for(var e=this,r=e.rowCnt,t=e.dayTable,n=e.resources,o=[],s=0;s<r;s++){for(var u=[],i=0;i<t.colCnt;i++)for(var a=0;a<n.length;a++){var c=n[a],l='data-resource-id="'+c.id+'"';u[this.computeCol(i,a)]={date:t.cells[s][i].date,resource:c,htmlAttrs:l}}o.push(u)}return o},e}(),we=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t(r,e),r.prototype.computeCol=function(e,r){return r*this.dayTable.colCnt+e},r.prototype.computeColRanges=function(e,r,t){return[{firstCol:this.computeCol(e,t),lastCol:this.computeCol(r,t),isStart:!0,isEnd:!0}]},r}(_e),Pe=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t(r,e),r.prototype.computeCol=function(e,r){return e*this.resources.length+r},r.prototype.computeColRanges=function(e,r,t){for(var n=[],o=e;o<=r;o++){var s=this.computeCol(o,t);n.push({firstCol:s,lastCol:s,isStart:o===e,isEnd:o===r})}return n},r}(_e),Oe=function(){function e(e){for(var r={},t=[],n=0;n<e.length;n++){var o=e[n].id;t.push(o),r[o]=n}this.ids=t,this.indicesById=r,this.length=e.length}return e}(),xe=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return t(n,e),n.prototype.getKeyInfo=function(e){var t=e.resourceDayTable,n=r.mapHash(t.resourceIndex.indicesById,function(e){return t.resources[e]});return n[""]={},n},n.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},n.prototype.getKeysForEventDef=function(e){var r=e.resourceIds;return r.length?r:[""]},n}(r.Splitter),Te=[],De=function(){function e(){this.joinDateSelection=r.memoize(this.joinSegs),this.joinBusinessHours=r.memoize(this.joinSegs),this.joinFgEvents=r.memoize(this.joinSegs),this.joinBgEvents=r.memoize(this.joinSegs),this.joinEventDrags=r.memoize(this.joinInteractions),this.joinEventResizes=r.memoize(this.joinInteractions)}return e.prototype.joinProps=function(e,r){for(var t=[],n=[],o=[],s=[],u=[],i=[],a="",c=r.resourceIndex.ids.concat([""]),l=0,d=c;l<d.length;l++){var f=d[l],p=e[f];t.push(p.dateSelectionSegs),n.push(f?p.businessHourSegs:Te),o.push(f?p.fgEventSegs:Te),s.push(p.bgEventSegs),u.push(p.eventDrag),i.push(p.eventResize),a=a||p.eventSelection}return{dateSelectionSegs:this.joinDateSelection.apply(this,[r].concat(t)),businessHourSegs:this.joinBusinessHours.apply(this,[r].concat(n)),fgEventSegs:this.joinFgEvents.apply(this,[r].concat(o)),bgEventSegs:this.joinBgEvents.apply(this,[r].concat(s)),eventDrag:this.joinEventDrags.apply(this,[r].concat(u)),eventResize:this.joinEventResizes.apply(this,[r].concat(i)),eventSelection:a}},e.prototype.joinSegs=function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];for(var n=e.resources.length,o=[],s=0;s<n;s++){for(var u=0,i=r[s];u<i.length;u++){var a=i[u];o.push.apply(o,this.transformSeg(a,e,s))}for(var c=0,l=r[n];c<l.length;c++){var a=l[c];o.push.apply(o,this.transformSeg(a,e,s))}}return o},e.prototype.expandSegs=function(e,r){for(var t=e.resources.length,n=[],o=0;o<t;o++)for(var s=0,u=r;s<u.length;s++){var i=u[s];n.push.apply(n,this.transformSeg(i,e,o))}return n},e.prototype.joinInteractions=function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];for(var n=e.resources.length,o={},s=[],u=!1,i=null,a=0;a<n;a++){var c=r[a];if(c){for(var l=0,d=c.segs;l<d.length;l++){var f=d[l];s.push.apply(s,this.transformSeg(f,e,a))}se(o,c.affectedInstances),u=u||c.isEvent,i=i||c.sourceSeg}if(r[n])for(var p=0,h=r[n].segs;p<h.length;p++){var f=h[p];s.push.apply(s,this.transformSeg(f,e,a))}}return{affectedInstances:o,segs:s,isEvent:u,sourceSeg:i}},e}(),je=r.createPlugin({reducers:[O],eventDefParsers:[x],eventDragMutationMassagers:[T],eventDefMutationAppliers:[D],dateSelectionTransformers:[U],datePointTransforms:[A],dateSpanTransforms:[H],viewPropsTransformers:[ue,ie],isPropsValid:B,externalDefTransforms:[V],eventResizeJoinTransforms:[N],viewContainerModifiers:[k],eventDropTransformers:[F],optionChangeHandlers:be});e.AbstractResourceDayTable=_e,e.DayResourceTable=Pe,e.ResourceApi=ge,e.ResourceDayHeader=Ce,e.ResourceDayTable=we,e.ResourceSplitter=Re,e.VResourceJoiner=De,e.VResourceSplitter=xe,e.buildResourceFields=te,e.buildResourceTextFunc=G,e.buildRowNodes=W,e.computeResourceEditable=j,e["default"]=je,e.flattenResources=J,e.isGroupsEqual=ne,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-common/package.json b/backoffice/vendors/fullcalendar/resource-common/package.json
new file mode 100644 (file)
index 0000000..6a44ed7
--- /dev/null
@@ -0,0 +1,57 @@
+{
+  "_from": "@fullcalendar/resource-common",
+  "_id": "@fullcalendar/resource-common@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-IaqUeHnjTZtVoiJsvcJqNuUdh8UQl1wYcbdA1n2Xu/e/9lUKKUVHmrzAuq+YdfwhOsmXeTGgMy2Fu9NazRXSjQ==",
+  "_location": "/@fullcalendar/resource-common",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/resource-common",
+    "name": "@fullcalendar/resource-common",
+    "escapedName": "@fullcalendar%2fresource-common",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/resource-common/-/resource-common-4.1.0.tgz",
+  "_shasum": "7342a6737965ec49b6fbdc700ae74f9a9062780c",
+  "_spec": "@fullcalendar/resource-common",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/fullcalendar/fullcalendar-scheduler/issues"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "Offers base support for resources. Required for all resource-related plugins.",
+  "docs": "https://fullcalendar.io/docs/scheduler",
+  "homepage": "https://fullcalendar.io/scheduler",
+  "license": "SEE LICENSE IN LICENSE.md",
+  "main": "main.js",
+  "name": "@fullcalendar/resource-common",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar-scheduler.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
+  },
+  "title": "FullCalendar Resources Common Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/resource-daygrid/LICENSE.md b/backoffice/vendors/fullcalendar/resource-daygrid/LICENSE.md
new file mode 100644 (file)
index 0000000..5229663
--- /dev/null
@@ -0,0 +1,18 @@
+
+For complete licensing information, visit:
+http://fullcalendar.io/scheduler/license
+
+FullCalendar Scheduler is tri-licensed, meaning you must choose
+one of three licenses to use. Here is a summary of those licenses:
+
+- Commercial License
+  (a paid license, meant for commercial use)
+  http://fullcalendar.io/scheduler/license-details
+
+- Creative Commons Non-Commercial No-Derivatives
+  (meant for trial and non-commercial use)
+  https://creativecommons.org/licenses/by-nc-nd/4.0/
+
+- GPLv3 License
+  (meant for open-source projects)
+  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/backoffice/vendors/fullcalendar/resource-daygrid/README.md b/backoffice/vendors/fullcalendar/resource-daygrid/README.md
new file mode 100644 (file)
index 0000000..c56092c
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Resource Day Grid Plugin
+
+Displays events in individual columns for days and resources
+
+[View the docs &raquo;](https://fullcalendar.io/docs/resource-daygrid-view)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/backoffice/vendors/fullcalendar/resource-daygrid/main.d.ts b/backoffice/vendors/fullcalendar/resource-daygrid/main.d.ts
new file mode 100644 (file)
index 0000000..1d4d97a
--- /dev/null
@@ -0,0 +1,58 @@
+declare module "@fullcalendar/resource-daygrid/ResourceDayGrid" {
+    import { Hit, DateSpan, DateComponent, DateProfile, EventStore, EventUiHash, EventInteractionState, ComponentContext, Duration } from "@fullcalendar/core";
+    import { DayGrid } from "@fullcalendar/daygrid";
+    import { AbstractResourceDayTable } from "@fullcalendar/resource-common";
+    export interface ResourceDayGridProps {
+        dateProfile: DateProfile | null;
+        resourceDayTable: AbstractResourceDayTable;
+        businessHours: EventStore;
+        eventStore: EventStore;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+        isRigid: boolean;
+        nextDayThreshold: Duration;
+    }
+    export { ResourceDayGrid as default, ResourceDayGrid };
+    class ResourceDayGrid extends DateComponent<ResourceDayGridProps> {
+        dayGrid: DayGrid;
+        private splitter;
+        private slicers;
+        private joiner;
+        constructor(context: ComponentContext, dayGrid: DayGrid);
+        destroy(): void;
+        render(props: ResourceDayGridProps): void;
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number): Hit;
+    }
+}
+
+declare module "@fullcalendar/resource-daygrid/ResourceDayGridView" {
+    import { ComponentContext, ViewSpec, DateProfileGenerator } from "@fullcalendar/core";
+    import { AbstractDayGridView } from "@fullcalendar/daygrid";
+    import { ResourceDayHeader, ResourceViewProps } from "@fullcalendar/resource-common";
+    import ResourceDayGrid from "@fullcalendar/resource-daygrid/ResourceDayGrid";
+    export { ResourceDayGridView as default, ResourceDayGridView };
+    class ResourceDayGridView extends AbstractDayGridView {
+        static needsResourceData: boolean;
+        props: ResourceViewProps;
+        header: ResourceDayHeader;
+        resourceDayGrid: ResourceDayGrid;
+        private resourceOrderSpecs;
+        private flattenResources;
+        private buildResourceDayTable;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: ResourceViewProps): void;
+    }
+}
+
+declare module "@fullcalendar/resource-daygrid" {
+    import ResourceDayGridView from "@fullcalendar/resource-daygrid/ResourceDayGridView";
+    export { ResourceDayGridView };
+    export { default as ResourceDayGrid } from "@fullcalendar/resource-daygrid/ResourceDayGrid";
+    const _default_2: import("@fullcalendar/core").PluginDef;
+    export default _default_2;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-daygrid/main.js b/backoffice/vendors/fullcalendar/resource-daygrid/main.js
new file mode 100644 (file)
index 0000000..417d983
--- /dev/null
@@ -0,0 +1,212 @@
+/*!
+FullCalendar Resource Day Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/resource-common'), require('@fullcalendar/daygrid')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/resource-common', '@fullcalendar/daygrid'], factory) :
+    (global = global || self, factory(global.FullCalendarResourceDayGrid = {}, global.FullCalendar, global.FullCalendarResourceCommon, global.FullCalendarDayGrid));
+}(this, function (exports, core, ResourceCommonPlugin, DayGridPlugin) { 'use strict';
+
+    var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
+    var DayGridPlugin__default = 'default' in DayGridPlugin ? DayGridPlugin['default'] : DayGridPlugin;
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    var ResourceDayGrid = /** @class */ (function (_super) {
+        __extends(ResourceDayGrid, _super);
+        function ResourceDayGrid(context, dayGrid) {
+            var _this = _super.call(this, context, dayGrid.el) || this;
+            _this.splitter = new ResourceCommonPlugin.VResourceSplitter();
+            _this.slicers = {};
+            _this.joiner = new ResourceDayGridJoiner();
+            _this.dayGrid = dayGrid;
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.dayGrid.el
+            });
+            return _this;
+        }
+        ResourceDayGrid.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        ResourceDayGrid.prototype.render = function (props) {
+            var _this = this;
+            var dayGrid = this.dayGrid;
+            var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable, nextDayThreshold = props.nextDayThreshold;
+            var splitProps = this.splitter.splitProps(props);
+            this.slicers = core.mapHash(splitProps, function (split, resourceId) {
+                return _this.slicers[resourceId] || new DayGridPlugin.DayGridSlicer();
+            });
+            var slicedProps = core.mapHash(this.slicers, function (slicer, resourceId) {
+                return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, dayGrid, resourceDayTable.dayTable);
+            });
+            dayGrid.allowAcrossResources = resourceDayTable.dayTable.colCnt === 1;
+            dayGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells, isRigid: props.isRigid }));
+        };
+        ResourceDayGrid.prototype.buildPositionCaches = function () {
+            this.dayGrid.buildPositionCaches();
+        };
+        ResourceDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this.dayGrid,
+                    dateSpan: {
+                        range: rawHit.dateSpan.range,
+                        allDay: rawHit.dateSpan.allDay,
+                        resourceId: this.props.resourceDayTable.cells[rawHit.row][rawHit.col].resource.id
+                    },
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return ResourceDayGrid;
+    }(core.DateComponent));
+    var ResourceDayGridJoiner = /** @class */ (function (_super) {
+        __extends(ResourceDayGridJoiner, _super);
+        function ResourceDayGridJoiner() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceDayGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
+            var colRanges = resourceDayTable.computeColRanges(seg.firstCol, seg.lastCol, resourceI);
+            return colRanges.map(function (colRange) {
+                return __assign({}, seg, colRange, { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd });
+            });
+        };
+        return ResourceDayGridJoiner;
+    }(ResourceCommonPlugin.VResourceJoiner));
+
+    var ResourceDayGridView = /** @class */ (function (_super) {
+        __extends(ResourceDayGridView, _super);
+        function ResourceDayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.flattenResources = core.memoize(ResourceCommonPlugin.flattenResources);
+            _this.buildResourceDayTable = core.memoize(buildResourceDayTable);
+            _this.resourceOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
+            if (_this.opt('columnHeader')) {
+                _this.header = new ResourceCommonPlugin.ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
+            }
+            _this.resourceDayGrid = new ResourceDayGrid(context, _this.dayGrid);
+            return _this;
+        }
+        ResourceDayGridView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            if (this.header) {
+                this.header.destroy();
+            }
+            this.resourceDayGrid.destroy();
+        };
+        ResourceDayGridView.prototype.render = function (props) {
+            _super.prototype.render.call(this, props); // for flags for updateSize
+            var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
+            var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
+            if (this.header) {
+                this.header.receiveProps({
+                    resources: resources,
+                    dates: resourceDayTable.dayTable.headerDates,
+                    dateProfile: props.dateProfile,
+                    datesRepDistinctDays: true,
+                    renderIntroHtml: this.renderHeadIntroHtml
+                });
+            }
+            this.resourceDayGrid.receiveProps({
+                dateProfile: props.dateProfile,
+                resourceDayTable: resourceDayTable,
+                businessHours: props.businessHours,
+                eventStore: props.eventStore,
+                eventUiBases: props.eventUiBases,
+                dateSelection: props.dateSelection,
+                eventSelection: props.eventSelection,
+                eventDrag: props.eventDrag,
+                eventResize: props.eventResize,
+                isRigid: this.hasRigidRows(),
+                nextDayThreshold: this.nextDayThreshold
+            });
+        };
+        ResourceDayGridView.needsResourceData = true; // for ResourceViewProps
+        return ResourceDayGridView;
+    }(DayGridPlugin.AbstractDayGridView));
+    function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
+        var dayTable = DayGridPlugin.buildBasicDayTable(dateProfile, dateProfileGenerator);
+        return datesAboveResources ?
+            new ResourceCommonPlugin.DayResourceTable(dayTable, resources) :
+            new ResourceCommonPlugin.ResourceDayTable(dayTable, resources);
+    }
+
+    var main = core.createPlugin({
+        deps: [ResourceCommonPlugin__default, DayGridPlugin__default],
+        defaultView: 'resourceDayGridDay',
+        views: {
+            resourceDayGrid: ResourceDayGridView,
+            resourceDayGridDay: {
+                type: 'resourceDayGrid',
+                duration: { days: 1 }
+            },
+            resourceDayGridWeek: {
+                type: 'resourceDayGrid',
+                duration: { weeks: 1 }
+            },
+            resourceDayGridMonth: {
+                type: 'resourceDayGrid',
+                duration: { months: 1 },
+                // TODO: wish we didn't have to C&P from dayGrid's file
+                monthMode: true,
+                fixedWeekCount: true
+            }
+        }
+    });
+
+    exports.ResourceDayGrid = ResourceDayGrid;
+    exports.ResourceDayGridView = ResourceDayGridView;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/resource-daygrid/main.min.js b/backoffice/vendors/fullcalendar/resource-daygrid/main.min.js
new file mode 100644 (file)
index 0000000..1cf8f04
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Resource Day Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core"),require("@fullcalendar/resource-common"),require("@fullcalendar/daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/resource-common","@fullcalendar/daygrid"],r):(e=e||self,r(e.FullCalendarResourceDayGrid={},e.FullCalendar,e.FullCalendarResourceCommon,e.FullCalendarDayGrid))}(this,function(e,r,t,o){"use strict";function i(e,r){function t(){this.constructor=e}l(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}function a(e,r,i,a){var s=o.buildBasicDayTable(e,r);return a?new t.DayResourceTable(s,i):new t.ResourceDayTable(s,i)}var s="default"in t?t["default"]:t,n="default"in o?o["default"]:o,l=function(e,r){return(l=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)},c=function(){return c=Object.assign||function(e){for(var r,t=1,o=arguments.length;t<o;t++){r=arguments[t];for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i])}return e},c.apply(this,arguments)},d=function(e){function a(r,o){var i=e.call(this,r,o.el)||this;return i.splitter=new t.VResourceSplitter,i.slicers={},i.joiner=new u,i.dayGrid=o,r.calendar.registerInteractiveComponent(i,{el:i.dayGrid.el}),i}return i(a,e),a.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},a.prototype.render=function(e){var t=this,i=this.dayGrid,a=e.dateProfile,s=e.resourceDayTable,n=e.nextDayThreshold,l=this.splitter.splitProps(e);this.slicers=r.mapHash(l,function(e,r){return t.slicers[r]||new o.DayGridSlicer});var d=r.mapHash(this.slicers,function(e,r){return e.sliceProps(l[r],a,n,i,s.dayTable)});i.allowAcrossResources=1===s.dayTable.colCnt,i.receiveProps(c({},this.joiner.joinProps(d,s),{dateProfile:a,cells:s.cells,isRigid:e.isRigid}))},a.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},a.prototype.queryHit=function(e,r){var t=this.dayGrid.positionToHit(e,r);if(t)return{component:this.dayGrid,dateSpan:{range:t.dateSpan.range,allDay:t.dateSpan.allDay,resourceId:this.props.resourceDayTable.cells[t.row][t.col].resource.id},dayEl:t.dayEl,rect:{left:t.relativeRect.left,right:t.relativeRect.right,top:t.relativeRect.top,bottom:t.relativeRect.bottom},layer:0}},a}(r.DateComponent),u=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return i(r,e),r.prototype.transformSeg=function(e,r,t){var o=r.computeColRanges(e.firstCol,e.lastCol,t);return o.map(function(r){return c({},e,r,{isStart:e.isStart&&r.isStart,isEnd:e.isEnd&&r.isEnd})})},r}(t.VResourceJoiner),y=function(e){function o(o,i,s,n){var l=e.call(this,o,i,s,n)||this;return l.flattenResources=r.memoize(t.flattenResources),l.buildResourceDayTable=r.memoize(a),l.resourceOrderSpecs=r.parseFieldSpecs(l.opt("resourceOrder")),l.opt("columnHeader")&&(l.header=new t.ResourceDayHeader(l.context,l.el.querySelector(".fc-head-container"))),l.resourceDayGrid=new d(o,l.dayGrid),l}return i(o,e),o.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.resourceDayGrid.destroy()},o.prototype.render=function(r){e.prototype.render.call(this,r);var t=this.flattenResources(r.resourceStore,this.resourceOrderSpecs),o=this.buildResourceDayTable(this.props.dateProfile,this.dateProfileGenerator,t,this.opt("datesAboveResources"));this.header&&this.header.receiveProps({resources:t,dates:o.dayTable.headerDates,dateProfile:r.dateProfile,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.resourceDayGrid.receiveProps({dateProfile:r.dateProfile,resourceDayTable:o,businessHours:r.businessHours,eventStore:r.eventStore,eventUiBases:r.eventUiBases,dateSelection:r.dateSelection,eventSelection:r.eventSelection,eventDrag:r.eventDrag,eventResize:r.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},o.needsResourceData=!0,o}(o.AbstractDayGridView),p=r.createPlugin({deps:[s,n],defaultView:"resourceDayGridDay",views:{resourceDayGrid:y,resourceDayGridDay:{type:"resourceDayGrid",duration:{days:1}},resourceDayGridWeek:{type:"resourceDayGrid",duration:{weeks:1}},resourceDayGridMonth:{type:"resourceDayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.ResourceDayGrid=d,e.ResourceDayGridView=y,e["default"]=p,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-daygrid/package.json b/backoffice/vendors/fullcalendar/resource-daygrid/package.json
new file mode 100644 (file)
index 0000000..6ed02ef
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "@fullcalendar/resource-daygrid",
+  "_id": "@fullcalendar/resource-daygrid@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-Q6rAh00FqKgLdmeymR/gTDKvqQ2umo5rfGjfMJskrA9oVCZDv/ZBBbVq/Rc8k+UcB3pn+vo32VSbmwDfIus5hA==",
+  "_location": "/@fullcalendar/resource-daygrid",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/resource-daygrid",
+    "name": "@fullcalendar/resource-daygrid",
+    "escapedName": "@fullcalendar%2fresource-daygrid",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/",
+    "/@fullcalendar/resource-timegrid"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/resource-daygrid/-/resource-daygrid-4.1.0.tgz",
+  "_shasum": "8826d3ecd1b278784e392f773eb5daf6e0a5355f",
+  "_spec": "@fullcalendar/resource-daygrid",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/fullcalendar/fullcalendar-scheduler/issues"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "dependencies": {
+    "@fullcalendar/daygrid": "~4.1.0",
+    "@fullcalendar/resource-common": "~4.1.0"
+  },
+  "deprecated": false,
+  "description": "Displays events in individual columns for days and resources",
+  "docs": "https://fullcalendar.io/docs/resource-daygrid-view",
+  "homepage": "https://fullcalendar.io/scheduler",
+  "license": "SEE LICENSE IN LICENSE.md",
+  "main": "main.js",
+  "name": "@fullcalendar/resource-daygrid",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar-scheduler.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
+  },
+  "title": "FullCalendar Resource Day Grid Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/resource-timegrid/LICENSE.md b/backoffice/vendors/fullcalendar/resource-timegrid/LICENSE.md
new file mode 100644 (file)
index 0000000..5229663
--- /dev/null
@@ -0,0 +1,18 @@
+
+For complete licensing information, visit:
+http://fullcalendar.io/scheduler/license
+
+FullCalendar Scheduler is tri-licensed, meaning you must choose
+one of three licenses to use. Here is a summary of those licenses:
+
+- Commercial License
+  (a paid license, meant for commercial use)
+  http://fullcalendar.io/scheduler/license-details
+
+- Creative Commons Non-Commercial No-Derivatives
+  (meant for trial and non-commercial use)
+  https://creativecommons.org/licenses/by-nc-nd/4.0/
+
+- GPLv3 License
+  (meant for open-source projects)
+  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/backoffice/vendors/fullcalendar/resource-timegrid/README.md b/backoffice/vendors/fullcalendar/resource-timegrid/README.md
new file mode 100644 (file)
index 0000000..f011ad5
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Resource Time Grid Plugin
+
+Displays events on a vertical resource view with time slots
+
+[View the docs &raquo;](https://fullcalendar.io/docs/vertical-resource-view)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/backoffice/vendors/fullcalendar/resource-timegrid/main.d.ts b/backoffice/vendors/fullcalendar/resource-timegrid/main.d.ts
new file mode 100644 (file)
index 0000000..bed1f00
--- /dev/null
@@ -0,0 +1,62 @@
+declare module "@fullcalendar/resource-timegrid/ResourceTimeGrid" {
+    import { DateSpan, DateComponent, DateProfile, EventStore, EventUiHash, EventInteractionState, ComponentContext, DateMarker, Hit } from "@fullcalendar/core";
+    import { TimeGrid } from "@fullcalendar/timegrid";
+    import { AbstractResourceDayTable } from "@fullcalendar/resource-common";
+    export interface ResourceTimeGridProps {
+        dateProfile: DateProfile | null;
+        resourceDayTable: AbstractResourceDayTable;
+        businessHours: EventStore;
+        eventStore: EventStore;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+    }
+    export { ResourceTimeGrid as default, ResourceTimeGrid };
+    class ResourceTimeGrid extends DateComponent<ResourceTimeGridProps> {
+        timeGrid: TimeGrid;
+        private buildDayRanges;
+        private dayRanges;
+        private splitter;
+        private slicers;
+        private joiner;
+        constructor(context: ComponentContext, timeGrid: TimeGrid);
+        destroy(): void;
+        render(props: ResourceTimeGridProps): void;
+        renderNowIndicator(date: DateMarker): void;
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number): Hit;
+    }
+}
+
+declare module "@fullcalendar/resource-timegrid/ResourceTimeGridView" {
+    import { ComponentContext, ViewSpec, DateProfileGenerator } from "@fullcalendar/core";
+    import { AbstractTimeGridView } from "@fullcalendar/timegrid";
+    import { ResourceDayHeader, ResourceViewProps } from "@fullcalendar/resource-common";
+    import { ResourceDayGrid } from "@fullcalendar/resource-daygrid";
+    import ResourceTimeGrid from "@fullcalendar/resource-timegrid/ResourceTimeGrid";
+    export { ResourceTimeGridView as default, ResourceTimeGridView };
+    class ResourceTimeGridView extends AbstractTimeGridView {
+        static needsResourceData: boolean;
+        props: ResourceViewProps;
+        header: ResourceDayHeader;
+        resourceTimeGrid: ResourceTimeGrid;
+        resourceDayGrid: ResourceDayGrid;
+        private resourceOrderSpecs;
+        private flattenResources;
+        private buildResourceDayTable;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: ResourceViewProps): void;
+        renderNowIndicator(date: any): void;
+    }
+}
+
+declare module "@fullcalendar/resource-timegrid" {
+    import ResourceTimeGridView from "@fullcalendar/resource-timegrid/ResourceTimeGridView";
+    export { ResourceTimeGridView };
+    export { default as ResourceTimeGrid } from "@fullcalendar/resource-timegrid/ResourceTimeGrid";
+    const _default_3: import("@fullcalendar/core").PluginDef;
+    export default _default_3;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-timegrid/main.js b/backoffice/vendors/fullcalendar/resource-timegrid/main.js
new file mode 100644 (file)
index 0000000..85d1897
--- /dev/null
@@ -0,0 +1,219 @@
+/*!
+FullCalendar Resource Time Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/resource-common'), require('@fullcalendar/timegrid'), require('@fullcalendar/resource-daygrid')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/resource-common', '@fullcalendar/timegrid', '@fullcalendar/resource-daygrid'], factory) :
+    (global = global || self, factory(global.FullCalendarResourceTimeGrid = {}, global.FullCalendar, global.FullCalendarResourceCommon, global.FullCalendarTimeGrid, global.FullCalendarResourceDayGrid));
+}(this, function (exports, core, ResourceCommonPlugin, TimeGridPlugin, resourceDaygrid) { 'use strict';
+
+    var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
+    var TimeGridPlugin__default = 'default' in TimeGridPlugin ? TimeGridPlugin['default'] : TimeGridPlugin;
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    var ResourceTimeGrid = /** @class */ (function (_super) {
+        __extends(ResourceTimeGrid, _super);
+        function ResourceTimeGrid(context, timeGrid) {
+            var _this = _super.call(this, context, timeGrid.el) || this;
+            _this.buildDayRanges = core.memoize(TimeGridPlugin.buildDayRanges);
+            _this.splitter = new ResourceCommonPlugin.VResourceSplitter();
+            _this.slicers = {};
+            _this.joiner = new ResourceTimeGridJoiner();
+            _this.timeGrid = timeGrid;
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.timeGrid.el
+            });
+            return _this;
+        }
+        ResourceTimeGrid.prototype.destroy = function () {
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        ResourceTimeGrid.prototype.render = function (props) {
+            var _this = this;
+            var timeGrid = this.timeGrid;
+            var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable;
+            var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTable.dayTable, dateProfile, this.dateEnv);
+            var splitProps = this.splitter.splitProps(props);
+            this.slicers = core.mapHash(splitProps, function (split, resourceId) {
+                return _this.slicers[resourceId] || new TimeGridPlugin.TimeGridSlicer();
+            });
+            var slicedProps = core.mapHash(this.slicers, function (slicer, resourceId) {
+                return slicer.sliceProps(splitProps[resourceId], dateProfile, null, timeGrid, dayRanges);
+            });
+            timeGrid.allowAcrossResources = dayRanges.length === 1;
+            timeGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells[0] }));
+        };
+        ResourceTimeGrid.prototype.renderNowIndicator = function (date) {
+            var timeGrid = this.timeGrid;
+            var resourceDayTable = this.props.resourceDayTable;
+            var nonResourceSegs = this.slicers[''].sliceNowDate(date, timeGrid, this.dayRanges);
+            var segs = this.joiner.expandSegs(resourceDayTable, nonResourceSegs);
+            timeGrid.renderNowIndicator(segs, date);
+        };
+        ResourceTimeGrid.prototype.buildPositionCaches = function () {
+            this.timeGrid.buildPositionCaches();
+        };
+        ResourceTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this.timeGrid,
+                    dateSpan: {
+                        range: rawHit.dateSpan.range,
+                        allDay: rawHit.dateSpan.allDay,
+                        resourceId: this.props.resourceDayTable.cells[0][rawHit.col].resource.id
+                    },
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return ResourceTimeGrid;
+    }(core.DateComponent));
+    var ResourceTimeGridJoiner = /** @class */ (function (_super) {
+        __extends(ResourceTimeGridJoiner, _super);
+        function ResourceTimeGridJoiner() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceTimeGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
+            return [
+                __assign({}, seg, { col: resourceDayTable.computeCol(seg.col, resourceI) })
+            ];
+        };
+        return ResourceTimeGridJoiner;
+    }(ResourceCommonPlugin.VResourceJoiner));
+
+    var ResourceTimeGridView = /** @class */ (function (_super) {
+        __extends(ResourceTimeGridView, _super);
+        function ResourceTimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.flattenResources = core.memoize(ResourceCommonPlugin.flattenResources);
+            _this.buildResourceDayTable = core.memoize(buildResourceDayTable);
+            _this.resourceOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
+            if (_this.opt('columnHeader')) {
+                _this.header = new ResourceCommonPlugin.ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
+            }
+            _this.resourceTimeGrid = new ResourceTimeGrid(context, _this.timeGrid);
+            if (_this.dayGrid) {
+                _this.resourceDayGrid = new resourceDaygrid.ResourceDayGrid(context, _this.dayGrid);
+            }
+            return _this;
+        }
+        ResourceTimeGridView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            if (this.header) {
+                this.header.destroy();
+            }
+            this.resourceTimeGrid.destroy();
+            if (this.resourceDayGrid) {
+                this.resourceDayGrid.destroy();
+            }
+        };
+        ResourceTimeGridView.prototype.render = function (props) {
+            _super.prototype.render.call(this, props); // for flags for updateSize
+            var splitProps = this.splitter.splitProps(props);
+            var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
+            var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
+            if (this.header) {
+                this.header.receiveProps({
+                    resources: resources,
+                    dates: resourceDayTable.dayTable.headerDates,
+                    dateProfile: props.dateProfile,
+                    datesRepDistinctDays: true,
+                    renderIntroHtml: this.renderHeadIntroHtml
+                });
+            }
+            this.resourceTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: props.dateProfile, resourceDayTable: resourceDayTable }));
+            if (this.resourceDayGrid) {
+                this.resourceDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: props.dateProfile, resourceDayTable: resourceDayTable, isRigid: false, nextDayThreshold: this.nextDayThreshold }));
+            }
+        };
+        ResourceTimeGridView.prototype.renderNowIndicator = function (date) {
+            this.resourceTimeGrid.renderNowIndicator(date);
+        };
+        ResourceTimeGridView.needsResourceData = true; // for ResourceViewProps
+        return ResourceTimeGridView;
+    }(TimeGridPlugin.AbstractTimeGridView));
+    function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
+        var dayTable = TimeGridPlugin.buildDayTable(dateProfile, dateProfileGenerator);
+        return datesAboveResources ?
+            new ResourceCommonPlugin.DayResourceTable(dayTable, resources) :
+            new ResourceCommonPlugin.ResourceDayTable(dayTable, resources);
+    }
+
+    var main = core.createPlugin({
+        deps: [ResourceCommonPlugin__default, TimeGridPlugin__default],
+        defaultView: 'resourceTimeGridDay',
+        views: {
+            resourceTimeGrid: {
+                class: ResourceTimeGridView,
+                // TODO: wish we didn't have to C&P from timeGrid's file
+                allDaySlot: true,
+                slotDuration: '00:30:00',
+                slotEventOverlap: true // a bad name. confused with overlap/constraint system
+            },
+            resourceTimeGridDay: {
+                type: 'resourceTimeGrid',
+                duration: { days: 1 }
+            },
+            resourceTimeGridWeek: {
+                type: 'resourceTimeGrid',
+                duration: { weeks: 1 }
+            }
+        }
+    });
+
+    exports.ResourceTimeGrid = ResourceTimeGrid;
+    exports.ResourceTimeGridView = ResourceTimeGridView;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/resource-timegrid/main.min.js b/backoffice/vendors/fullcalendar/resource-timegrid/main.min.js
new file mode 100644 (file)
index 0000000..c3e8684
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Resource Time Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core"),require("@fullcalendar/resource-common"),require("@fullcalendar/timegrid"),require("@fullcalendar/resource-daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/resource-common","@fullcalendar/timegrid","@fullcalendar/resource-daygrid"],r):(e=e||self,r(e.FullCalendarResourceTimeGrid={},e.FullCalendar,e.FullCalendarResourceCommon,e.FullCalendarTimeGrid,e.FullCalendarResourceDayGrid))}(this,function(e,r,t,i,o){"use strict";function s(e,r){function t(){this.constructor=e}c(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}function a(e,r,o,s){var a=i.buildDayTable(e,r);return s?new t.DayResourceTable(a,o):new t.ResourceDayTable(a,o)}var n="default"in t?t["default"]:t,l="default"in i?i["default"]:i,c=function(e,r){return(c=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)},d=function(){return d=Object.assign||function(e){for(var r,t=1,i=arguments.length;t<i;t++){r=arguments[t];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},d.apply(this,arguments)},u=function(e){function o(o,s){var a=e.call(this,o,s.el)||this;return a.buildDayRanges=r.memoize(i.buildDayRanges),a.splitter=new t.VResourceSplitter,a.slicers={},a.joiner=new p,a.timeGrid=s,o.calendar.registerInteractiveComponent(a,{el:a.timeGrid.el}),a}return s(o,e),o.prototype.destroy=function(){this.calendar.unregisterInteractiveComponent(this)},o.prototype.render=function(e){var t=this,o=this.timeGrid,s=e.dateProfile,a=e.resourceDayTable,n=this.dayRanges=this.buildDayRanges(a.dayTable,s,this.dateEnv),l=this.splitter.splitProps(e);this.slicers=r.mapHash(l,function(e,r){return t.slicers[r]||new i.TimeGridSlicer});var c=r.mapHash(this.slicers,function(e,r){return e.sliceProps(l[r],s,null,o,n)});o.allowAcrossResources=1===n.length,o.receiveProps(d({},this.joiner.joinProps(c,a),{dateProfile:s,cells:a.cells[0]}))},o.prototype.renderNowIndicator=function(e){var r=this.timeGrid,t=this.props.resourceDayTable,i=this.slicers[""].sliceNowDate(e,r,this.dayRanges),o=this.joiner.expandSegs(t,i);r.renderNowIndicator(o,e)},o.prototype.buildPositionCaches=function(){this.timeGrid.buildPositionCaches()},o.prototype.queryHit=function(e,r){var t=this.timeGrid.positionToHit(e,r);if(t)return{component:this.timeGrid,dateSpan:{range:t.dateSpan.range,allDay:t.dateSpan.allDay,resourceId:this.props.resourceDayTable.cells[0][t.col].resource.id},dayEl:t.dayEl,rect:{left:t.relativeRect.left,right:t.relativeRect.right,top:t.relativeRect.top,bottom:t.relativeRect.bottom},layer:0}},o}(r.DateComponent),p=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return s(r,e),r.prototype.transformSeg=function(e,r,t){return[d({},e,{col:r.computeCol(e.col,t)})]},r}(t.VResourceJoiner),y=function(e){function i(i,s,n,l){var c=e.call(this,i,s,n,l)||this;return c.flattenResources=r.memoize(t.flattenResources),c.buildResourceDayTable=r.memoize(a),c.resourceOrderSpecs=r.parseFieldSpecs(c.opt("resourceOrder")),c.opt("columnHeader")&&(c.header=new t.ResourceDayHeader(c.context,c.el.querySelector(".fc-head-container"))),c.resourceTimeGrid=new u(i,c.timeGrid),c.dayGrid&&(c.resourceDayGrid=new o.ResourceDayGrid(i,c.dayGrid)),c}return s(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.resourceTimeGrid.destroy(),this.resourceDayGrid&&this.resourceDayGrid.destroy()},i.prototype.render=function(r){e.prototype.render.call(this,r);var t=this.splitter.splitProps(r),i=this.flattenResources(r.resourceStore,this.resourceOrderSpecs),o=this.buildResourceDayTable(this.props.dateProfile,this.dateProfileGenerator,i,this.opt("datesAboveResources"));this.header&&this.header.receiveProps({resources:i,dates:o.dayTable.headerDates,dateProfile:r.dateProfile,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.resourceTimeGrid.receiveProps(d({},t.timed,{dateProfile:r.dateProfile,resourceDayTable:o})),this.resourceDayGrid&&this.resourceDayGrid.receiveProps(d({},t.allDay,{dateProfile:r.dateProfile,resourceDayTable:o,isRigid:!1,nextDayThreshold:this.nextDayThreshold}))},i.prototype.renderNowIndicator=function(e){this.resourceTimeGrid.renderNowIndicator(e)},i.needsResourceData=!0,i}(i.AbstractTimeGridView),f=r.createPlugin({deps:[n,l],defaultView:"resourceTimeGridDay",views:{resourceTimeGrid:{"class":y,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},resourceTimeGridDay:{type:"resourceTimeGrid",duration:{days:1}},resourceTimeGridWeek:{type:"resourceTimeGrid",duration:{weeks:1}}}});e.ResourceTimeGrid=u,e.ResourceTimeGridView=y,e["default"]=f,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-timegrid/package.json b/backoffice/vendors/fullcalendar/resource-timegrid/package.json
new file mode 100644 (file)
index 0000000..a09c9c1
--- /dev/null
@@ -0,0 +1,62 @@
+{
+  "_from": "@fullcalendar/resource-timegrid",
+  "_id": "@fullcalendar/resource-timegrid@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-QsaOapGVoJfDt6CHzooKLRFhsnQCrrH0KUC/8V1RMu5H82y4+wOqj/FN1c+4J+WbnVXvCqJe5xIAQv9/2MwjbA==",
+  "_location": "/@fullcalendar/resource-timegrid",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/resource-timegrid",
+    "name": "@fullcalendar/resource-timegrid",
+    "escapedName": "@fullcalendar%2fresource-timegrid",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/resource-timegrid/-/resource-timegrid-4.1.0.tgz",
+  "_shasum": "32866c7f7da644da4fd100143d836bfaf750d1ab",
+  "_spec": "@fullcalendar/resource-timegrid",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/fullcalendar/fullcalendar-scheduler/issues"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "dependencies": {
+    "@fullcalendar/resource-common": "~4.1.0",
+    "@fullcalendar/resource-daygrid": "~4.1.0",
+    "@fullcalendar/timegrid": "~4.1.0"
+  },
+  "deprecated": false,
+  "description": "Displays events on a vertical resource view with time slots",
+  "docs": "https://fullcalendar.io/docs/vertical-resource-view",
+  "homepage": "https://fullcalendar.io/scheduler",
+  "license": "SEE LICENSE IN LICENSE.md",
+  "main": "main.js",
+  "name": "@fullcalendar/resource-timegrid",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar-scheduler.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
+  },
+  "title": "FullCalendar Resource Time Grid Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/LICENSE.md b/backoffice/vendors/fullcalendar/resource-timeline/LICENSE.md
new file mode 100644 (file)
index 0000000..5229663
--- /dev/null
@@ -0,0 +1,18 @@
+
+For complete licensing information, visit:
+http://fullcalendar.io/scheduler/license
+
+FullCalendar Scheduler is tri-licensed, meaning you must choose
+one of three licenses to use. Here is a summary of those licenses:
+
+- Commercial License
+  (a paid license, meant for commercial use)
+  http://fullcalendar.io/scheduler/license-details
+
+- Creative Commons Non-Commercial No-Derivatives
+  (meant for trial and non-commercial use)
+  https://creativecommons.org/licenses/by-nc-nd/4.0/
+
+- GPLv3 License
+  (meant for open-source projects)
+  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/README.md b/backoffice/vendors/fullcalendar/resource-timeline/README.md
new file mode 100644 (file)
index 0000000..4261c89
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Resource Timeline Plugin
+
+Display events and resources on a horizontal time axis
+
+[View the docs &raquo;](https://fullcalendar.io/docs/timeline-view)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/main.css b/backoffice/vendors/fullcalendar/resource-timeline/main.css
new file mode 100644 (file)
index 0000000..641b952
--- /dev/null
@@ -0,0 +1,106 @@
+/*!
+FullCalendar Resource Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+/* Divider between resources and time area
+--------------------------------------------------------------------------------------------------*/
+.fc-timeline .fc-divider {
+  width: 3px;
+  border-style: double;
+  /* overcome neighboring borders */ }
+
+.fc-timeline .fc-head > tr > .fc-divider {
+  border-bottom: 0; }
+
+.fc-timeline .fc-body > tr > .fc-divider {
+  border-top: 0; }
+
+/* Resource Area
+--------------------------------------------------------------------------------------------------*/
+.fc-resource-area {
+  width: 30%; }
+
+.fc-resource-area col {
+  width: 40%;
+  min-width: 70px;
+  /* will be read by JS */ }
+
+.fc-resource-area col.fc-main-col {
+  width: 60%;
+  /* make the first column in a nested setup bigger */ }
+
+.fc-flat .fc-expander-space {
+  /* fc-flat is opposite of fc-nested */
+  display: none; }
+
+.fc-ltr .fc-resource-area tr > * {
+  text-align: left; }
+
+.fc-rtl .fc-resource-area tr > * {
+  text-align: right; }
+
+.fc-resource-area .fc-cell-content {
+  padding-left: 4px;
+  padding-right: 4px; }
+
+/* head */
+.fc-resource-area .fc-super th {
+  text-align: center; }
+
+.fc-resource-area th > div {
+  position: relative; }
+
+.fc-resource-area th .fc-cell-content {
+  position: relative;
+  z-index: 1; }
+
+.fc-resource-area th .fc-col-resizer {
+  position: absolute;
+  z-index: 2;
+  top: 0;
+  bottom: 0;
+  width: 5px; }
+
+.fc-timeline .fc-col-resizer {
+  cursor: col-resize; }
+
+.fc-ltr .fc-resource-area th .fc-col-resizer {
+  right: -3px; }
+
+.fc-rtl .fc-resource-area th .fc-col-resizer {
+  left: -3px; }
+
+/* body */
+.fc-body .fc-resource-area .fc-cell-content {
+  /* might BE the cell */
+  padding-top: 8px;
+  padding-bottom: 8px; }
+
+.fc-no-overlap .fc-body .fc-resource-area .fc-cell-content {
+  /* might BE the cell */
+  padding-top: 6px;
+  padding-bottom: 6px; }
+
+.fc-resource-area .fc-icon {
+  /* the expander and spacers before the expander */
+  display: inline-block;
+  width: 1em;
+  /* ensure constant width, esp for empty icons */
+  text-align: center; }
+
+.fc-resource-area .fc-expander {
+  cursor: pointer;
+  opacity: 0.65; }
+
+/* body resource rows */
+.fc-time-area .fc-rows {
+  position: relative;
+  z-index: 3; }
+
+.fc-time-area .fc-rows td > div {
+  position: relative; }
+
+.fc-time-area .fc-rows .fc-bgevent-container,
+.fc-time-area .fc-rows .fc-highlight-container {
+  z-index: 1; }
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/main.d.ts b/backoffice/vendors/fullcalendar/resource-timeline/main.d.ts
new file mode 100644 (file)
index 0000000..5028cfd
--- /dev/null
@@ -0,0 +1,248 @@
+declare module "@fullcalendar/resource-timeline/Row" {
+    import { Component, ComponentContext } from "@fullcalendar/core";
+    export { Row as default, Row };
+    abstract class Row<PropsType> extends Component<PropsType> {
+        spreadsheetTr: HTMLElement;
+        timeAxisTr: HTMLElement;
+        isSizeDirty: boolean;
+        constructor(context: ComponentContext, spreadsheetParent: HTMLElement, spreadsheetNextSibling: HTMLElement, timeAxisParent: HTMLElement, timeAxisNextSibling: HTMLElement);
+        destroy(): void;
+        abstract getHeightEls(): HTMLElement[];
+        updateSize(isResize: boolean): void;
+    }
+}
+
+declare module "@fullcalendar/resource-timeline/render-utils" {
+    export function updateExpanderIcon(el: HTMLElement, isExpanded: boolean): void;
+    export function clearExpanderIcon(el: HTMLElement): void;
+    export function updateTrResourceId(tr: HTMLElement, resourceId: string): void;
+}
+
+declare module "@fullcalendar/resource-timeline/GroupRow" {
+    import { Group } from "@fullcalendar/resource-common";
+    import Row from "@fullcalendar/resource-timeline/Row";
+    export interface GroupRowProps {
+        spreadsheetColCnt: number;
+        id: string;
+        isExpanded: boolean;
+        group: Group;
+    }
+    export { GroupRow as default, GroupRow };
+    class GroupRow extends Row<GroupRowProps> {
+        spreadsheetHeightEl: HTMLElement;
+        timeAxisHeightEl: HTMLElement;
+        expanderIconEl: HTMLElement;
+        private _renderCells;
+        private _updateExpanderIcon;
+        render(props: GroupRowProps): void;
+        destroy(): void;
+        renderCells(group: Group, spreadsheetColCnt: number): void;
+        unrenderCells(): void;
+        renderSpreadsheetContent(group: Group): HTMLElement;
+        renderCellText(group: Group): any;
+        getHeightEls(): HTMLElement[];
+        updateExpanderIcon(isExpanded: boolean): void;
+        onExpanderClick: (ev: UIEvent) => void;
+    }
+}
+
+declare module "@fullcalendar/resource-timeline/SpreadsheetRow" {
+    import { Component, ComponentContext } from "@fullcalendar/core";
+    import { Resource } from "@fullcalendar/resource-common";
+    export interface SpreadsheetRowProps {
+        colSpecs: any;
+        id: string;
+        rowSpans: number[];
+        depth: number;
+        isExpanded: boolean;
+        hasChildren: boolean;
+        resource: Resource;
+    }
+    export { SpreadsheetRow as default, SpreadsheetRow };
+    class SpreadsheetRow extends Component<SpreadsheetRowProps> {
+        tr: HTMLElement;
+        heightEl: HTMLElement;
+        expanderIconEl: HTMLElement;
+        private _renderRow;
+        private _updateTrResourceId;
+        private _updateExpanderIcon;
+        constructor(context: ComponentContext, tr: HTMLElement);
+        render(props: SpreadsheetRowProps): void;
+        destroy(): void;
+        renderRow(resource: Resource, rowSpans: number[], depth: number, colSpecs: any): void;
+        unrenderRow(): void;
+        updateExpanderIcon(hasChildren: boolean, isExpanded: boolean): void;
+        onExpanderClick: (ev: UIEvent) => void;
+    }
+}
+
+declare module "@fullcalendar/resource-timeline/ResourceRow" {
+    import { Duration, ComponentContext, EventInteractionState, DateSpan, EventUiHash, EventStore, DateProfile } from "@fullcalendar/core";
+    import { TimelineLane, TimeAxis } from "@fullcalendar/timeline";
+    import Row from "@fullcalendar/resource-timeline/Row";
+    import SpreadsheetRow from "@fullcalendar/resource-timeline/SpreadsheetRow";
+    import { Resource } from "@fullcalendar/resource-common";
+    export interface ResourceRowProps {
+        dateProfile: DateProfile;
+        nextDayThreshold: Duration;
+        businessHours: EventStore | null;
+        eventStore: EventStore | null;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+        colSpecs: any;
+        id: string;
+        rowSpans: number[];
+        depth: number;
+        isExpanded: boolean;
+        hasChildren: boolean;
+        resource: Resource;
+    }
+    export { ResourceRow as default, ResourceRow };
+    class ResourceRow extends Row<ResourceRowProps> {
+        innerContainerEl: HTMLElement;
+        spreadsheetRow: SpreadsheetRow;
+        lane: TimelineLane;
+        private _updateTrResourceId;
+        constructor(context: ComponentContext, a: any, b: any, c: any, d: any, timeAxis: TimeAxis);
+        destroy(): void;
+        render(props: ResourceRowProps): void;
+        updateSize(isResize: boolean): void;
+        getHeightEls(): HTMLElement[];
+    }
+}
+
+declare module "@fullcalendar/resource-timeline/SpreadsheetHeader" {
+    import { ElementDragging, Component, ComponentContext, EmitterMixin } from "@fullcalendar/core";
+    export interface SpreadsheetHeaderProps {
+        superHeaderText: string;
+        colSpecs: any;
+        colTags: string;
+    }
+    export { SpreadsheetHeader as default, SpreadsheetHeader };
+    class SpreadsheetHeader extends Component<SpreadsheetHeaderProps> {
+        tableEl: HTMLElement;
+        resizerEls: HTMLElement[];
+        resizables: ElementDragging[];
+        thEls: HTMLElement[];
+        colEls: HTMLElement[];
+        colWidths: number[];
+        emitter: EmitterMixin;
+        constructor(context: ComponentContext, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: SpreadsheetHeaderProps): void;
+        initColResizing(): void;
+    }
+}
+
+declare module "@fullcalendar/resource-timeline/Spreadsheet" {
+    import { Component, ComponentContext } from "@fullcalendar/core";
+    import { HeaderBodyLayout } from "@fullcalendar/timeline";
+    import SpreadsheetHeader from "@fullcalendar/resource-timeline/SpreadsheetHeader";
+    export interface SpreadsheetProps {
+        superHeaderText: string;
+        colSpecs: any;
+    }
+    export { Spreadsheet as default, Spreadsheet };
+    class Spreadsheet extends Component<SpreadsheetProps> {
+        header: SpreadsheetHeader;
+        layout: HeaderBodyLayout;
+        bodyContainerEl: HTMLElement;
+        bodyColGroup: HTMLElement;
+        bodyTbody: HTMLElement;
+        bodyColEls: HTMLElement[];
+        private _renderCells;
+        constructor(context: ComponentContext, headParentEl: HTMLElement, bodyParentEl: HTMLElement);
+        destroy(): void;
+        render(props: SpreadsheetProps): void;
+        renderCells(superHeaderText: any, colSpecs: any): void;
+        unrenderCells(): void;
+        renderColTags(colSpecs: any): string;
+        updateSize(isResize: any, totalHeight: any, isAuto: any): void;
+        applyColWidths(colWidths: (number | string)[]): void;
+    }
+}
+
+declare module "@fullcalendar/resource-timeline/ResourceTimelineView" {
+    import { ElementDragging, SplittableProps, PositionCache, Hit, View, ViewSpec, ComponentContext, DateProfileGenerator, DateProfile } from "@fullcalendar/core";
+    import { ScrollJoiner, TimelineLane, StickyScroller, TimeAxis } from "@fullcalendar/timeline";
+    import { GroupNode, ResourceNode, ResourceViewProps } from "@fullcalendar/resource-common";
+    import GroupRow from "@fullcalendar/resource-timeline/GroupRow";
+    import ResourceRow from "@fullcalendar/resource-timeline/ResourceRow";
+    import Spreadsheet from "@fullcalendar/resource-timeline/Spreadsheet";
+    export { ResourceTimelineView as default, ResourceTimelineView };
+    class ResourceTimelineView extends View {
+        static needsResourceData: boolean;
+        props: ResourceViewProps;
+        spreadsheet: Spreadsheet;
+        timeAxis: TimeAxis;
+        lane: TimelineLane;
+        bodyScrollJoiner: ScrollJoiner;
+        spreadsheetBodyStickyScroller: StickyScroller;
+        isStickyScrollDirty: boolean;
+        timeAxisTbody: HTMLElement;
+        miscHeight: number;
+        rowNodes: (GroupNode | ResourceNode)[];
+        rowComponents: (GroupRow | ResourceRow)[];
+        rowComponentsById: {
+            [id: string]: (GroupRow | ResourceRow);
+        };
+        resourceAreaHeadEl: HTMLElement;
+        resourceAreaWidth?: number;
+        resourceAreaWidthDraggings: ElementDragging[];
+        superHeaderText: any;
+        isVGrouping: any;
+        isHGrouping: any;
+        groupSpecs: any;
+        colSpecs: any;
+        orderSpecs: any;
+        rowPositions: PositionCache;
+        private splitter;
+        private hasResourceBusinessHours;
+        private buildRowNodes;
+        private hasNesting;
+        private _updateHasNesting;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        renderSkeletonHtml(): string;
+        render(props: ResourceViewProps): void;
+        updateHasNesting(isNesting: boolean): void;
+        diffRows(newNodes: any): void;
+        addRow(index: any, rowNode: any): void;
+        removeRows(startIndex: any, len: any, oldRowNodes: any): void;
+        buildChildComponent(node: (GroupNode | ResourceNode), spreadsheetTbody: HTMLElement, spreadsheetNext: HTMLElement, timeAxisTbody: HTMLElement, timeAxisNext: HTMLElement): GroupRow | ResourceRow;
+        renderRows(dateProfile: DateProfile, fallbackBusinessHours: any, splitProps: {
+            [resourceId: string]: SplittableProps;
+        }): void;
+        updateSize(isResize: any, viewHeight: any, isAuto: any): void;
+        syncHeadHeights(): void;
+        updateRowSizes(isResize: boolean): number;
+        destroy(): void;
+        getNowIndicatorUnit(dateProfile: DateProfile): string;
+        renderNowIndicator(date: any): void;
+        unrenderNowIndicator(): void;
+        queryScroll(): any;
+        applyScroll(scroll: any, isResize: any): void;
+        computeDateScroll(timeMs: number): {
+            left: number;
+        };
+        queryDateScroll(): {
+            left: number;
+        };
+        applyDateScroll(scroll: any): void;
+        queryResourceScroll(): any;
+        applyResourceScroll(scroll: any): void;
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number): Hit;
+        setResourceAreaWidth(widthVal: any): void;
+        initResourceAreaWidthDragging(): void;
+    }
+}
+
+declare module "@fullcalendar/resource-timeline" {
+    import ResourceTimelineView from "@fullcalendar/resource-timeline/ResourceTimelineView";
+    export { ResourceTimelineView };
+    const _default_5: import("@fullcalendar/core").PluginDef;
+    export default _default_5;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/main.js b/backoffice/vendors/fullcalendar/resource-timeline/main.js
new file mode 100644 (file)
index 0000000..caefd4b
--- /dev/null
@@ -0,0 +1,1034 @@
+/*!
+FullCalendar Resource Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/timeline'), require('@fullcalendar/resource-common')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/timeline', '@fullcalendar/resource-common'], factory) :
+    (global = global || self, factory(global.FullCalendarResourceTimeline = {}, global.FullCalendar, global.FullCalendarTimeline, global.FullCalendarResourceCommon));
+}(this, function (exports, core, TimelinePlugin, ResourceCommonPlugin) { 'use strict';
+
+    var TimelinePlugin__default = 'default' in TimelinePlugin ? TimelinePlugin['default'] : TimelinePlugin;
+    var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    var Row = /** @class */ (function (_super) {
+        __extends(Row, _super);
+        function Row(context, spreadsheetParent, spreadsheetNextSibling, timeAxisParent, timeAxisNextSibling) {
+            var _this = _super.call(this, context) || this;
+            _this.isSizeDirty = false;
+            spreadsheetParent.insertBefore(_this.spreadsheetTr = document.createElement('tr'), spreadsheetNextSibling);
+            timeAxisParent.insertBefore(_this.timeAxisTr = document.createElement('tr'), timeAxisNextSibling);
+            return _this;
+        }
+        Row.prototype.destroy = function () {
+            core.removeElement(this.spreadsheetTr);
+            core.removeElement(this.timeAxisTr);
+            _super.prototype.destroy.call(this);
+        };
+        Row.prototype.updateSize = function (isResize) {
+            this.isSizeDirty = false;
+        };
+        return Row;
+    }(core.Component));
+
+    function updateExpanderIcon(el, isExpanded) {
+        var classList = el.classList;
+        if (isExpanded) {
+            classList.remove('fc-icon-plus-square');
+            classList.add('fc-icon-minus-square');
+        }
+        else {
+            classList.remove('fc-icon-minus-square');
+            classList.add('fc-icon-plus-square');
+        }
+    }
+    function clearExpanderIcon(el) {
+        var classList = el.classList;
+        classList.remove('fc-icon-minus-square');
+        classList.remove('fc-icon-plus-square');
+    }
+    function updateTrResourceId(tr, resourceId) {
+        tr.setAttribute('data-resource-id', resourceId);
+    }
+
+    var GroupRow = /** @class */ (function (_super) {
+        __extends(GroupRow, _super);
+        function GroupRow() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this._renderCells = core.memoizeRendering(_this.renderCells, _this.unrenderCells);
+            _this._updateExpanderIcon = core.memoizeRendering(_this.updateExpanderIcon, null, [_this._renderCells]);
+            _this.onExpanderClick = function (ev) {
+                var props = _this.props;
+                _this.calendar.dispatch({
+                    type: 'SET_RESOURCE_ENTITY_EXPANDED',
+                    id: props.id,
+                    isExpanded: !props.isExpanded
+                });
+            };
+            return _this;
+        }
+        GroupRow.prototype.render = function (props) {
+            this._renderCells(props.group, props.spreadsheetColCnt);
+            this._updateExpanderIcon(props.isExpanded);
+            this.isSizeDirty = true;
+        };
+        GroupRow.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this._renderCells.unrender(); // should unrender everything else
+        };
+        GroupRow.prototype.renderCells = function (group, spreadsheetColCnt) {
+            var spreadsheetContentEl = this.renderSpreadsheetContent(group);
+            this.spreadsheetTr.appendChild(core.createElement('td', {
+                className: 'fc-divider',
+                colSpan: spreadsheetColCnt // span across all columns
+            }, this.spreadsheetHeightEl = core.createElement('div', null, spreadsheetContentEl)) // needed by setTrInnerHeight
+            );
+            this.expanderIconEl = spreadsheetContentEl.querySelector('.fc-icon');
+            this.expanderIconEl.parentElement.addEventListener('click', this.onExpanderClick);
+            // insert a single cell, with a single empty <div>.
+            // there will be no content
+            this.timeAxisTr.appendChild(core.createElement('td', { className: 'fc-divider' }, this.timeAxisHeightEl = document.createElement('div')));
+        };
+        GroupRow.prototype.unrenderCells = function () {
+            this.spreadsheetTr.innerHTML = '';
+            this.timeAxisTr.innerHTML = '';
+        };
+        /*
+        Renders the content wrapper element that will be inserted into this row's TD cell.
+        */
+        GroupRow.prototype.renderSpreadsheetContent = function (group) {
+            var text = this.renderCellText(group);
+            var contentEl = core.htmlToElement('<div class="fc-cell-content">' +
+                '<span class="fc-expander">' +
+                '<span class="fc-icon"></span>' +
+                '</span>' +
+                '<span class="fc-cell-text">' +
+                (text ? core.htmlEscape(text) : '&nbsp;') +
+                '</span>' +
+                '</div>');
+            var filter = group.spec.render;
+            if (typeof filter === 'function') {
+                contentEl = filter(contentEl, group.value) || contentEl;
+            }
+            return contentEl;
+        };
+        GroupRow.prototype.renderCellText = function (group) {
+            var text = group.value || ''; // might be null/undefined if an ad-hoc grouping
+            var filter = group.spec.text;
+            if (typeof filter === 'function') {
+                text = filter(text) || text;
+            }
+            return text;
+        };
+        GroupRow.prototype.getHeightEls = function () {
+            return [this.spreadsheetHeightEl, this.timeAxisHeightEl];
+        };
+        GroupRow.prototype.updateExpanderIcon = function (isExpanded) {
+            updateExpanderIcon(this.expanderIconEl, isExpanded);
+        };
+        return GroupRow;
+    }(Row));
+    GroupRow.addEqualityFuncs({
+        group: ResourceCommonPlugin.isGroupsEqual // HACK for ResourceTimelineView::renderRows
+    });
+
+    var SpreadsheetRow = /** @class */ (function (_super) {
+        __extends(SpreadsheetRow, _super);
+        function SpreadsheetRow(context, tr) {
+            var _this = _super.call(this, context) || this;
+            _this._renderRow = core.memoizeRendering(_this.renderRow, _this.unrenderRow);
+            _this._updateTrResourceId = core.memoizeRendering(updateTrResourceId, null, [_this._renderRow]);
+            _this._updateExpanderIcon = core.memoizeRendering(_this.updateExpanderIcon, null, [_this._renderRow]);
+            _this.onExpanderClick = function (ev) {
+                var props = _this.props;
+                _this.calendar.dispatch({
+                    type: 'SET_RESOURCE_ENTITY_EXPANDED',
+                    id: props.id,
+                    isExpanded: !props.isExpanded
+                });
+            };
+            _this.tr = tr;
+            return _this;
+        }
+        SpreadsheetRow.prototype.render = function (props) {
+            this._renderRow(props.resource, props.rowSpans, props.depth, props.colSpecs);
+            this._updateTrResourceId(this.tr, props.resource.id); // TODO: only use public ID?
+            this._updateExpanderIcon(props.hasChildren, props.isExpanded);
+        };
+        SpreadsheetRow.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this._renderRow.unrender(); // should unrender everything else
+        };
+        SpreadsheetRow.prototype.renderRow = function (resource, rowSpans, depth, colSpecs) {
+            var _a = this, tr = _a.tr, theme = _a.theme, calendar = _a.calendar, view = _a.view;
+            var resourceFields = ResourceCommonPlugin.buildResourceFields(resource); // slightly inefficient. already done up the call stack
+            var mainTd;
+            for (var i = 0; i < colSpecs.length; i++) {
+                var colSpec = colSpecs[i];
+                var rowSpan = rowSpans[i];
+                if (rowSpan === 0) { // not responsible for group-based rows. VRowGroup is
+                    continue;
+                }
+                else if (rowSpan == null) {
+                    rowSpan = 1;
+                }
+                var text = void 0;
+                if (colSpec.field) {
+                    text = resourceFields[colSpec.field];
+                }
+                else {
+                    text = ResourceCommonPlugin.buildResourceTextFunc(colSpec.text, calendar)(resource);
+                }
+                var contentEl = core.htmlToElement('<div class="fc-cell-content">' +
+                    (colSpec.isMain ? renderIconHtml(depth) : '') +
+                    '<span class="fc-cell-text">' +
+                    (text ? core.htmlEscape(text) : '&nbsp;') +
+                    '</span>' +
+                    '</div>');
+                if (typeof colSpec.render === 'function') { // a filter function for the element
+                    contentEl = colSpec.render(new ResourceCommonPlugin.ResourceApi(calendar, resource), contentEl) || contentEl;
+                }
+                if (rowSpan > 1) {
+                    contentEl.classList.add('fc-sticky');
+                }
+                var td = core.createElement('td', {
+                    className: theme.getClass('widgetContent'),
+                    rowspan: rowSpan
+                }, contentEl);
+                // the first cell of the row needs to have an inner div for setTrInnerHeight
+                if (colSpec.isMain) {
+                    td.appendChild(this.heightEl = core.createElement('div', null, td.childNodes) // inner wrap
+                    );
+                    mainTd = td;
+                }
+                tr.appendChild(td);
+            }
+            this.expanderIconEl = tr.querySelector('.fc-expander-space .fc-icon');
+            // wait until very end
+            view.publiclyTrigger('resourceRender', [
+                {
+                    resource: new ResourceCommonPlugin.ResourceApi(calendar, resource),
+                    el: mainTd,
+                    view: view
+                }
+            ]);
+        };
+        SpreadsheetRow.prototype.unrenderRow = function () {
+            this.tr.innerHTML = '';
+        };
+        SpreadsheetRow.prototype.updateExpanderIcon = function (hasChildren, isExpanded) {
+            var expanderIconEl = this.expanderIconEl;
+            var expanderEl = expanderIconEl.parentElement;
+            if (expanderIconEl &&
+                expanderEl // why would this be null?? was the case in IE11
+            ) {
+                if (hasChildren) {
+                    expanderEl.addEventListener('click', this.onExpanderClick);
+                    expanderEl.classList.add('fc-expander');
+                    updateExpanderIcon(expanderIconEl, isExpanded);
+                }
+                else {
+                    expanderEl.removeEventListener('click', this.onExpanderClick);
+                    expanderEl.classList.remove('fc-expander');
+                    clearExpanderIcon(expanderIconEl);
+                }
+            }
+        };
+        return SpreadsheetRow;
+    }(core.Component));
+    /*
+    Renders the HTML responsible for the subrow expander area,
+    as well as the space before it (used to align expanders of similar depths)
+    */
+    function renderIconHtml(depth) {
+        var html = '';
+        for (var i = 0; i < depth; i++) {
+            html += '<span class="fc-icon"></span>';
+        }
+        html +=
+            '<span class="fc-expander-space">' +
+                '<span class="fc-icon"></span>' +
+                '</span>';
+        return html;
+    }
+
+    var ResourceRow = /** @class */ (function (_super) {
+        __extends(ResourceRow, _super);
+        function ResourceRow(context, a, b, c, d, timeAxis) {
+            var _this = _super.call(this, context, a, b, c, d) || this;
+            _this._updateTrResourceId = core.memoizeRendering(updateTrResourceId);
+            _this.spreadsheetRow = new SpreadsheetRow(context, _this.spreadsheetTr);
+            _this.timeAxisTr.appendChild(core.createElement('td', { className: _this.theme.getClass('widgetContent') }, _this.innerContainerEl = document.createElement('div')));
+            _this.lane = new TimelinePlugin.TimelineLane(context, _this.innerContainerEl, _this.innerContainerEl, timeAxis);
+            return _this;
+        }
+        ResourceRow.prototype.destroy = function () {
+            this.spreadsheetRow.destroy();
+            this.lane.destroy();
+            _super.prototype.destroy.call(this);
+        };
+        ResourceRow.prototype.render = function (props) {
+            // spreadsheetRow handles calling updateTrResourceId for spreadsheetTr
+            this.spreadsheetRow.receiveProps({
+                colSpecs: props.colSpecs,
+                id: props.id,
+                rowSpans: props.rowSpans,
+                depth: props.depth,
+                isExpanded: props.isExpanded,
+                hasChildren: props.hasChildren,
+                resource: props.resource
+            });
+            this._updateTrResourceId(this.timeAxisTr, props.resource.id);
+            this.lane.receiveProps({
+                dateProfile: props.dateProfile,
+                nextDayThreshold: props.nextDayThreshold,
+                businessHours: props.businessHours,
+                eventStore: props.eventStore,
+                eventUiBases: props.eventUiBases,
+                dateSelection: props.dateSelection,
+                eventSelection: props.eventSelection,
+                eventDrag: props.eventDrag,
+                eventResize: props.eventResize
+            });
+            this.isSizeDirty = true;
+        };
+        ResourceRow.prototype.updateSize = function (isResize) {
+            _super.prototype.updateSize.call(this, isResize);
+            this.lane.updateSize(isResize);
+        };
+        ResourceRow.prototype.getHeightEls = function () {
+            return [this.spreadsheetRow.heightEl, this.innerContainerEl];
+        };
+        return ResourceRow;
+    }(Row));
+    ResourceRow.addEqualityFuncs({
+        rowSpans: core.isArraysEqual // HACK for isSizeDirty, ResourceTimelineView::renderRows
+    });
+
+    var COL_MIN_WIDTH = 30;
+    var SpreadsheetHeader = /** @class */ (function (_super) {
+        __extends(SpreadsheetHeader, _super);
+        function SpreadsheetHeader(context, parentEl) {
+            var _this = _super.call(this, context) || this;
+            _this.resizables = [];
+            _this.colWidths = [];
+            _this.emitter = new core.EmitterMixin();
+            parentEl.appendChild(_this.tableEl = core.createElement('table', {
+                className: _this.theme.getClass('tableGrid')
+            }));
+            return _this;
+        }
+        SpreadsheetHeader.prototype.destroy = function () {
+            for (var _i = 0, _a = this.resizables; _i < _a.length; _i++) {
+                var resizable = _a[_i];
+                resizable.destroy();
+            }
+            core.removeElement(this.tableEl);
+            _super.prototype.destroy.call(this);
+        };
+        SpreadsheetHeader.prototype.render = function (props) {
+            var theme = this.theme;
+            var colSpecs = props.colSpecs;
+            var html = '<colgroup>' + props.colTags + '</colgroup>' +
+                '<tbody>';
+            if (props.superHeaderText) {
+                html +=
+                    '<tr class="fc-super">' +
+                        '<th class="' + theme.getClass('widgetHeader') + '" colspan="' + colSpecs.length + '">' +
+                        '<div class="fc-cell-content">' +
+                        '<span class="fc-cell-text">' +
+                        core.htmlEscape(props.superHeaderText) +
+                        '</span>' +
+                        '</div>' +
+                        '</th>' +
+                        '</tr>';
+            }
+            html += '<tr>';
+            for (var i = 0; i < colSpecs.length; i++) {
+                var o = colSpecs[i];
+                var isLast = i === (colSpecs.length - 1);
+                html +=
+                    "<th class=\"" + theme.getClass('widgetHeader') + "\">" +
+                        '<div>' +
+                        '<div class="fc-cell-content">' +
+                        (o.isMain ?
+                            '<span class="fc-expander-space">' +
+                                '<span class="fc-icon"></span>' +
+                                '</span>' :
+                            '') +
+                        '<span class="fc-cell-text">' +
+                        core.htmlEscape(o.labelText || '') + // what about normalizing this value ahead of time?
+                        '</span>' +
+                        '</div>' +
+                        (!isLast ? '<div class="fc-col-resizer"></div>' : '') +
+                        '</div>' +
+                        '</th>';
+            }
+            html += '</tr>';
+            html += '</tbody>';
+            this.tableEl.innerHTML = html;
+            this.thEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('th'));
+            this.colEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('col'));
+            this.resizerEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('.fc-col-resizer'));
+            this.initColResizing();
+        };
+        SpreadsheetHeader.prototype.initColResizing = function () {
+            var _this = this;
+            var ElementDraggingImpl = this.calendar.pluginSystem.hooks.elementDraggingImpl;
+            if (ElementDraggingImpl) {
+                this.resizables = this.resizerEls.map(function (handleEl, colIndex) {
+                    var dragging = new ElementDraggingImpl(handleEl);
+                    var startWidth;
+                    dragging.emitter.on('dragstart', function () {
+                        startWidth = _this.colWidths[colIndex];
+                        if (typeof startWidth !== 'number') {
+                            startWidth = _this.thEls[colIndex].getBoundingClientRect().width;
+                        }
+                    });
+                    dragging.emitter.on('dragmove', function (pev) {
+                        _this.colWidths[colIndex] = Math.max(startWidth + pev.deltaX * (_this.isRtl ? -1 : 1), COL_MIN_WIDTH);
+                        _this.emitter.trigger('colwidthchange', _this.colWidths);
+                    });
+                    dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
+                    return dragging;
+                });
+            }
+        };
+        return SpreadsheetHeader;
+    }(core.Component));
+
+    var Spreadsheet = /** @class */ (function (_super) {
+        __extends(Spreadsheet, _super);
+        function Spreadsheet(context, headParentEl, bodyParentEl) {
+            var _this = _super.call(this, context) || this;
+            _this._renderCells = core.memoizeRendering(_this.renderCells, _this.unrenderCells);
+            _this.layout = new TimelinePlugin.HeaderBodyLayout(headParentEl, bodyParentEl, 'clipped-scroll');
+            var headerEnhancedScroller = _this.layout.headerScroller.enhancedScroll;
+            var bodyEnhancedScroller = _this.layout.bodyScroller.enhancedScroll;
+            _this.header = new SpreadsheetHeader(context, headerEnhancedScroller.canvas.contentEl);
+            _this.header.emitter.on('colwidthchange', function (colWidths) {
+                _this.applyColWidths(colWidths);
+            });
+            bodyEnhancedScroller.canvas.contentEl
+                .appendChild(_this.bodyContainerEl = core.createElement('div', { className: 'fc-rows' }, '<table>' +
+                '<colgroup />' +
+                '<tbody />' +
+                '</table>'));
+            _this.bodyColGroup = _this.bodyContainerEl.querySelector('colgroup');
+            _this.bodyTbody = _this.bodyContainerEl.querySelector('tbody');
+            return _this;
+        }
+        Spreadsheet.prototype.destroy = function () {
+            this.header.destroy();
+            this.layout.destroy();
+            this._renderCells.unrender();
+            _super.prototype.destroy.call(this);
+        };
+        Spreadsheet.prototype.render = function (props) {
+            this._renderCells(props.superHeaderText, props.colSpecs);
+        };
+        Spreadsheet.prototype.renderCells = function (superHeaderText, colSpecs) {
+            var colTags = this.renderColTags(colSpecs);
+            this.header.receiveProps({
+                superHeaderText: superHeaderText,
+                colSpecs: colSpecs,
+                colTags: colTags
+            });
+            this.bodyColGroup.innerHTML = colTags;
+            this.bodyColEls = Array.prototype.slice.call(this.bodyColGroup.querySelectorAll('col'));
+            this.applyColWidths(colSpecs.map(function (colSpec) { return colSpec.width; }));
+        };
+        Spreadsheet.prototype.unrenderCells = function () {
+            this.bodyColGroup.innerHTML = '';
+        };
+        Spreadsheet.prototype.renderColTags = function (colSpecs) {
+            var html = '';
+            for (var _i = 0, colSpecs_1 = colSpecs; _i < colSpecs_1.length; _i++) {
+                var o = colSpecs_1[_i];
+                if (o.isMain) {
+                    html += '<col class="fc-main-col"/>';
+                }
+                else {
+                    html += '<col/>';
+                }
+            }
+            return html;
+        };
+        Spreadsheet.prototype.updateSize = function (isResize, totalHeight, isAuto) {
+            this.layout.setHeight(totalHeight, isAuto);
+        };
+        Spreadsheet.prototype.applyColWidths = function (colWidths) {
+            var _this = this;
+            colWidths.forEach(function (colWidth, colIndex) {
+                var headEl = _this.header.colEls[colIndex]; // bad to access child
+                var bodyEl = _this.bodyColEls[colIndex];
+                var styleVal;
+                if (typeof colWidth === 'number') {
+                    styleVal = colWidth + 'px';
+                }
+                else if (typeof colWidth == null) {
+                    styleVal = '';
+                }
+                headEl.style.width = bodyEl.style.width = styleVal;
+            });
+        };
+        return Spreadsheet;
+    }(core.Component));
+
+    var MIN_RESOURCE_AREA_WIDTH = 30; // definitely bigger than scrollbars
+    var ResourceTimelineView = /** @class */ (function (_super) {
+        __extends(ResourceTimelineView, _super);
+        function ResourceTimelineView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.isStickyScrollDirty = false;
+            _this.rowNodes = [];
+            _this.rowComponents = [];
+            _this.rowComponentsById = {};
+            _this.resourceAreaWidthDraggings = [];
+            _this.splitter = new ResourceCommonPlugin.ResourceSplitter(); // doesn't let it do businessHours tho
+            _this.hasResourceBusinessHours = core.memoize(hasResourceBusinessHours);
+            _this.buildRowNodes = core.memoize(ResourceCommonPlugin.buildRowNodes);
+            _this.hasNesting = core.memoize(hasNesting);
+            _this._updateHasNesting = core.memoizeRendering(_this.updateHasNesting);
+            var allColSpecs = _this.opt('resourceColumns') || [];
+            var labelText = _this.opt('resourceLabelText'); // TODO: view.override
+            var defaultLabelText = 'Resources'; // TODO: view.defaults
+            var superHeaderText = null;
+            if (!allColSpecs.length) {
+                allColSpecs.push({
+                    labelText: labelText || defaultLabelText,
+                    text: ResourceCommonPlugin.buildResourceTextFunc(_this.opt('resourceText'), _this.calendar)
+                });
+            }
+            else {
+                superHeaderText = labelText;
+            }
+            var plainColSpecs = [];
+            var groupColSpecs = [];
+            var groupSpecs = [];
+            var isVGrouping = false;
+            var isHGrouping = false;
+            for (var _i = 0, allColSpecs_1 = allColSpecs; _i < allColSpecs_1.length; _i++) {
+                var colSpec = allColSpecs_1[_i];
+                if (colSpec.group) {
+                    groupColSpecs.push(colSpec);
+                }
+                else {
+                    plainColSpecs.push(colSpec);
+                }
+            }
+            plainColSpecs[0].isMain = true;
+            if (groupColSpecs.length) {
+                groupSpecs = groupColSpecs;
+                isVGrouping = true;
+            }
+            else {
+                var hGroupField = _this.opt('resourceGroupField');
+                if (hGroupField) {
+                    isHGrouping = true;
+                    groupSpecs.push({
+                        field: hGroupField,
+                        text: _this.opt('resourceGroupText'),
+                        render: _this.opt('resourceGroupRender')
+                    });
+                }
+            }
+            var allOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
+            var plainOrderSpecs = [];
+            for (var _a = 0, allOrderSpecs_1 = allOrderSpecs; _a < allOrderSpecs_1.length; _a++) {
+                var orderSpec = allOrderSpecs_1[_a];
+                var isGroup = false;
+                for (var _b = 0, groupSpecs_1 = groupSpecs; _b < groupSpecs_1.length; _b++) {
+                    var groupSpec = groupSpecs_1[_b];
+                    if (groupSpec.field === orderSpec.field) {
+                        groupSpec.order = orderSpec.order; // -1, 0, 1
+                        isGroup = true;
+                        break;
+                    }
+                }
+                if (!isGroup) {
+                    plainOrderSpecs.push(orderSpec);
+                }
+            }
+            _this.superHeaderText = superHeaderText;
+            _this.isVGrouping = isVGrouping;
+            _this.isHGrouping = isHGrouping;
+            _this.groupSpecs = groupSpecs;
+            _this.colSpecs = groupColSpecs.concat(plainColSpecs);
+            _this.orderSpecs = plainOrderSpecs;
+            // START RENDERING...
+            _this.el.classList.add('fc-timeline');
+            if (_this.opt('eventOverlap') === false) {
+                _this.el.classList.add('fc-no-overlap');
+            }
+            _this.el.innerHTML = _this.renderSkeletonHtml();
+            _this.resourceAreaHeadEl = _this.el.querySelector('thead .fc-resource-area');
+            _this.setResourceAreaWidth(_this.opt('resourceAreaWidth'));
+            _this.initResourceAreaWidthDragging();
+            _this.miscHeight = _this.el.offsetHeight;
+            _this.spreadsheet = new Spreadsheet(_this.context, _this.resourceAreaHeadEl, _this.el.querySelector('tbody .fc-resource-area'));
+            _this.timeAxis = new TimelinePlugin.TimeAxis(_this.context, _this.el.querySelector('thead .fc-time-area'), _this.el.querySelector('tbody .fc-time-area'));
+            var timeAxisRowContainer = core.createElement('div', { className: 'fc-rows' }, '<table><tbody /></table>');
+            _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl.appendChild(timeAxisRowContainer);
+            _this.timeAxisTbody = timeAxisRowContainer.querySelector('tbody');
+            _this.lane = new TimelinePlugin.TimelineLane(_this.context, null, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl, _this.timeAxis);
+            _this.bodyScrollJoiner = new TimelinePlugin.ScrollJoiner('vertical', [
+                _this.spreadsheet.layout.bodyScroller,
+                _this.timeAxis.layout.bodyScroller
+            ]);
+            // after scrolljoiner
+            _this.spreadsheetBodyStickyScroller = new TimelinePlugin.StickyScroller(_this.spreadsheet.layout.bodyScroller.enhancedScroll, _this.isRtl, true // isVertical
+            );
+            _this.spreadsheet.receiveProps({
+                superHeaderText: _this.superHeaderText,
+                colSpecs: _this.colSpecs
+            });
+            // Component...
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.timeAxis.slats.el
+            });
+            return _this;
+        }
+        ResourceTimelineView.prototype.renderSkeletonHtml = function () {
+            var theme = this.theme;
+            return "<table class=\"" + theme.getClass('tableGrid') + "\"> <thead class=\"fc-head\"> <tr> <td class=\"fc-resource-area " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-divider fc-col-resizer " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-time-area " + theme.getClass('widgetHeader') + "\"></td> </tr> </thead> <tbody class=\"fc-body\"> <tr> <td class=\"fc-resource-area " + theme.getClass('widgetContent') + "\"></td> <td class=\"fc-divider fc-col-resizer " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-time-area " + theme.getClass('widgetContent') + "\"></td> </tr> </tbody> </table>";
+        };
+        ResourceTimelineView.prototype.render = function (props) {
+            _super.prototype.render.call(this, props);
+            var splitProps = this.splitter.splitProps(props);
+            var hasResourceBusinessHours = this.hasResourceBusinessHours(props.resourceStore);
+            this.timeAxis.receiveProps({
+                dateProfile: props.dateProfile
+            });
+            // for all-resource bg events / selections / business-hours
+            this.lane.receiveProps(__assign({}, splitProps[''], { dateProfile: props.dateProfile, nextDayThreshold: this.nextDayThreshold, businessHours: hasResourceBusinessHours ? null : props.businessHours }));
+            var newRowNodes = this.buildRowNodes(props.resourceStore, this.groupSpecs, this.orderSpecs, this.isVGrouping, props.resourceEntityExpansions, this.opt('resourcesInitiallyExpanded'));
+            this._updateHasNesting(this.hasNesting(newRowNodes));
+            this.diffRows(newRowNodes);
+            this.renderRows(props.dateProfile, hasResourceBusinessHours ? props.businessHours : null, // CONFUSING, comment
+            splitProps);
+        };
+        ResourceTimelineView.prototype.updateHasNesting = function (isNesting) {
+            var classList = this.el.classList;
+            if (isNesting) {
+                classList.remove('fc-flat');
+            }
+            else {
+                classList.add('fc-flat');
+            }
+        };
+        ResourceTimelineView.prototype.diffRows = function (newNodes) {
+            var oldNodes = this.rowNodes;
+            var oldLen = oldNodes.length;
+            var oldIndexHash = {}; // id -> index
+            var oldI = 0;
+            var newI = 0;
+            for (oldI = 0; oldI < oldLen; oldI++) {
+                oldIndexHash[oldNodes[oldI].id] = oldI;
+            }
+            // iterate new nodes
+            for (oldI = 0, newI = 0; newI < newNodes.length; newI++) {
+                var newNode = newNodes[newI];
+                var oldIFound = oldIndexHash[newNode.id];
+                if (oldIFound != null && oldIFound >= oldI) {
+                    this.removeRows(newI, oldIFound - oldI, oldNodes); // won't do anything if same index
+                    oldI = oldIFound + 1;
+                }
+                else {
+                    this.addRow(newI, newNode);
+                }
+            }
+            // old rows that weren't found need to be removed
+            this.removeRows(newI, oldLen - oldI, oldNodes); // won't do anything if same index
+            this.rowNodes = newNodes;
+        };
+        /*
+        rowComponents is the in-progress result
+        */
+        ResourceTimelineView.prototype.addRow = function (index, rowNode) {
+            var _a = this, rowComponents = _a.rowComponents, rowComponentsById = _a.rowComponentsById;
+            var nextComponent = rowComponents[index];
+            var newComponent = this.buildChildComponent(rowNode, this.spreadsheet.bodyTbody, nextComponent ? nextComponent.spreadsheetTr : null, this.timeAxisTbody, nextComponent ? nextComponent.timeAxisTr : null);
+            rowComponents.splice(index, 0, newComponent);
+            rowComponentsById[rowNode.id] = newComponent;
+        };
+        ResourceTimelineView.prototype.removeRows = function (startIndex, len, oldRowNodes) {
+            if (len) {
+                var _a = this, rowComponents = _a.rowComponents, rowComponentsById = _a.rowComponentsById;
+                for (var i = 0; i < len; i++) {
+                    var rowComponent = rowComponents[startIndex + i];
+                    rowComponent.destroy();
+                    delete rowComponentsById[oldRowNodes[i].id];
+                }
+                rowComponents.splice(startIndex, len);
+            }
+        };
+        ResourceTimelineView.prototype.buildChildComponent = function (node, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext) {
+            if (node.group) {
+                return new GroupRow(this.context, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext);
+            }
+            else if (node.resource) {
+                return new ResourceRow(this.context, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext, this.timeAxis);
+            }
+        };
+        ResourceTimelineView.prototype.renderRows = function (dateProfile, fallbackBusinessHours, splitProps) {
+            var _a = this, rowNodes = _a.rowNodes, rowComponents = _a.rowComponents;
+            for (var i = 0; i < rowNodes.length; i++) {
+                var rowNode = rowNodes[i];
+                var rowComponent = rowComponents[i];
+                if (rowNode.group) {
+                    rowComponent.receiveProps({
+                        spreadsheetColCnt: this.colSpecs.length,
+                        id: rowNode.id,
+                        isExpanded: rowNode.isExpanded,
+                        group: rowNode.group
+                    });
+                }
+                else {
+                    var resource = rowNode.resource;
+                    rowComponent.receiveProps(__assign({}, splitProps[resource.id], { dateProfile: dateProfile, nextDayThreshold: this.nextDayThreshold, businessHours: resource.businessHours || fallbackBusinessHours, colSpecs: this.colSpecs, id: rowNode.id, rowSpans: rowNode.rowSpans, depth: rowNode.depth, isExpanded: rowNode.isExpanded, hasChildren: rowNode.hasChildren, resource: rowNode.resource }));
+                }
+            }
+        };
+        ResourceTimelineView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
+            // FYI: this ordering is really important
+            var calendar = this.calendar;
+            var isBaseSizing = isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated;
+            if (isBaseSizing) {
+                this.syncHeadHeights();
+                this.timeAxis.updateSize(isResize, viewHeight - this.miscHeight, isAuto);
+                this.spreadsheet.updateSize(isResize, viewHeight - this.miscHeight, isAuto);
+            }
+            var rowSizingCnt = this.updateRowSizes(isResize);
+            this.lane.updateSize(isResize); // is efficient. uses flags
+            if (isBaseSizing || rowSizingCnt) {
+                this.bodyScrollJoiner.update();
+                this.timeAxis.layout.scrollJoiner.update(); // hack
+                this.rowPositions = new core.PositionCache(this.timeAxis.slats.el, this.rowComponents.map(function (rowComponent) {
+                    return rowComponent.timeAxisTr;
+                }), false, // isHorizontal
+                true // isVertical
+                );
+                this.rowPositions.build();
+                this.isStickyScrollDirty = true;
+            }
+        };
+        ResourceTimelineView.prototype.syncHeadHeights = function () {
+            var spreadsheetHeadEl = this.spreadsheet.header.tableEl;
+            var timeAxisHeadEl = this.timeAxis.header.tableEl;
+            spreadsheetHeadEl.style.height = '';
+            timeAxisHeadEl.style.height = '';
+            var max = Math.max(spreadsheetHeadEl.offsetHeight, timeAxisHeadEl.offsetHeight);
+            spreadsheetHeadEl.style.height =
+                timeAxisHeadEl.style.height = max + 'px';
+        };
+        ResourceTimelineView.prototype.updateRowSizes = function (isResize) {
+            var dirtyRowComponents = this.rowComponents;
+            if (!isResize) {
+                dirtyRowComponents = dirtyRowComponents.filter(function (rowComponent) {
+                    return rowComponent.isSizeDirty;
+                });
+            }
+            var elArrays = dirtyRowComponents.map(function (rowComponent) {
+                return rowComponent.getHeightEls();
+            });
+            // reset to natural heights
+            for (var _i = 0, elArrays_1 = elArrays; _i < elArrays_1.length; _i++) {
+                var elArray = elArrays_1[_i];
+                for (var _a = 0, elArray_1 = elArray; _a < elArray_1.length; _a++) {
+                    var el = elArray_1[_a];
+                    el.style.height = '';
+                }
+            }
+            // let rows update their contents' heights
+            for (var _b = 0, dirtyRowComponents_1 = dirtyRowComponents; _b < dirtyRowComponents_1.length; _b++) {
+                var rowComponent = dirtyRowComponents_1[_b];
+                rowComponent.updateSize(isResize); // will reset isSizeDirty
+            }
+            var maxHeights = elArrays.map(function (elArray) {
+                var maxHeight = null;
+                for (var _i = 0, elArray_2 = elArray; _i < elArray_2.length; _i++) {
+                    var el = elArray_2[_i];
+                    var height = el.getBoundingClientRect().height;
+                    if (maxHeight === null || height > maxHeight) {
+                        maxHeight = height;
+                    }
+                }
+                return maxHeight;
+            });
+            for (var i = 0; i < elArrays.length; i++) {
+                for (var _c = 0, _d = elArrays[i]; _c < _d.length; _c++) {
+                    var el = _d[_c];
+                    el.style.height = maxHeights[i] + 'px';
+                }
+            }
+            return dirtyRowComponents.length;
+        };
+        ResourceTimelineView.prototype.destroy = function () {
+            for (var _i = 0, _a = this.rowComponents; _i < _a.length; _i++) {
+                var rowComponent = _a[_i];
+                rowComponent.destroy();
+            }
+            this.rowNodes = [];
+            this.rowComponents = [];
+            this.spreadsheet.destroy();
+            this.timeAxis.destroy();
+            for (var _b = 0, _c = this.resourceAreaWidthDraggings; _b < _c.length; _b++) {
+                var resourceAreaWidthDragging = _c[_b];
+                resourceAreaWidthDragging.destroy();
+            }
+            this.spreadsheetBodyStickyScroller.destroy();
+            _super.prototype.destroy.call(this);
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        // Now Indicator
+        // ------------------------------------------------------------------------------------------
+        ResourceTimelineView.prototype.getNowIndicatorUnit = function (dateProfile) {
+            return this.timeAxis.getNowIndicatorUnit(dateProfile);
+        };
+        ResourceTimelineView.prototype.renderNowIndicator = function (date) {
+            this.timeAxis.renderNowIndicator(date);
+        };
+        ResourceTimelineView.prototype.unrenderNowIndicator = function () {
+            this.timeAxis.unrenderNowIndicator();
+        };
+        // Scrolling
+        // ------------------------------------------------------------------------------------------------------------------
+        // this is useful for scrolling prev/next dates while resource is scrolled down
+        ResourceTimelineView.prototype.queryScroll = function () {
+            var scroll = _super.prototype.queryScroll.call(this);
+            if (this.props.resourceStore) {
+                __assign(scroll, this.queryResourceScroll());
+            }
+            return scroll;
+        };
+        ResourceTimelineView.prototype.applyScroll = function (scroll, isResize) {
+            _super.prototype.applyScroll.call(this, scroll, isResize);
+            if (this.props.resourceStore) {
+                this.applyResourceScroll(scroll);
+            }
+            // avoid updating stickyscroll too often
+            if (isResize || this.isStickyScrollDirty) {
+                this.isStickyScrollDirty = false;
+                this.spreadsheetBodyStickyScroller.updateSize();
+                this.timeAxis.updateStickyScrollers();
+            }
+        };
+        ResourceTimelineView.prototype.computeDateScroll = function (timeMs) {
+            return this.timeAxis.computeDateScroll(timeMs);
+        };
+        ResourceTimelineView.prototype.queryDateScroll = function () {
+            return this.timeAxis.queryDateScroll();
+        };
+        ResourceTimelineView.prototype.applyDateScroll = function (scroll) {
+            this.timeAxis.applyDateScroll(scroll);
+        };
+        ResourceTimelineView.prototype.queryResourceScroll = function () {
+            var _a = this, rowComponents = _a.rowComponents, rowNodes = _a.rowNodes;
+            var scroll = {};
+            var scrollerTop = this.timeAxis.layout.bodyScroller.el.getBoundingClientRect().top; // fixed position
+            for (var i = 0; i < rowComponents.length; i++) {
+                var rowComponent = rowComponents[i];
+                var rowNode = rowNodes[i];
+                var el = rowComponent.timeAxisTr;
+                var elBottom = el.getBoundingClientRect().bottom; // fixed position
+                if (elBottom > scrollerTop) {
+                    scroll.rowId = rowNode.id;
+                    scroll.bottom = elBottom - scrollerTop;
+                    break;
+                }
+            }
+            // TODO: what about left scroll state for spreadsheet area?
+            return scroll;
+        };
+        ResourceTimelineView.prototype.applyResourceScroll = function (scroll) {
+            var rowId = scroll.forcedRowId || scroll.rowId;
+            if (rowId) {
+                var rowComponent = this.rowComponentsById[rowId];
+                if (rowComponent) {
+                    var el = rowComponent.timeAxisTr;
+                    if (el) {
+                        var innerTop = this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.el.getBoundingClientRect().top;
+                        var rowRect = el.getBoundingClientRect();
+                        var scrollTop = (scroll.forcedRowId ?
+                            rowRect.top : // just use top edge
+                            rowRect.bottom - scroll.bottom) - // pixels from bottom edge
+                            innerTop;
+                        this.timeAxis.layout.bodyScroller.enhancedScroll.setScrollTop(scrollTop);
+                        this.spreadsheet.layout.bodyScroller.enhancedScroll.setScrollTop(scrollTop);
+                    }
+                }
+            }
+        };
+        // TODO: scrollToResource
+        // Hit System
+        // ------------------------------------------------------------------------------------------
+        ResourceTimelineView.prototype.buildPositionCaches = function () {
+            this.timeAxis.slats.updateSize();
+            this.rowPositions.build();
+        };
+        ResourceTimelineView.prototype.queryHit = function (positionLeft, positionTop) {
+            var rowPositions = this.rowPositions;
+            var slats = this.timeAxis.slats;
+            var rowIndex = rowPositions.topToIndex(positionTop);
+            if (rowIndex != null) {
+                var resource = this.rowNodes[rowIndex].resource;
+                if (resource) { // not a group
+                    var slatHit = slats.positionToHit(positionLeft);
+                    if (slatHit) {
+                        return {
+                            component: this,
+                            dateSpan: {
+                                range: slatHit.dateSpan.range,
+                                allDay: slatHit.dateSpan.allDay,
+                                resourceId: resource.id
+                            },
+                            rect: {
+                                left: slatHit.left,
+                                right: slatHit.right,
+                                top: rowPositions.tops[rowIndex],
+                                bottom: rowPositions.bottoms[rowIndex]
+                            },
+                            dayEl: slatHit.dayEl,
+                            layer: 0
+                        };
+                    }
+                }
+            }
+        };
+        // Resource Area
+        // ------------------------------------------------------------------------------------------------------------------
+        ResourceTimelineView.prototype.setResourceAreaWidth = function (widthVal) {
+            this.resourceAreaWidth = widthVal;
+            core.applyStyleProp(this.resourceAreaHeadEl, 'width', widthVal || '');
+        };
+        ResourceTimelineView.prototype.initResourceAreaWidthDragging = function () {
+            var _this = this;
+            var resourceAreaDividerEls = Array.prototype.slice.call(this.el.querySelectorAll('.fc-col-resizer'));
+            var ElementDraggingImpl = this.calendar.pluginSystem.hooks.elementDraggingImpl;
+            if (ElementDraggingImpl) {
+                this.resourceAreaWidthDraggings = resourceAreaDividerEls.map(function (el) {
+                    var dragging = new ElementDraggingImpl(el);
+                    var dragStartWidth;
+                    var viewWidth;
+                    dragging.emitter.on('dragstart', function () {
+                        dragStartWidth = _this.resourceAreaWidth;
+                        if (typeof dragStartWidth !== 'number') {
+                            dragStartWidth = _this.resourceAreaHeadEl.getBoundingClientRect().width;
+                        }
+                        viewWidth = _this.el.getBoundingClientRect().width;
+                    });
+                    dragging.emitter.on('dragmove', function (pev) {
+                        var newWidth = dragStartWidth + pev.deltaX * (_this.isRtl ? -1 : 1);
+                        newWidth = Math.max(newWidth, MIN_RESOURCE_AREA_WIDTH);
+                        newWidth = Math.min(newWidth, viewWidth - MIN_RESOURCE_AREA_WIDTH);
+                        _this.setResourceAreaWidth(newWidth);
+                    });
+                    dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
+                    return dragging;
+                });
+            }
+        };
+        ResourceTimelineView.needsResourceData = true; // for ResourceViewProps
+        return ResourceTimelineView;
+    }(core.View));
+    function hasResourceBusinessHours(resourceStore) {
+        for (var resourceId in resourceStore) {
+            var resource = resourceStore[resourceId];
+            if (resource.businessHours) {
+                return true;
+            }
+        }
+        return false;
+    }
+    function hasNesting(nodes) {
+        for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+            var node = nodes_1[_i];
+            if (node.group) {
+                return true;
+            }
+            else if (node.resource) {
+                if (node.hasChildren) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    var main = core.createPlugin({
+        deps: [ResourceCommonPlugin__default, TimelinePlugin__default],
+        defaultView: 'resourceTimelineDay',
+        views: {
+            resourceTimeline: {
+                class: ResourceTimelineView,
+                resourceAreaWidth: '30%',
+                resourcesInitiallyExpanded: true,
+                eventResizableFromStart: true // TODO: not DRY with this same setting in the main timeline config
+            },
+            resourceTimelineDay: {
+                type: 'resourceTimeline',
+                duration: { days: 1 }
+            },
+            resourceTimelineWeek: {
+                type: 'resourceTimeline',
+                duration: { weeks: 1 }
+            },
+            resourceTimelineMonth: {
+                type: 'resourceTimeline',
+                duration: { months: 1 }
+            },
+            resourceTimelineYear: {
+                type: 'resourceTimeline',
+                duration: { years: 1 }
+            }
+        }
+    });
+
+    exports.ResourceTimelineView = ResourceTimelineView;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/main.min.css b/backoffice/vendors/fullcalendar/resource-timeline/main.min.css
new file mode 100644 (file)
index 0000000..70ef0c8
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar Resource Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/.fc-timeline .fc-divider{width:3px;border-style:double}.fc-timeline .fc-head>tr>.fc-divider{border-bottom:0}.fc-timeline .fc-body>tr>.fc-divider{border-top:0}.fc-resource-area{width:30%}.fc-resource-area col{width:40%;min-width:70px}.fc-resource-area col.fc-main-col{width:60%}.fc-flat .fc-expander-space{display:none}.fc-ltr .fc-resource-area tr>*{text-align:left}.fc-rtl .fc-resource-area tr>*{text-align:right}.fc-resource-area .fc-cell-content{padding-left:4px;padding-right:4px}.fc-resource-area .fc-super th{text-align:center}.fc-resource-area th>div{position:relative}.fc-resource-area th .fc-cell-content{position:relative;z-index:1}.fc-resource-area th .fc-col-resizer{position:absolute;z-index:2;top:0;bottom:0;width:5px}.fc-timeline .fc-col-resizer{cursor:col-resize}.fc-ltr .fc-resource-area th .fc-col-resizer{right:-3px}.fc-rtl .fc-resource-area th .fc-col-resizer{left:-3px}.fc-body .fc-resource-area .fc-cell-content{padding-top:8px;padding-bottom:8px}.fc-no-overlap .fc-body .fc-resource-area .fc-cell-content{padding-top:6px;padding-bottom:6px}.fc-resource-area .fc-icon{display:inline-block;width:1em;text-align:center}.fc-resource-area .fc-expander{cursor:pointer;opacity:.65}.fc-time-area .fc-rows{position:relative;z-index:3}.fc-time-area .fc-rows td>div{position:relative}.fc-time-area .fc-rows .fc-bgevent-container,.fc-time-area .fc-rows .fc-highlight-container{z-index:1}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/main.min.js b/backoffice/vendors/fullcalendar/resource-timeline/main.min.js
new file mode 100644 (file)
index 0000000..89b8d57
--- /dev/null
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Resource Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core"),require("@fullcalendar/timeline"),require("@fullcalendar/resource-common")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/timeline","@fullcalendar/resource-common"],t):(e=e||self,t(e.FullCalendarResourceTimeline={},e.FullCalendar,e.FullCalendarTimeline,e.FullCalendarResourceCommon))}(this,function(e,t,r,o){"use strict";function i(e,t){function r(){this.constructor=e}h(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function s(e,t){var r=e.classList;t?(r.remove("fc-icon-plus-square"),r.add("fc-icon-minus-square")):(r.remove("fc-icon-minus-square"),r.add("fc-icon-plus-square"))}function n(e){var t=e.classList;t.remove("fc-icon-minus-square"),t.remove("fc-icon-plus-square")}function l(e,t){e.setAttribute("data-resource-id",t)}function a(e){for(var t="",r=0;r<e;r++)t+='<span class="fc-icon"></span>';return t+='<span class="fc-expander-space"><span class="fc-icon"></span></span>'}function c(e){for(var t in e){var r=e[t];if(r.businessHours)return!0}return!1}function d(e){for(var t=0,r=e;t<r.length;t++){var o=r[t];if(o.group)return!0;if(o.resource&&o.hasChildren)return!0}return!1}var p="default"in r?r["default"]:r,u="default"in o?o["default"]:o,h=function(e,t){return(h=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},y=function(){return y=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++){t=arguments[r];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e},y.apply(this,arguments)},f=function(e){function r(t,r,o,i,s){var n=e.call(this,t)||this;return n.isSizeDirty=!1,r.insertBefore(n.spreadsheetTr=document.createElement("tr"),o),i.insertBefore(n.timeAxisTr=document.createElement("tr"),s),n}return i(r,e),r.prototype.destroy=function(){t.removeElement(this.spreadsheetTr),t.removeElement(this.timeAxisTr),e.prototype.destroy.call(this)},r.prototype.updateSize=function(e){this.isSizeDirty=!1},r}(t.Component),m=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r._renderCells=t.memoizeRendering(r.renderCells,r.unrenderCells),r._updateExpanderIcon=t.memoizeRendering(r.updateExpanderIcon,null,[r._renderCells]),r.onExpanderClick=function(e){var t=r.props;r.calendar.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:t.id,isExpanded:!t.isExpanded})},r}return i(r,e),r.prototype.render=function(e){this._renderCells(e.group,e.spreadsheetColCnt),this._updateExpanderIcon(e.isExpanded),this.isSizeDirty=!0},r.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderCells.unrender()},r.prototype.renderCells=function(e,r){var o=this.renderSpreadsheetContent(e);this.spreadsheetTr.appendChild(t.createElement("td",{className:"fc-divider",colSpan:r},this.spreadsheetHeightEl=t.createElement("div",null,o))),this.expanderIconEl=o.querySelector(".fc-icon"),this.expanderIconEl.parentElement.addEventListener("click",this.onExpanderClick),this.timeAxisTr.appendChild(t.createElement("td",{className:"fc-divider"},this.timeAxisHeightEl=document.createElement("div")))},r.prototype.unrenderCells=function(){this.spreadsheetTr.innerHTML="",this.timeAxisTr.innerHTML=""},r.prototype.renderSpreadsheetContent=function(e){var r=this.renderCellText(e),o=t.htmlToElement('<div class="fc-cell-content"><span class="fc-expander"><span class="fc-icon"></span></span><span class="fc-cell-text">'+(r?t.htmlEscape(r):"&nbsp;")+"</span></div>"),i=e.spec.render;return"function"==typeof i&&(o=i(o,e.value)||o),o},r.prototype.renderCellText=function(e){var t=e.value||"",r=e.spec.text;return"function"==typeof r&&(t=r(t)||t),t},r.prototype.getHeightEls=function(){return[this.spreadsheetHeightEl,this.timeAxisHeightEl]},r.prototype.updateExpanderIcon=function(e){s(this.expanderIconEl,e)},r}(f);m.addEqualityFuncs({group:o.isGroupsEqual});var g=function(e){function r(r,o){var i=e.call(this,r)||this;return i._renderRow=t.memoizeRendering(i.renderRow,i.unrenderRow),i._updateTrResourceId=t.memoizeRendering(l,null,[i._renderRow]),i._updateExpanderIcon=t.memoizeRendering(i.updateExpanderIcon,null,[i._renderRow]),i.onExpanderClick=function(e){var t=i.props;i.calendar.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:t.id,isExpanded:!t.isExpanded})},i.tr=o,i}return i(r,e),r.prototype.render=function(e){this._renderRow(e.resource,e.rowSpans,e.depth,e.colSpecs),this._updateTrResourceId(this.tr,e.resource.id),this._updateExpanderIcon(e.hasChildren,e.isExpanded)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderRow.unrender()},r.prototype.renderRow=function(e,r,i,s){for(var n,l=this,c=l.tr,d=l.theme,p=l.calendar,u=l.view,h=o.buildResourceFields(e),y=0;y<s.length;y++){var f=s[y],m=r[y];if(0!==m){null==m&&(m=1);var g=void 0;g=f.field?h[f.field]:o.buildResourceTextFunc(f.text,p)(e);var v=t.htmlToElement('<div class="fc-cell-content">'+(f.isMain?a(i):"")+'<span class="fc-cell-text">'+(g?t.htmlEscape(g):"&nbsp;")+"</span></div>");"function"==typeof f.render&&(v=f.render(new o.ResourceApi(p,e),v)||v),m>1&&v.classList.add("fc-sticky");var S=t.createElement("td",{className:d.getClass("widgetContent"),rowspan:m},v);f.isMain&&(S.appendChild(this.heightEl=t.createElement("div",null,S.childNodes)),n=S),c.appendChild(S)}}this.expanderIconEl=c.querySelector(".fc-expander-space .fc-icon"),u.publiclyTrigger("resourceRender",[{resource:new o.ResourceApi(p,e),el:n,view:u}])},r.prototype.unrenderRow=function(){this.tr.innerHTML=""},r.prototype.updateExpanderIcon=function(e,t){var r=this.expanderIconEl,o=r.parentElement;r&&o&&(e?(o.addEventListener("click",this.onExpanderClick),o.classList.add("fc-expander"),s(r,t)):(o.removeEventListener("click",this.onExpanderClick),o.classList.remove("fc-expander"),n(r)))},r}(t.Component),v=function(e){function o(o,i,s,n,a,c){var d=e.call(this,o,i,s,n,a)||this;return d._updateTrResourceId=t.memoizeRendering(l),d.spreadsheetRow=new g(o,d.spreadsheetTr),d.timeAxisTr.appendChild(t.createElement("td",{className:d.theme.getClass("widgetContent")},d.innerContainerEl=document.createElement("div"))),d.lane=new r.TimelineLane(o,d.innerContainerEl,d.innerContainerEl,c),d}return i(o,e),o.prototype.destroy=function(){this.spreadsheetRow.destroy(),this.lane.destroy(),e.prototype.destroy.call(this)},o.prototype.render=function(e){this.spreadsheetRow.receiveProps({colSpecs:e.colSpecs,id:e.id,rowSpans:e.rowSpans,depth:e.depth,isExpanded:e.isExpanded,hasChildren:e.hasChildren,resource:e.resource}),this._updateTrResourceId(this.timeAxisTr,e.resource.id),this.lane.receiveProps({dateProfile:e.dateProfile,nextDayThreshold:e.nextDayThreshold,businessHours:e.businessHours,eventStore:e.eventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize}),this.isSizeDirty=!0},o.prototype.updateSize=function(t){e.prototype.updateSize.call(this,t),this.lane.updateSize(t)},o.prototype.getHeightEls=function(){return[this.spreadsheetRow.heightEl,this.innerContainerEl]},o}(f);v.addEqualityFuncs({rowSpans:t.isArraysEqual});var S=30,x=function(e){function r(r,o){var i=e.call(this,r)||this;return i.resizables=[],i.colWidths=[],i.emitter=new t.EmitterMixin,o.appendChild(i.tableEl=t.createElement("table",{className:i.theme.getClass("tableGrid")})),i}return i(r,e),r.prototype.destroy=function(){for(var r=0,o=this.resizables;r<o.length;r++){var i=o[r];i.destroy()}t.removeElement(this.tableEl),e.prototype.destroy.call(this)},r.prototype.render=function(e){var r=this.theme,o=e.colSpecs,i="<colgroup>"+e.colTags+"</colgroup><tbody>";e.superHeaderText&&(i+='<tr class="fc-super"><th class="'+r.getClass("widgetHeader")+'" colspan="'+o.length+'"><div class="fc-cell-content"><span class="fc-cell-text">'+t.htmlEscape(e.superHeaderText)+"</span></div></th></tr>"),i+="<tr>";for(var s=0;s<o.length;s++){var n=o[s],l=s===o.length-1;i+='<th class="'+r.getClass("widgetHeader")+'"><div><div class="fc-cell-content">'+(n.isMain?'<span class="fc-expander-space"><span class="fc-icon"></span></span>':"")+'<span class="fc-cell-text">'+t.htmlEscape(n.labelText||"")+"</span></div>"+(l?"":'<div class="fc-col-resizer"></div>')+"</div></th>"}i+="</tr>",i+="</tbody>",this.tableEl.innerHTML=i,this.thEls=Array.prototype.slice.call(this.tableEl.querySelectorAll("th")),this.colEls=Array.prototype.slice.call(this.tableEl.querySelectorAll("col")),this.resizerEls=Array.prototype.slice.call(this.tableEl.querySelectorAll(".fc-col-resizer")),this.initColResizing()},r.prototype.initColResizing=function(){var e=this,t=this.calendar.pluginSystem.hooks.elementDraggingImpl;t&&(this.resizables=this.resizerEls.map(function(r,o){var i,s=new t(r);return s.emitter.on("dragstart",function(){i=e.colWidths[o],"number"!=typeof i&&(i=e.thEls[o].getBoundingClientRect().width)}),s.emitter.on("dragmove",function(t){e.colWidths[o]=Math.max(i+t.deltaX*(e.isRtl?-1:1),S),e.emitter.trigger("colwidthchange",e.colWidths)}),s.setAutoScrollEnabled(!1),s}))},r}(t.Component),E=function(e){function o(o,i,s){var n=e.call(this,o)||this;n._renderCells=t.memoizeRendering(n.renderCells,n.unrenderCells),n.layout=new r.HeaderBodyLayout(i,s,"clipped-scroll");var l=n.layout.headerScroller.enhancedScroll,a=n.layout.bodyScroller.enhancedScroll;return n.header=new x(o,l.canvas.contentEl),n.header.emitter.on("colwidthchange",function(e){n.applyColWidths(e)}),a.canvas.contentEl.appendChild(n.bodyContainerEl=t.createElement("div",{className:"fc-rows"},"<table><colgroup /><tbody /></table>")),n.bodyColGroup=n.bodyContainerEl.querySelector("colgroup"),n.bodyTbody=n.bodyContainerEl.querySelector("tbody"),n}return i(o,e),o.prototype.destroy=function(){this.header.destroy(),this.layout.destroy(),this._renderCells.unrender(),e.prototype.destroy.call(this)},o.prototype.render=function(e){this._renderCells(e.superHeaderText,e.colSpecs)},o.prototype.renderCells=function(e,t){var r=this.renderColTags(t);this.header.receiveProps({superHeaderText:e,colSpecs:t,colTags:r}),this.bodyColGroup.innerHTML=r,this.bodyColEls=Array.prototype.slice.call(this.bodyColGroup.querySelectorAll("col")),this.applyColWidths(t.map(function(e){return e.width}))},o.prototype.unrenderCells=function(){this.bodyColGroup.innerHTML=""},o.prototype.renderColTags=function(e){for(var t="",r=0,o=e;r<o.length;r++){var i=o[r];t+=i.isMain?'<col class="fc-main-col"/>':"<col/>"}return t},o.prototype.updateSize=function(e,t,r){this.layout.setHeight(t,r)},o.prototype.applyColWidths=function(e){var t=this;e.forEach(function(e,r){var o,i=t.header.colEls[r],s=t.bodyColEls[r];"number"==typeof e?o=e+"px":null==typeof e&&(o=""),i.style.width=s.style.width=o})},o}(t.Component),C=30,w=function(e){function s(i,s,n,l){var a=e.call(this,i,s,n,l)||this;a.isStickyScrollDirty=!1,a.rowNodes=[],a.rowComponents=[],a.rowComponentsById={},a.resourceAreaWidthDraggings=[],a.splitter=new o.ResourceSplitter,a.hasResourceBusinessHours=t.memoize(c),a.buildRowNodes=t.memoize(o.buildRowNodes),a.hasNesting=t.memoize(d),a._updateHasNesting=t.memoizeRendering(a.updateHasNesting);var p=a.opt("resourceColumns")||[],u=a.opt("resourceLabelText"),h="Resources",y=null;p.length?y=u:p.push({labelText:u||h,text:o.buildResourceTextFunc(a.opt("resourceText"),a.calendar)});for(var f=[],m=[],g=[],v=!1,S=!1,x=0,C=p;x<C.length;x++){var w=C[x];w.group?m.push(w):f.push(w)}if(f[0].isMain=!0,m.length)g=m,v=!0;else{var b=a.opt("resourceGroupField");b&&(S=!0,g.push({field:b,text:a.opt("resourceGroupText"),render:a.opt("resourceGroupRender")}))}for(var T=t.parseFieldSpecs(a.opt("resourceOrder")),R=[],A=0,H=T;A<H.length;A++){for(var z=H[A],I=!1,D=0,_=g;D<_.length;D++){var q=_[D];if(q.field===z.field){q.order=z.order,I=!0;break}}I||R.push(z)}a.superHeaderText=y,a.isVGrouping=v,a.isHGrouping=S,a.groupSpecs=g,a.colSpecs=m.concat(f),a.orderSpecs=R,a.el.classList.add("fc-timeline"),a.opt("eventOverlap")===!1&&a.el.classList.add("fc-no-overlap"),a.el.innerHTML=a.renderSkeletonHtml(),a.resourceAreaHeadEl=a.el.querySelector("thead .fc-resource-area"),a.setResourceAreaWidth(a.opt("resourceAreaWidth")),a.initResourceAreaWidthDragging(),a.miscHeight=a.el.offsetHeight,a.spreadsheet=new E(a.context,a.resourceAreaHeadEl,a.el.querySelector("tbody .fc-resource-area")),a.timeAxis=new r.TimeAxis(a.context,a.el.querySelector("thead .fc-time-area"),a.el.querySelector("tbody .fc-time-area"));var N=t.createElement("div",{className:"fc-rows"},"<table><tbody /></table>");return a.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl.appendChild(N),a.timeAxisTbody=N.querySelector("tbody"),a.lane=new r.TimelineLane(a.context,null,a.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl,a.timeAxis),a.bodyScrollJoiner=new r.ScrollJoiner("vertical",[a.spreadsheet.layout.bodyScroller,a.timeAxis.layout.bodyScroller]),a.spreadsheetBodyStickyScroller=new r.StickyScroller(a.spreadsheet.layout.bodyScroller.enhancedScroll,a.isRtl,(!0)),a.spreadsheet.receiveProps({superHeaderText:a.superHeaderText,colSpecs:a.colSpecs}),i.calendar.registerInteractiveComponent(a,{el:a.timeAxis.slats.el}),a}return i(s,e),s.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'"> <thead class="fc-head"> <tr> <td class="fc-resource-area '+e.getClass("widgetHeader")+'"></td> <td class="fc-divider fc-col-resizer '+e.getClass("widgetHeader")+'"></td> <td class="fc-time-area '+e.getClass("widgetHeader")+'"></td> </tr> </thead> <tbody class="fc-body"> <tr> <td class="fc-resource-area '+e.getClass("widgetContent")+'"></td> <td class="fc-divider fc-col-resizer '+e.getClass("widgetHeader")+'"></td> <td class="fc-time-area '+e.getClass("widgetContent")+'"></td> </tr> </tbody> </table>'},s.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.splitter.splitProps(t),o=this.hasResourceBusinessHours(t.resourceStore);this.timeAxis.receiveProps({dateProfile:t.dateProfile}),this.lane.receiveProps(y({},r[""],{dateProfile:t.dateProfile,nextDayThreshold:this.nextDayThreshold,businessHours:o?null:t.businessHours}));var i=this.buildRowNodes(t.resourceStore,this.groupSpecs,this.orderSpecs,this.isVGrouping,t.resourceEntityExpansions,this.opt("resourcesInitiallyExpanded"));this._updateHasNesting(this.hasNesting(i)),this.diffRows(i),this.renderRows(t.dateProfile,o?t.businessHours:null,r)},s.prototype.updateHasNesting=function(e){var t=this.el.classList;e?t.remove("fc-flat"):t.add("fc-flat")},s.prototype.diffRows=function(e){var t=this.rowNodes,r=t.length,o={},i=0,s=0;for(i=0;i<r;i++)o[t[i].id]=i;for(i=0,s=0;s<e.length;s++){var n=e[s],l=o[n.id];null!=l&&l>=i?(this.removeRows(s,l-i,t),i=l+1):this.addRow(s,n)}this.removeRows(s,r-i,t),this.rowNodes=e},s.prototype.addRow=function(e,t){var r=this,o=r.rowComponents,i=r.rowComponentsById,s=o[e],n=this.buildChildComponent(t,this.spreadsheet.bodyTbody,s?s.spreadsheetTr:null,this.timeAxisTbody,s?s.timeAxisTr:null);o.splice(e,0,n),i[t.id]=n},s.prototype.removeRows=function(e,t,r){if(t){for(var o=this,i=o.rowComponents,s=o.rowComponentsById,n=0;n<t;n++){var l=i[e+n];l.destroy(),delete s[r[n].id]}i.splice(e,t)}},s.prototype.buildChildComponent=function(e,t,r,o,i){return e.group?new m(this.context,t,r,o,i):e.resource?new v(this.context,t,r,o,i,this.timeAxis):void 0},s.prototype.renderRows=function(e,t,r){for(var o=this,i=o.rowNodes,s=o.rowComponents,n=0;n<i.length;n++){var l=i[n],a=s[n];if(l.group)a.receiveProps({spreadsheetColCnt:this.colSpecs.length,id:l.id,isExpanded:l.isExpanded,group:l.group});else{var c=l.resource;a.receiveProps(y({},r[c.id],{dateProfile:e,nextDayThreshold:this.nextDayThreshold,businessHours:c.businessHours||t,colSpecs:this.colSpecs,id:l.id,rowSpans:l.rowSpans,depth:l.depth,isExpanded:l.isExpanded,hasChildren:l.hasChildren,resource:l.resource}))}}},s.prototype.updateSize=function(e,r,o){var i=this.calendar,s=e||i.isViewUpdated||i.isDatesUpdated||i.isEventsUpdated;s&&(this.syncHeadHeights(),this.timeAxis.updateSize(e,r-this.miscHeight,o),this.spreadsheet.updateSize(e,r-this.miscHeight,o));var n=this.updateRowSizes(e);this.lane.updateSize(e),(s||n)&&(this.bodyScrollJoiner.update(),this.timeAxis.layout.scrollJoiner.update(),this.rowPositions=new t.PositionCache(this.timeAxis.slats.el,this.rowComponents.map(function(e){return e.timeAxisTr}),(!1),(!0)),this.rowPositions.build(),this.isStickyScrollDirty=!0)},s.prototype.syncHeadHeights=function(){var e=this.spreadsheet.header.tableEl,t=this.timeAxis.header.tableEl;e.style.height="",t.style.height="";var r=Math.max(e.offsetHeight,t.offsetHeight);e.style.height=t.style.height=r+"px"},s.prototype.updateRowSizes=function(e){var t=this.rowComponents;e||(t=t.filter(function(e){return e.isSizeDirty}));for(var r=t.map(function(e){return e.getHeightEls()}),o=0,i=r;o<i.length;o++)for(var s=i[o],n=0,l=s;n<l.length;n++){var a=l[n];a.style.height=""}for(var c=0,d=t;c<d.length;c++){var p=d[c];p.updateSize(e)}for(var u=r.map(function(e){for(var t=null,r=0,o=e;r<o.length;r++){var i=o[r],s=i.getBoundingClientRect().height;(null===t||s>t)&&(t=s)}return t}),h=0;h<r.length;h++)for(var y=0,f=r[h];y<f.length;y++){var a=f[y];a.style.height=u[h]+"px"}return t.length},s.prototype.destroy=function(){for(var t=0,r=this.rowComponents;t<r.length;t++){var o=r[t];o.destroy()}this.rowNodes=[],this.rowComponents=[],this.spreadsheet.destroy(),this.timeAxis.destroy();for(var i=0,s=this.resourceAreaWidthDraggings;i<s.length;i++){var n=s[i];n.destroy()}this.spreadsheetBodyStickyScroller.destroy(),e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},s.prototype.getNowIndicatorUnit=function(e){return this.timeAxis.getNowIndicatorUnit(e)},s.prototype.renderNowIndicator=function(e){this.timeAxis.renderNowIndicator(e)},s.prototype.unrenderNowIndicator=function(){this.timeAxis.unrenderNowIndicator()},s.prototype.queryScroll=function(){var t=e.prototype.queryScroll.call(this);return this.props.resourceStore&&y(t,this.queryResourceScroll()),t},s.prototype.applyScroll=function(t,r){e.prototype.applyScroll.call(this,t,r),this.props.resourceStore&&this.applyResourceScroll(t),(r||this.isStickyScrollDirty)&&(this.isStickyScrollDirty=!1,this.spreadsheetBodyStickyScroller.updateSize(),this.timeAxis.updateStickyScrollers())},s.prototype.computeDateScroll=function(e){return this.timeAxis.computeDateScroll(e)},s.prototype.queryDateScroll=function(){return this.timeAxis.queryDateScroll()},s.prototype.applyDateScroll=function(e){this.timeAxis.applyDateScroll(e)},s.prototype.queryResourceScroll=function(){for(var e=this,t=e.rowComponents,r=e.rowNodes,o={},i=this.timeAxis.layout.bodyScroller.el.getBoundingClientRect().top,s=0;s<t.length;s++){var n=t[s],l=r[s],a=n.timeAxisTr,c=a.getBoundingClientRect().bottom;if(c>i){o.rowId=l.id,o.bottom=c-i;break}}return o},s.prototype.applyResourceScroll=function(e){var t=e.forcedRowId||e.rowId;if(t){var r=this.rowComponentsById[t];if(r){var o=r.timeAxisTr;if(o){var i=this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.el.getBoundingClientRect().top,s=o.getBoundingClientRect(),n=(e.forcedRowId?s.top:s.bottom-e.bottom)-i;this.timeAxis.layout.bodyScroller.enhancedScroll.setScrollTop(n),this.spreadsheet.layout.bodyScroller.enhancedScroll.setScrollTop(n)}}}},s.prototype.buildPositionCaches=function(){this.timeAxis.slats.updateSize(),this.rowPositions.build()},s.prototype.queryHit=function(e,t){var r=this.rowPositions,o=this.timeAxis.slats,i=r.topToIndex(t);if(null!=i){var s=this.rowNodes[i].resource;if(s){var n=o.positionToHit(e);if(n)return{component:this,dateSpan:{range:n.dateSpan.range,allDay:n.dateSpan.allDay,resourceId:s.id},rect:{left:n.left,right:n.right,top:r.tops[i],bottom:r.bottoms[i]},dayEl:n.dayEl,layer:0}}}},s.prototype.setResourceAreaWidth=function(e){this.resourceAreaWidth=e,t.applyStyleProp(this.resourceAreaHeadEl,"width",e||"")},s.prototype.initResourceAreaWidthDragging=function(){var e=this,t=Array.prototype.slice.call(this.el.querySelectorAll(".fc-col-resizer")),r=this.calendar.pluginSystem.hooks.elementDraggingImpl;r&&(this.resourceAreaWidthDraggings=t.map(function(t){var o,i,s=new r(t);return s.emitter.on("dragstart",function(){o=e.resourceAreaWidth,"number"!=typeof o&&(o=e.resourceAreaHeadEl.getBoundingClientRect().width),i=e.el.getBoundingClientRect().width}),s.emitter.on("dragmove",function(t){var r=o+t.deltaX*(e.isRtl?-1:1);r=Math.max(r,C),r=Math.min(r,i-C),e.setResourceAreaWidth(r)}),s.setAutoScrollEnabled(!1),s}))},s.needsResourceData=!0,s}(t.View),b=t.createPlugin({deps:[u,p],defaultView:"resourceTimelineDay",views:{resourceTimeline:{"class":w,resourceAreaWidth:"30%",resourcesInitiallyExpanded:!0,eventResizableFromStart:!0},resourceTimelineDay:{type:"resourceTimeline",duration:{days:1}},resourceTimelineWeek:{type:"resourceTimeline",duration:{weeks:1}},resourceTimelineMonth:{type:"resourceTimeline",duration:{months:1}},resourceTimelineYear:{type:"resourceTimeline",duration:{years:1}}}});e.ResourceTimelineView=w,e["default"]=b,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/resource-timeline/package.json b/backoffice/vendors/fullcalendar/resource-timeline/package.json
new file mode 100644 (file)
index 0000000..cafcc1a
--- /dev/null
@@ -0,0 +1,61 @@
+{
+  "_from": "@fullcalendar/resource-timeline",
+  "_id": "@fullcalendar/resource-timeline@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-/FZpwyjvZD3IhV+Y2yLnqiiXEbN0AeZDmb5ACGOqHrqDyEnA+gkbOq83K46lf9CGJOMlE9jqb5Hbx7VMRxGaEA==",
+  "_location": "/@fullcalendar/resource-timeline",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/resource-timeline",
+    "name": "@fullcalendar/resource-timeline",
+    "escapedName": "@fullcalendar%2fresource-timeline",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/resource-timeline/-/resource-timeline-4.1.0.tgz",
+  "_shasum": "d4e8ee18a98c55f138a4dfe73e1fe8fda6ac721a",
+  "_spec": "@fullcalendar/resource-timeline",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/fullcalendar/fullcalendar-scheduler/issues"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "dependencies": {
+    "@fullcalendar/resource-common": "~4.1.0",
+    "@fullcalendar/timeline": "~4.1.0"
+  },
+  "deprecated": false,
+  "description": "Display events and resources on a horizontal time axis",
+  "docs": "https://fullcalendar.io/docs/timeline-view",
+  "homepage": "https://fullcalendar.io/scheduler",
+  "license": "SEE LICENSE IN LICENSE.md",
+  "main": "main.js",
+  "name": "@fullcalendar/resource-timeline",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar-scheduler.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
+  },
+  "title": "FullCalendar Resource Timeline Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/rrule/LICENSE.txt b/backoffice/vendors/fullcalendar/rrule/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/rrule/README.md b/backoffice/vendors/fullcalendar/rrule/README.md
new file mode 100644 (file)
index 0000000..7b56bed
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar RRule Plugin
+
+A connector to the RRule library, for recurring events
+
+[View the docs &raquo;](https://fullcalendar.io/docs/rrule-plugin)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/rrule/main.d.ts b/backoffice/vendors/fullcalendar/rrule/main.d.ts
new file mode 100644 (file)
index 0000000..96216f4
--- /dev/null
@@ -0,0 +1,4 @@
+declare module "@fullcalendar/rrule" {
+    const _default_13: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_13;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/rrule/main.js b/backoffice/vendors/fullcalendar/rrule/main.js
new file mode 100644 (file)
index 0000000..0887c45
--- /dev/null
@@ -0,0 +1,127 @@
+/*!
+FullCalendar RRule Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rrule'), require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', 'rrule', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarRrule = {}, global.rrule, global.FullCalendar));
+}(this, function (exports, rrule, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    var EVENT_DEF_PROPS = {
+        rrule: null,
+        duration: core.createDuration
+    };
+    var recurring = {
+        parse: function (rawEvent, leftoverProps, dateEnv) {
+            if (rawEvent.rrule != null) {
+                var props = core.refineProps(rawEvent, EVENT_DEF_PROPS, {}, leftoverProps);
+                var parsed = parseRRule(props.rrule, dateEnv);
+                if (parsed) {
+                    return {
+                        typeData: parsed.rrule,
+                        allDayGuess: parsed.allDayGuess,
+                        duration: props.duration
+                    };
+                }
+            }
+            return null;
+        },
+        expand: function (rrule, framingRange) {
+            // we WANT an inclusive start and in exclusive end, but the js rrule lib will only do either BOTH
+            // inclusive or BOTH exclusive, which is stupid: https://github.com/jakubroztocil/rrule/issues/84
+            // Workaround: make inclusive, which will generate extra occurences, and then trim.
+            return rrule.between(framingRange.start, framingRange.end, true)
+                .filter(function (date) {
+                return date.valueOf() < framingRange.end.valueOf();
+            });
+        }
+    };
+    var main = core.createPlugin({
+        recurringTypes: [recurring]
+    });
+    function parseRRule(input, dateEnv) {
+        var allDayGuess = null;
+        var rrule$1;
+        if (typeof input === 'string') {
+            rrule$1 = rrule.rrulestr(input);
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            var refined = __assign({}, input); // copy
+            if (typeof refined.dtstart === 'string') {
+                var dtstartMeta = dateEnv.createMarkerMeta(refined.dtstart);
+                if (dtstartMeta) {
+                    refined.dtstart = dtstartMeta.marker;
+                    allDayGuess = dtstartMeta.isTimeUnspecified;
+                }
+                else {
+                    delete refined.dtstart;
+                }
+            }
+            if (typeof refined.until === 'string') {
+                refined.until = dateEnv.createMarker(refined.until);
+            }
+            if (refined.freq != null) {
+                refined.freq = convertConstant(refined.freq);
+            }
+            if (refined.wkst != null) {
+                refined.wkst = convertConstant(refined.wkst);
+            }
+            else {
+                refined.wkst = (dateEnv.weekDow - 1 + 7) % 7; // convert Sunday-first to Monday-first
+            }
+            if (refined.byweekday != null) {
+                refined.byweekday = convertConstants(refined.byweekday); // the plural version
+            }
+            rrule$1 = new rrule.RRule(refined);
+        }
+        if (rrule$1) {
+            return { rrule: rrule$1, allDayGuess: allDayGuess };
+        }
+        return null;
+    }
+    function convertConstants(input) {
+        if (Array.isArray(input)) {
+            return input.map(convertConstant);
+        }
+        return convertConstant(input);
+    }
+    function convertConstant(input) {
+        if (typeof input === 'string') {
+            return rrule.RRule[input.toUpperCase()];
+        }
+        return input;
+    }
+
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/rrule/main.min.js b/backoffice/vendors/fullcalendar/rrule/main.min.js
new file mode 100644 (file)
index 0000000..5e5dd93
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar RRule Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("rrule"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","rrule","@fullcalendar/core"],r):(e=e||self,r(e.FullCalendarRrule={},e.rrule,e.FullCalendar))}(this,function(e,r,t){"use strict";function n(e,t){var n,i=null;if("string"==typeof e)n=r.rrulestr(e);else if("object"==typeof e&&e){var f=a({},e);if("string"==typeof f.dtstart){var o=t.createMarkerMeta(f.dtstart);o?(f.dtstart=o.marker,i=o.isTimeUnspecified):delete f.dtstart}"string"==typeof f.until&&(f.until=t.createMarker(f.until)),null!=f.freq&&(f.freq=l(f.freq)),null!=f.wkst?f.wkst=l(f.wkst):f.wkst=(t.weekDow-1+7)%7,null!=f.byweekday&&(f.byweekday=u(f.byweekday)),n=new r.RRule(f)}return n?{rrule:n,allDayGuess:i}:null}function u(e){return Array.isArray(e)?e.map(l):l(e)}function l(e){return"string"==typeof e?r.RRule[e.toUpperCase()]:e}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var a=function(){return a=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++){r=arguments[t];for(var u in r)Object.prototype.hasOwnProperty.call(r,u)&&(e[u]=r[u])}return e},a.apply(this,arguments)},i={rrule:null,duration:t.createDuration},f={parse:function(e,r,u){if(null!=e.rrule){var l=t.refineProps(e,i,{},r),a=n(l.rrule,u);if(a)return{typeData:a.rrule,allDayGuess:a.allDayGuess,duration:l.duration}}return null},expand:function(e,r){return e.between(r.start,r.end,!0).filter(function(e){return e.valueOf()<r.end.valueOf()})}},o=t.createPlugin({recurringTypes:[f]});e.default=o,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/rrule/package.json b/backoffice/vendors/fullcalendar/rrule/package.json
new file mode 100644 (file)
index 0000000..10c023d
--- /dev/null
@@ -0,0 +1,63 @@
+{
+  "_from": "@fullcalendar/rrule@^4.1.0",
+  "_id": "@fullcalendar/rrule@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-wkHgJS36GdX4o3evfF6CHlIgy+eq5Kr6UOvCarI8LFHt5FHNZxQdIqXpeasUrx3wCJnPC/CnVdecohmbBXaZjg==",
+  "_location": "/@fullcalendar/rrule",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "@fullcalendar/rrule@^4.1.0",
+    "name": "@fullcalendar/rrule",
+    "escapedName": "@fullcalendar%2frrule",
+    "scope": "@fullcalendar",
+    "rawSpec": "^4.1.0",
+    "saveSpec": null,
+    "fetchSpec": "^4.1.0"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/rrule/-/rrule-4.1.0.tgz",
+  "_shasum": "f80fd4811a2d2bdc2a3598783964faee862adeef",
+  "_spec": "@fullcalendar/rrule@^4.1.0",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "A connector to the RRule library, for recurring events",
+  "docs": "https://fullcalendar.io/docs/rrule-plugin",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/rrule",
+  "peerDependencies": {
+    "rrule": "^2.6.0",
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar RRule Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/timegrid/LICENSE.txt b/backoffice/vendors/fullcalendar/timegrid/LICENSE.txt
new file mode 100644 (file)
index 0000000..2149cfb
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2019 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/backoffice/vendors/fullcalendar/timegrid/README.md b/backoffice/vendors/fullcalendar/timegrid/README.md
new file mode 100644 (file)
index 0000000..ac13676
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Time Grid Plugin
+
+Display your events on a grid of time slots
+
+[View the docs &raquo;](https://fullcalendar.io/docs/timegrid-view)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/backoffice/vendors/fullcalendar/timegrid/main.css b/backoffice/vendors/fullcalendar/timegrid/main.css
new file mode 100644 (file)
index 0000000..ef9cd8f
--- /dev/null
@@ -0,0 +1,266 @@
+/*!
+FullCalendar Time Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+/* TimeGridView all-day area
+--------------------------------------------------------------------------------------------------*/
+.fc-timeGrid-view .fc-day-grid {
+  position: relative;
+  z-index: 2;
+  /* so the "more.." popover will be over the time grid */ }
+
+.fc-timeGrid-view .fc-day-grid .fc-row {
+  min-height: 3em;
+  /* all-day section will never get shorter than this */ }
+
+.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton {
+  padding-bottom: 1em;
+  /* give space underneath events for clicking/selecting days */ }
+
+/* TimeGrid axis running down the side (for both the all-day area and the slot area)
+--------------------------------------------------------------------------------------------------*/
+.fc .fc-axis {
+  /* .fc to overcome default cell styles */
+  vertical-align: middle;
+  padding: 0 4px;
+  white-space: nowrap; }
+
+.fc-ltr .fc-axis {
+  text-align: right; }
+
+.fc-rtl .fc-axis {
+  text-align: left; }
+
+/* TimeGrid Structure
+--------------------------------------------------------------------------------------------------*/
+.fc-time-grid-container,
+.fc-time-grid {
+  /* so slats/bg/content/etc positions get scoped within here */
+  position: relative;
+  z-index: 1; }
+
+.fc-time-grid {
+  min-height: 100%;
+  /* so if height setting is 'auto', .fc-bg stretches to fill height */ }
+
+.fc-time-grid table {
+  /* don't put outer borders on slats/bg/content/etc */
+  border: 0 hidden transparent; }
+
+.fc-time-grid > .fc-bg {
+  z-index: 1; }
+
+.fc-time-grid .fc-slats,
+.fc-time-grid > hr {
+  /* the <hr> TimeGridView injects when grid is shorter than scroller */
+  position: relative;
+  z-index: 2; }
+
+.fc-time-grid .fc-content-col {
+  position: relative;
+  /* because now-indicator lives directly inside */ }
+
+.fc-time-grid .fc-content-skeleton {
+  position: absolute;
+  z-index: 3;
+  top: 0;
+  left: 0;
+  right: 0; }
+
+/* divs within a cell within the fc-content-skeleton */
+.fc-time-grid .fc-business-container {
+  position: relative;
+  z-index: 1; }
+
+.fc-time-grid .fc-bgevent-container {
+  position: relative;
+  z-index: 2; }
+
+.fc-time-grid .fc-highlight-container {
+  position: relative;
+  z-index: 3; }
+
+.fc-time-grid .fc-event-container {
+  position: relative;
+  z-index: 4; }
+
+.fc-time-grid .fc-now-indicator-line {
+  z-index: 5; }
+
+.fc-time-grid .fc-mirror-container {
+  /* also is fc-event-container */
+  position: relative;
+  z-index: 6; }
+
+/* TimeGrid Slats (lines that run horizontally)
+--------------------------------------------------------------------------------------------------*/
+.fc-time-grid .fc-slats td {
+  height: 1.5em;
+  border-bottom: 0;
+  /* each cell is responsible for its top border */ }
+
+.fc-time-grid .fc-slats .fc-minor td {
+  border-top-style: dotted; }
+
+/* TimeGrid Highlighting Slots
+--------------------------------------------------------------------------------------------------*/
+.fc-time-grid .fc-highlight-container {
+  /* a div within a cell within the fc-highlight-skeleton */
+  position: relative;
+  /* scopes the left/right of the fc-highlight to be in the column */ }
+
+.fc-time-grid .fc-highlight {
+  position: absolute;
+  left: 0;
+  right: 0;
+  /* top and bottom will be in by JS */ }
+
+/* TimeGrid Event Containment
+--------------------------------------------------------------------------------------------------*/
+.fc-ltr .fc-time-grid .fc-event-container {
+  /* space on the sides of events for LTR (default) */
+  margin: 0 2.5% 0 2px; }
+
+.fc-rtl .fc-time-grid .fc-event-container {
+  /* space on the sides of events for RTL */
+  margin: 0 2px 0 2.5%; }
+
+.fc-time-grid .fc-event,
+.fc-time-grid .fc-bgevent {
+  position: absolute;
+  z-index: 1;
+  /* scope inner z-index's */ }
+
+.fc-time-grid .fc-bgevent {
+  /* background events always span full width */
+  left: 0;
+  right: 0; }
+
+/* TimeGrid Event Styling
+----------------------------------------------------------------------------------------------------
+We use the full "fc-time-grid-event" class instead of using descendants because the event won't
+be a descendant of the grid when it is being dragged.
+*/
+.fc-time-grid-event {
+  margin-bottom: 1px; }
+
+.fc-time-grid-event-inset {
+  -webkit-box-shadow: 0px 0px 0px 1px #fff;
+  box-shadow: 0px 0px 0px 1px #fff; }
+
+.fc-time-grid-event.fc-not-start {
+  /* events that are continuing from another day */
+  /* replace space made by the top border with padding */
+  border-top-width: 0;
+  padding-top: 1px;
+  /* remove top rounded corners */
+  border-top-left-radius: 0;
+  border-top-right-radius: 0; }
+
+.fc-time-grid-event.fc-not-end {
+  /* replace space made by the top border with padding */
+  border-bottom-width: 0;
+  padding-bottom: 1px;
+  /* remove bottom rounded corners */
+  border-bottom-left-radius: 0;
+  border-bottom-right-radius: 0; }
+
+.fc-time-grid-event .fc-content {
+  overflow: hidden;
+  max-height: 100%; }
+
+.fc-time-grid-event .fc-time,
+.fc-time-grid-event .fc-title {
+  padding: 0 1px; }
+
+.fc-time-grid-event .fc-time {
+  font-size: .85em;
+  white-space: nowrap; }
+
+/* short mode, where time and title are on the same line */
+.fc-time-grid-event.fc-short .fc-content {
+  /* don't wrap to second line (now that contents will be inline) */
+  white-space: nowrap; }
+
+.fc-time-grid-event.fc-short .fc-time,
+.fc-time-grid-event.fc-short .fc-title {
+  /* put the time and title on the same line */
+  display: inline-block;
+  vertical-align: top; }
+
+.fc-time-grid-event.fc-short .fc-time span {
+  display: none;
+  /* don't display the full time text... */ }
+
+.fc-time-grid-event.fc-short .fc-time:before {
+  content: attr(data-start);
+  /* ...instead, display only the start time */ }
+
+.fc-time-grid-event.fc-short .fc-time:after {
+  content: "\000A0-\000A0";
+  /* seperate with a dash, wrapped in nbsp's */ }
+
+.fc-time-grid-event.fc-short .fc-title {
+  font-size: .85em;
+  /* make the title text the same size as the time */
+  padding: 0;
+  /* undo padding from above */ }
+
+/* resizer (cursor device) */
+.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer {
+  left: 0;
+  right: 0;
+  bottom: 0;
+  height: 8px;
+  overflow: hidden;
+  line-height: 8px;
+  font-size: 11px;
+  font-family: monospace;
+  text-align: center;
+  cursor: s-resize; }
+
+.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after {
+  content: "="; }
+
+/* resizer (touch device) */
+.fc-time-grid-event.fc-selected .fc-resizer {
+  /* 10x10 dot */
+  border-radius: 5px;
+  border-width: 1px;
+  width: 8px;
+  height: 8px;
+  border-style: solid;
+  border-color: inherit;
+  background: #fff;
+  /* horizontally center */
+  left: 50%;
+  margin-left: -5px;
+  /* center on the bottom edge */
+  bottom: -5px; }
+
+/* Now Indicator
+--------------------------------------------------------------------------------------------------*/
+.fc-time-grid .fc-now-indicator-line {
+  border-top-width: 1px;
+  left: 0;
+  right: 0; }
+
+/* arrow on axis */
+.fc-time-grid .fc-now-indicator-arrow {
+  margin-top: -5px;
+  /* vertically center on top coordinate */ }
+
+.fc-ltr .fc-time-grid .fc-now-indicator-arrow {
+  left: 0;
+  /* triangle pointing right... */
+  border-width: 5px 0 5px 6px;
+  border-top-color: transparent;
+  border-bottom-color: transparent; }
+
+.fc-rtl .fc-time-grid .fc-now-indicator-arrow {
+  right: 0;
+  /* triangle pointing left... */
+  border-width: 5px 6px 5px 0;
+  border-top-color: transparent;
+  border-bottom-color: transparent; }
diff --git a/backoffice/vendors/fullcalendar/timegrid/main.d.ts b/backoffice/vendors/fullcalendar/timegrid/main.d.ts
new file mode 100644 (file)
index 0000000..cd89fa2
--- /dev/null
@@ -0,0 +1,279 @@
+declare module "@fullcalendar/timegrid/TimeGridEventRenderer" {
+    import { DateFormatter, FgEventRenderer, Seg } from "@fullcalendar/core";
+    import TimeGrid from "@fullcalendar/timegrid/TimeGrid";
+    export { TimeGridEventRenderer as default, TimeGridEventRenderer };
+    class TimeGridEventRenderer extends FgEventRenderer {
+        timeGrid: TimeGrid;
+        segsByCol: any;
+        fullTimeFormat: DateFormatter;
+        constructor(timeGrid: TimeGrid);
+        attachSegs(segs: Seg[], mirrorInfo: any): void;
+        detachSegs(segs: Seg[]): void;
+        computeSegSizes(allSegs: Seg[]): void;
+        assignSegSizes(allSegs: Seg[]): void;
+        computeEventTimeFormat(): {
+            hour: string;
+            minute: string;
+            meridiem: boolean;
+        };
+        computeDisplayEventEnd(): boolean;
+        renderSegHtml(seg: Seg, mirrorInfo: any): string;
+        computeSegHorizontals(segs: Seg[]): void;
+        computeSegForwardBack(seg: Seg, seriesBackwardPressure: any, seriesBackwardCoord: any): void;
+        sortForwardSegs(forwardSegs: Seg[]): any[];
+        assignSegCss(segs: Seg[]): void;
+        generateSegCss(seg: Seg): any;
+    }
+}
+
+declare module "@fullcalendar/timegrid/TimeGridMirrorRenderer" {
+    import { Seg } from "@fullcalendar/core";
+    import TimeGridEventRenderer from "@fullcalendar/timegrid/TimeGridEventRenderer";
+    export { TimeGridMirrorRenderer as default, TimeGridMirrorRenderer };
+    class TimeGridMirrorRenderer extends TimeGridEventRenderer {
+        sourceSeg: Seg;
+        attachSegs(segs: Seg[], mirrorInfo: any): void;
+        generateSegCss(seg: Seg): any;
+    }
+}
+
+declare module "@fullcalendar/timegrid/TimeGridFillRenderer" {
+    import { FillRenderer, Seg } from "@fullcalendar/core";
+    import TimeGrid from "@fullcalendar/timegrid/TimeGrid";
+    export { TimeGridFillRenderer as default, TimeGridFillRenderer };
+    class TimeGridFillRenderer extends FillRenderer {
+        timeGrid: TimeGrid;
+        constructor(timeGrid: TimeGrid);
+        attachSegs(type: any, segs: Seg[]): HTMLElement[];
+        computeSegSizes(segs: Seg[]): void;
+        assignSegSizes(segs: Seg[]): void;
+    }
+}
+
+declare module "@fullcalendar/timegrid/TimeGrid" {
+    import { PositionCache, Duration, DateMarker, DateFormatter, ComponentContext, DateComponent, Seg, EventSegUiInteractionState, DateProfile } from "@fullcalendar/core";
+    export interface RenderProps {
+        renderBgIntroHtml: () => string;
+        renderIntroHtml: () => string;
+    }
+    export interface TimeGridSeg extends Seg {
+        col: number;
+        start: DateMarker;
+        end: DateMarker;
+    }
+    export interface TimeGridCell {
+        date: DateMarker;
+        htmlAttrs?: string;
+    }
+    export interface TimeGridProps {
+        dateProfile: DateProfile;
+        cells: TimeGridCell[];
+        businessHourSegs: TimeGridSeg[];
+        bgEventSegs: TimeGridSeg[];
+        fgEventSegs: TimeGridSeg[];
+        dateSelectionSegs: TimeGridSeg[];
+        eventSelection: string;
+        eventDrag: EventSegUiInteractionState | null;
+        eventResize: EventSegUiInteractionState | null;
+    }
+    export { TimeGrid as default, TimeGrid };
+    class TimeGrid extends DateComponent<TimeGridProps> {
+        renderProps: RenderProps;
+        slotDuration: Duration;
+        snapDuration: Duration;
+        snapsPerSlot: any;
+        labelFormat: DateFormatter;
+        labelInterval: Duration;
+        colCnt: number;
+        colEls: HTMLElement[];
+        slatContainerEl: HTMLElement;
+        slatEls: HTMLElement[];
+        nowIndicatorEls: HTMLElement[];
+        colPositions: PositionCache;
+        slatPositions: PositionCache;
+        isSlatSizesDirty: boolean;
+        isColSizesDirty: boolean;
+        rootBgContainerEl: HTMLElement;
+        bottomRuleEl: HTMLElement;
+        contentSkeletonEl: HTMLElement;
+        colContainerEls: HTMLElement[];
+        fgContainerEls: HTMLElement[];
+        bgContainerEls: HTMLElement[];
+        mirrorContainerEls: HTMLElement[];
+        highlightContainerEls: HTMLElement[];
+        businessContainerEls: HTMLElement[];
+        private renderSlats;
+        private renderColumns;
+        private renderBusinessHours;
+        private renderDateSelection;
+        private renderBgEvents;
+        private renderFgEvents;
+        private renderEventSelection;
+        private renderEventDrag;
+        private renderEventResize;
+        constructor(context: ComponentContext, el: HTMLElement, renderProps: RenderProps);
+        processOptions(): void;
+        computeLabelInterval(slotDuration: any): any;
+        render(props: TimeGridProps): void;
+        destroy(): void;
+        updateSize(isResize: boolean): void;
+        _renderSlats(dateProfile: DateProfile): void;
+        renderSlatRowHtml(dateProfile: DateProfile): string;
+        _renderColumns(cells: TimeGridCell[], dateProfile: DateProfile): void;
+        _unrenderColumns(): void;
+        renderContentSkeleton(): void;
+        unrenderContentSkeleton(): void;
+        groupSegsByCol(segs: any): any[];
+        attachSegsByCol(segsByCol: any, containerEls: HTMLElement[]): void;
+        getNowIndicatorUnit(): string;
+        renderNowIndicator(segs: TimeGridSeg[], date: any): void;
+        unrenderNowIndicator(): void;
+        getTotalSlatHeight(): number;
+        computeDateTop(when: DateMarker, startOfDayDate?: DateMarker): any;
+        computeTimeTop(timeMs: number): any;
+        computeSegVerticals(segs: any): void;
+        assignSegVerticals(segs: any): void;
+        generateSegVerticalCss(seg: any): {
+            top: any;
+            bottom: number;
+        };
+        buildPositionCaches(): void;
+        buildColPositions(): void;
+        buildSlatPositions(): void;
+        positionToHit(positionLeft: any, positionTop: any): {
+            col: any;
+            dateSpan: {
+                range: {
+                    start: Date;
+                    end: Date;
+                };
+                allDay: boolean;
+            };
+            dayEl: HTMLElement;
+            relativeRect: {
+                left: any;
+                right: any;
+                top: any;
+                bottom: any;
+            };
+        };
+        _renderEventDrag(state: EventSegUiInteractionState): void;
+        _unrenderEventDrag(state: EventSegUiInteractionState): void;
+        _renderEventResize(state: EventSegUiInteractionState): void;
+        _unrenderEventResize(state: EventSegUiInteractionState): void;
+        _renderDateSelection(segs: Seg[]): void;
+        _unrenderDateSelection(segs: Seg[]): void;
+    }
+}
+
+declare module "@fullcalendar/timegrid/AllDaySplitter" {
+    import { Splitter, EventDef, DateSpan } from "@fullcalendar/core";
+    export { AllDaySplitter as default, AllDaySplitter };
+    class AllDaySplitter extends Splitter {
+        getKeyInfo(): {
+            allDay: {};
+            timed: {};
+        };
+        getKeysForDateSpan(dateSpan: DateSpan): string[];
+        getKeysForEventDef(eventDef: EventDef): string[];
+    }
+}
+
+declare module "@fullcalendar/timegrid/AbstractTimeGridView" {
+    import { ScrollComponent, View, ViewSpec, DateProfileGenerator, ComponentContext } from "@fullcalendar/core";
+    import { DayGrid } from "@fullcalendar/daygrid";
+    import TimeGrid from "@fullcalendar/timegrid/TimeGrid";
+    import AllDaySplitter from "@fullcalendar/timegrid/AllDaySplitter";
+    export { TimeGridView as default, TimeGridView };
+    abstract class TimeGridView extends View {
+        timeGrid: TimeGrid;
+        dayGrid: DayGrid;
+        scroller: ScrollComponent;
+        axisWidth: any;
+        protected splitter: AllDaySplitter;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        renderSkeletonHtml(): string;
+        getNowIndicatorUnit(): string;
+        unrenderNowIndicator(): void;
+        updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
+        updateBaseSize(isResize: any, viewHeight: any, isAuto: any): void;
+        computeScrollerHeight(viewHeight: any): number;
+        computeDateScroll(timeMs: number): {
+            top: any;
+        };
+        queryDateScroll(): {
+            top: number;
+        };
+        applyDateScroll(scroll: any): void;
+        renderHeadIntroHtml: () => string;
+        axisStyleAttr(): string;
+        renderTimeGridBgIntroHtml: () => string;
+        renderTimeGridIntroHtml: () => string;
+        renderDayGridBgIntroHtml: () => string;
+        renderDayGridIntroHtml: () => string;
+    }
+}
+
+declare module "@fullcalendar/timegrid/SimpleTimeGrid" {
+    import { DateComponent, DateProfile, EventStore, EventUiHash, EventInteractionState, DateSpan, DateRange, DayTable, DateEnv, DateMarker, Slicer, Hit, ComponentContext } from "@fullcalendar/core";
+    import TimeGrid, { TimeGridSeg } from "@fullcalendar/timegrid/TimeGrid";
+    export interface SimpleTimeGridProps {
+        dateProfile: DateProfile | null;
+        dayTable: DayTable;
+        businessHours: EventStore;
+        eventStore: EventStore;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+    }
+    export { SimpleTimeGrid as default, SimpleTimeGrid };
+    class SimpleTimeGrid extends DateComponent<SimpleTimeGridProps> {
+        timeGrid: TimeGrid;
+        private buildDayRanges;
+        private dayRanges;
+        private slicer;
+        constructor(context: ComponentContext, timeGrid: TimeGrid);
+        destroy(): void;
+        render(props: SimpleTimeGridProps): void;
+        renderNowIndicator(date: DateMarker): void;
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number): Hit;
+    }
+    export function buildDayRanges(dayTable: DayTable, dateProfile: DateProfile, dateEnv: DateEnv): DateRange[];
+    export class TimeGridSlicer extends Slicer<TimeGridSeg, [DateRange[]]> {
+        sliceRange(range: DateRange, dayRanges: DateRange[]): TimeGridSeg[];
+    }
+}
+
+declare module "@fullcalendar/timegrid/TimeGridView" {
+    import { DateProfileGenerator, DateProfile, ComponentContext, ViewSpec, DayHeader, DayTable, ViewProps } from "@fullcalendar/core";
+    import { SimpleDayGrid } from "@fullcalendar/daygrid";
+    import SimpleTimeGrid from "@fullcalendar/timegrid/SimpleTimeGrid";
+    import AbstractTimeGridView from "@fullcalendar/timegrid/AbstractTimeGridView";
+    export { TimeGridView as default, TimeGridView };
+    class TimeGridView extends AbstractTimeGridView {
+        header: DayHeader;
+        simpleDayGrid: SimpleDayGrid;
+        simpleTimeGrid: SimpleTimeGrid;
+        private buildDayTable;
+        constructor(_context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: ViewProps): void;
+        renderNowIndicator(date: any): void;
+    }
+    export function buildDayTable(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): DayTable;
+}
+
+declare module "@fullcalendar/timegrid" {
+    import AbstractTimeGridView from "@fullcalendar/timegrid/AbstractTimeGridView";
+    import TimeGridView, { buildDayTable } from "@fullcalendar/timegrid/TimeGridView";
+    import { TimeGridSeg } from "@fullcalendar/timegrid/TimeGrid";
+    import { TimeGridSlicer, buildDayRanges } from "@fullcalendar/timegrid/SimpleTimeGrid";
+    export { TimeGridView, AbstractTimeGridView, buildDayTable, buildDayRanges, TimeGridSlicer, TimeGridSeg };
+    export { default as TimeGrid } from "@fullcalendar/timegrid/TimeGrid";
+    const _default_14: import("@fullcalendar/core/plugin-system").PluginDef;
+    export default _default_14;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/timegrid/main.js b/backoffice/vendors/fullcalendar/timegrid/main.js
new file mode 100644 (file)
index 0000000..fc864d0
--- /dev/null
@@ -0,0 +1,1354 @@
+/*!
+FullCalendar Time Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/daygrid')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/daygrid'], factory) :
+    (global = global || self, factory(global.FullCalendarTimeGrid = {}, global.FullCalendar, global.FullCalendarDayGrid));
+}(this, function (exports, core, daygrid) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    /*
+    Only handles foreground segs.
+    Does not own rendering. Use for low-level util methods by TimeGrid.
+    */
+    var TimeGridEventRenderer = /** @class */ (function (_super) {
+        __extends(TimeGridEventRenderer, _super);
+        function TimeGridEventRenderer(timeGrid) {
+            var _this = _super.call(this, timeGrid.context) || this;
+            _this.timeGrid = timeGrid;
+            _this.fullTimeFormat = core.createFormatter({
+                hour: 'numeric',
+                minute: '2-digit',
+                separator: _this.context.options.defaultRangeSeparator
+            });
+            return _this;
+        }
+        // Given an array of foreground segments, render a DOM element for each, computes position,
+        // and attaches to the column inner-container elements.
+        TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
+            var segsByCol = this.timeGrid.groupSegsByCol(segs);
+            // order the segs within each column
+            // TODO: have groupSegsByCol do this?
+            for (var col = 0; col < segsByCol.length; col++) {
+                segsByCol[col] = this.sortEventSegs(segsByCol[col]);
+            }
+            this.segsByCol = segsByCol;
+            this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);
+        };
+        TimeGridEventRenderer.prototype.detachSegs = function (segs) {
+            segs.forEach(function (seg) {
+                core.removeElement(seg.el);
+            });
+            this.segsByCol = null;
+        };
+        TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {
+            var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
+            var colCnt = timeGrid.colCnt;
+            timeGrid.computeSegVerticals(allSegs); // horizontals relies on this
+            if (segsByCol) {
+                for (var col = 0; col < colCnt; col++) {
+                    this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array
+                }
+            }
+        };
+        TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {
+            var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
+            var colCnt = timeGrid.colCnt;
+            timeGrid.assignSegVerticals(allSegs); // horizontals relies on this
+            if (segsByCol) {
+                for (var col = 0; col < colCnt; col++) {
+                    this.assignSegCss(segsByCol[col]);
+                }
+            }
+        };
+        // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
+        TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
+            return {
+                hour: 'numeric',
+                minute: '2-digit',
+                meridiem: false
+            };
+        };
+        // Computes a default `displayEventEnd` value if one is not expliclty defined
+        TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
+            return true;
+        };
+        // Renders the HTML for a single event segment's default rendering
+        TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
+            var eventRange = seg.eventRange;
+            var eventDef = eventRange.def;
+            var eventUi = eventRange.ui;
+            var allDay = eventDef.allDay;
+            var isDraggable = eventUi.startEditable;
+            var isResizableFromStart = seg.isStart && eventUi.durationEditable && this.context.options.eventResizableFromStart;
+            var isResizableFromEnd = seg.isEnd && eventUi.durationEditable;
+            var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
+            var skinCss = core.cssToStr(this.getSkinCss(eventUi));
+            var timeText;
+            var fullTimeText; // more verbose time text. for the print stylesheet
+            var startTimeText; // just the start time text
+            classes.unshift('fc-time-grid-event');
+            // if the event appears to span more than one day...
+            if (core.isMultiDayRange(eventRange.range)) {
+                // Don't display time text on segments that run entirely through a day.
+                // That would appear as midnight-midnight and would look dumb.
+                // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
+                if (seg.isStart || seg.isEnd) {
+                    var unzonedStart = seg.start;
+                    var unzonedEnd = seg.end;
+                    timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones
+                    fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);
+                    startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false
+                }
+            }
+            else {
+                // Display the normal time text for the *event's* times
+                timeText = this.getTimeText(eventRange);
+                fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);
+                startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false
+            }
+            return '<a class="' + classes.join(' ') + '"' +
+                (eventDef.url ?
+                    ' href="' + core.htmlEscape(eventDef.url) + '"' :
+                    '') +
+                (skinCss ?
+                    ' style="' + skinCss + '"' :
+                    '') +
+                '>' +
+                '<div class="fc-content">' +
+                (timeText ?
+                    '<div class="fc-time"' +
+                        ' data-start="' + core.htmlEscape(startTimeText) + '"' +
+                        ' data-full="' + core.htmlEscape(fullTimeText) + '"' +
+                        '>' +
+                        '<span>' + core.htmlEscape(timeText) + '</span>' +
+                        '</div>' :
+                    '') +
+                (eventDef.title ?
+                    '<div class="fc-title">' +
+                        core.htmlEscape(eventDef.title) +
+                        '</div>' :
+                    '') +
+                '</div>' +
+                /* TODO: write CSS for this
+                (isResizableFromStart ?
+                  '<div class="fc-resizer fc-start-resizer"></div>' :
+                  ''
+                  ) +
+                */
+                (isResizableFromEnd ?
+                    '<div class="fc-resizer fc-end-resizer"></div>' :
+                    '') +
+                '</a>';
+        };
+        // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
+        // Assumed the segs are already ordered.
+        // NOTE: Also reorders the given array by date!
+        TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {
+            var levels;
+            var level0;
+            var i;
+            levels = buildSlotSegLevels(segs);
+            computeForwardSlotSegs(levels);
+            if ((level0 = levels[0])) {
+                for (i = 0; i < level0.length; i++) {
+                    computeSlotSegPressures(level0[i]);
+                }
+                for (i = 0; i < level0.length; i++) {
+                    this.computeSegForwardBack(level0[i], 0, 0);
+                }
+            }
+        };
+        // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
+        // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
+        // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
+        //
+        // The segment might be part of a "series", which means consecutive segments with the same pressure
+        // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
+        // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
+        // coordinate of the first segment in the series.
+        TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
+            var forwardSegs = seg.forwardSegs;
+            var i;
+            if (seg.forwardCoord === undefined) { // not already computed
+                if (!forwardSegs.length) {
+                    // if there are no forward segments, this segment should butt up against the edge
+                    seg.forwardCoord = 1;
+                }
+                else {
+                    // sort highest pressure first
+                    this.sortForwardSegs(forwardSegs);
+                    // this segment's forwardCoord will be calculated from the backwardCoord of the
+                    // highest-pressure forward segment.
+                    this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
+                    seg.forwardCoord = forwardSegs[0].backwardCoord;
+                }
+                // calculate the backwardCoord from the forwardCoord. consider the series
+                seg.backwardCoord = seg.forwardCoord -
+                    (seg.forwardCoord - seriesBackwardCoord) / // available width for series
+                        (seriesBackwardPressure + 1); // # of segments in the series
+                // use this segment's coordinates to computed the coordinates of the less-pressurized
+                // forward segments
+                for (i = 0; i < forwardSegs.length; i++) {
+                    this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
+                }
+            }
+        };
+        TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
+            var objs = forwardSegs.map(buildTimeGridSegCompareObj);
+            var specs = [
+                // put higher-pressure first
+                { field: 'forwardPressure', order: -1 },
+                // put segments that are closer to initial edge first (and favor ones with no coords yet)
+                { field: 'backwardCoord', order: 1 }
+            ].concat(this.context.view.eventOrderSpecs);
+            objs.sort(function (obj0, obj1) {
+                return core.compareByFieldSpecs(obj0, obj1, specs);
+            });
+            return objs.map(function (c) {
+                return c._seg;
+            });
+        };
+        // Given foreground event segments that have already had their position coordinates computed,
+        // assigns position-related CSS values to their elements.
+        TimeGridEventRenderer.prototype.assignSegCss = function (segs) {
+            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                var seg = segs_1[_i];
+                core.applyStyle(seg.el, this.generateSegCss(seg));
+                if (seg.level > 0) {
+                    seg.el.classList.add('fc-time-grid-event-inset');
+                }
+                // if the event is short that the title will be cut off,
+                // attach a className that condenses the title into the time area.
+                if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {
+                    seg.el.classList.add('fc-short'); // TODO: "condensed" is a better name
+                }
+            }
+        };
+        // Generates an object with CSS properties/values that should be applied to an event segment element.
+        // Contains important positioning-related properties that should be applied to any event element, customized or not.
+        TimeGridEventRenderer.prototype.generateSegCss = function (seg) {
+            var shouldOverlap = this.context.options.slotEventOverlap;
+            var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
+            var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
+            var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
+            var isRtl = this.timeGrid.isRtl;
+            var left; // amount of space from left edge, a fraction of the total width
+            var right; // amount of space from right edge, a fraction of the total width
+            if (shouldOverlap) {
+                // double the width, but don't go beyond the maximum forward coordinate (1.0)
+                forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
+            }
+            if (isRtl) {
+                left = 1 - forwardCoord;
+                right = backwardCoord;
+            }
+            else {
+                left = backwardCoord;
+                right = 1 - forwardCoord;
+            }
+            props.zIndex = seg.level + 1; // convert from 0-base to 1-based
+            props.left = left * 100 + '%';
+            props.right = right * 100 + '%';
+            if (shouldOverlap && seg.forwardPressure) {
+                // add padding to the edge so that forward stacked events don't cover the resizer's icon
+                props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
+            }
+            return props;
+        };
+        return TimeGridEventRenderer;
+    }(core.FgEventRenderer));
+    // Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
+    // left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
+    function buildSlotSegLevels(segs) {
+        var levels = [];
+        var i;
+        var seg;
+        var j;
+        for (i = 0; i < segs.length; i++) {
+            seg = segs[i];
+            // go through all the levels and stop on the first level where there are no collisions
+            for (j = 0; j < levels.length; j++) {
+                if (!computeSlotSegCollisions(seg, levels[j]).length) {
+                    break;
+                }
+            }
+            seg.level = j;
+            (levels[j] || (levels[j] = [])).push(seg);
+        }
+        return levels;
+    }
+    // For every segment, figure out the other segments that are in subsequent
+    // levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
+    function computeForwardSlotSegs(levels) {
+        var i;
+        var level;
+        var j;
+        var seg;
+        var k;
+        for (i = 0; i < levels.length; i++) {
+            level = levels[i];
+            for (j = 0; j < level.length; j++) {
+                seg = level[j];
+                seg.forwardSegs = [];
+                for (k = i + 1; k < levels.length; k++) {
+                    computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
+                }
+            }
+        }
+    }
+    // Figure out which path forward (via seg.forwardSegs) results in the longest path until
+    // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
+    function computeSlotSegPressures(seg) {
+        var forwardSegs = seg.forwardSegs;
+        var forwardPressure = 0;
+        var i;
+        var forwardSeg;
+        if (seg.forwardPressure === undefined) { // not already computed
+            for (i = 0; i < forwardSegs.length; i++) {
+                forwardSeg = forwardSegs[i];
+                // figure out the child's maximum forward path
+                computeSlotSegPressures(forwardSeg);
+                // either use the existing maximum, or use the child's forward pressure
+                // plus one (for the forwardSeg itself)
+                forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
+            }
+            seg.forwardPressure = forwardPressure;
+        }
+    }
+    // Find all the segments in `otherSegs` that vertically collide with `seg`.
+    // Append into an optionally-supplied `results` array and return.
+    function computeSlotSegCollisions(seg, otherSegs, results) {
+        if (results === void 0) { results = []; }
+        for (var i = 0; i < otherSegs.length; i++) {
+            if (isSlotSegCollision(seg, otherSegs[i])) {
+                results.push(otherSegs[i]);
+            }
+        }
+        return results;
+    }
+    // Do these segments occupy the same vertical space?
+    function isSlotSegCollision(seg1, seg2) {
+        return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
+    }
+    function buildTimeGridSegCompareObj(seg) {
+        var obj = core.buildSegCompareObj(seg);
+        obj.forwardPressure = seg.forwardPressure;
+        obj.backwardCoord = seg.backwardCoord;
+        return obj;
+    }
+
+    var TimeGridMirrorRenderer = /** @class */ (function (_super) {
+        __extends(TimeGridMirrorRenderer, _super);
+        function TimeGridMirrorRenderer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
+            this.segsByCol = this.timeGrid.groupSegsByCol(segs);
+            this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);
+            this.sourceSeg = mirrorInfo.sourceSeg;
+        };
+        TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {
+            var props = _super.prototype.generateSegCss.call(this, seg);
+            var sourceSeg = this.sourceSeg;
+            if (sourceSeg && sourceSeg.col === seg.col) {
+                var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);
+                props.left = sourceSegProps.left;
+                props.right = sourceSegProps.right;
+                props.marginLeft = sourceSegProps.marginLeft;
+                props.marginRight = sourceSegProps.marginRight;
+            }
+            return props;
+        };
+        return TimeGridMirrorRenderer;
+    }(TimeGridEventRenderer));
+
+    var TimeGridFillRenderer = /** @class */ (function (_super) {
+        __extends(TimeGridFillRenderer, _super);
+        function TimeGridFillRenderer(timeGrid) {
+            var _this = _super.call(this, timeGrid.context) || this;
+            _this.timeGrid = timeGrid;
+            return _this;
+        }
+        TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {
+            var timeGrid = this.timeGrid;
+            var containerEls;
+            // TODO: more efficient lookup
+            if (type === 'bgEvent') {
+                containerEls = timeGrid.bgContainerEls;
+            }
+            else if (type === 'businessHours') {
+                containerEls = timeGrid.businessContainerEls;
+            }
+            else if (type === 'highlight') {
+                containerEls = timeGrid.highlightContainerEls;
+            }
+            timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
+            return segs.map(function (seg) {
+                return seg.el;
+            });
+        };
+        TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {
+            this.timeGrid.computeSegVerticals(segs);
+        };
+        TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {
+            this.timeGrid.assignSegVerticals(segs);
+        };
+        return TimeGridFillRenderer;
+    }(core.FillRenderer));
+
+    /* A component that renders one or more columns of vertical time slots
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // potential nice values for the slot-duration and interval-duration
+    // from largest to smallest
+    var AGENDA_STOCK_SUB_DURATIONS = [
+        { hours: 1 },
+        { minutes: 30 },
+        { minutes: 15 },
+        { seconds: 30 },
+        { seconds: 15 }
+    ];
+    var TimeGrid = /** @class */ (function (_super) {
+        __extends(TimeGrid, _super);
+        function TimeGrid(context, el, renderProps) {
+            var _this = _super.call(this, context, el) || this;
+            _this.isSlatSizesDirty = false;
+            _this.isColSizesDirty = false;
+            _this.renderSlats = core.memoizeRendering(_this._renderSlats);
+            var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);
+            var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);
+            _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);
+            var renderColumns = _this.renderColumns = core.memoizeRendering(_this._renderColumns, _this._unrenderColumns);
+            _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);
+            _this.renderDateSelection = core.memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);
+            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);
+            _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);
+            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
+            _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);
+            _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);
+            _this.processOptions();
+            el.innerHTML =
+                '<div class="fc-bg"></div>' +
+                    '<div class="fc-slats"></div>' +
+                    '<hr class="fc-divider ' + _this.theme.getClass('widgetHeader') + '" style="display:none" />';
+            _this.rootBgContainerEl = el.querySelector('.fc-bg');
+            _this.slatContainerEl = el.querySelector('.fc-slats');
+            _this.bottomRuleEl = el.querySelector('.fc-divider');
+            _this.renderProps = renderProps;
+            return _this;
+        }
+        /* Options
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Parses various options into properties of this object
+        TimeGrid.prototype.processOptions = function () {
+            var slotDuration = this.opt('slotDuration');
+            var snapDuration = this.opt('snapDuration');
+            var snapsPerSlot;
+            var input;
+            slotDuration = core.createDuration(slotDuration);
+            snapDuration = snapDuration ? core.createDuration(snapDuration) : slotDuration;
+            snapsPerSlot = core.wholeDivideDurations(slotDuration, snapDuration);
+            if (snapsPerSlot === null) {
+                snapDuration = slotDuration;
+                snapsPerSlot = 1;
+                // TODO: say warning?
+            }
+            this.slotDuration = slotDuration;
+            this.snapDuration = snapDuration;
+            this.snapsPerSlot = snapsPerSlot;
+            // might be an array value (for TimelineView).
+            // if so, getting the most granular entry (the last one probably).
+            input = this.opt('slotLabelFormat');
+            if (Array.isArray(input)) {
+                input = input[input.length - 1];
+            }
+            this.labelFormat = core.createFormatter(input || {
+                hour: 'numeric',
+                minute: '2-digit',
+                omitZeroMinute: true,
+                meridiem: 'short'
+            });
+            input = this.opt('slotLabelInterval');
+            this.labelInterval = input ?
+                core.createDuration(input) :
+                this.computeLabelInterval(slotDuration);
+        };
+        // Computes an automatic value for slotLabelInterval
+        TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
+            var i;
+            var labelInterval;
+            var slotsPerLabel;
+            // find the smallest stock label interval that results in more than one slots-per-label
+            for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
+                labelInterval = core.createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);
+                slotsPerLabel = core.wholeDivideDurations(labelInterval, slotDuration);
+                if (slotsPerLabel !== null && slotsPerLabel > 1) {
+                    return labelInterval;
+                }
+            }
+            return slotDuration; // fall back
+        };
+        /* Rendering
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype.render = function (props) {
+            var cells = props.cells;
+            this.colCnt = cells.length;
+            this.renderSlats(props.dateProfile);
+            this.renderColumns(props.cells, props.dateProfile);
+            this.renderBusinessHours(props.businessHourSegs);
+            this.renderDateSelection(props.dateSelectionSegs);
+            this.renderFgEvents(props.fgEventSegs);
+            this.renderBgEvents(props.bgEventSegs);
+            this.renderEventSelection(props.eventSelection);
+            this.renderEventDrag(props.eventDrag);
+            this.renderEventResize(props.eventResize);
+        };
+        TimeGrid.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            // should unrender everything else too
+            this.renderSlats.unrender();
+            this.renderColumns.unrender();
+        };
+        TimeGrid.prototype.updateSize = function (isResize) {
+            var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
+            if (isResize || this.isSlatSizesDirty) {
+                this.buildSlatPositions();
+                this.isSlatSizesDirty = false;
+            }
+            if (isResize || this.isColSizesDirty) {
+                this.buildColPositions();
+                this.isColSizesDirty = false;
+            }
+            fillRenderer.computeSizes(isResize);
+            eventRenderer.computeSizes(isResize);
+            mirrorRenderer.computeSizes(isResize);
+            fillRenderer.assignSizes(isResize);
+            eventRenderer.assignSizes(isResize);
+            mirrorRenderer.assignSizes(isResize);
+        };
+        TimeGrid.prototype._renderSlats = function (dateProfile) {
+            var theme = this.theme;
+            this.slatContainerEl.innerHTML =
+                '<table class="' + theme.getClass('tableGrid') + '">' +
+                    this.renderSlatRowHtml(dateProfile) +
+                    '</table>';
+            this.slatEls = core.findElements(this.slatContainerEl, 'tr');
+            this.slatPositions = new core.PositionCache(this.el, this.slatEls, false, true // vertical
+            );
+            this.isSlatSizesDirty = true;
+        };
+        // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
+        TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {
+            var _a = this, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;
+            var html = '';
+            var dayStart = core.startOfDay(dateProfile.renderRange.start);
+            var slotTime = dateProfile.minTime;
+            var slotIterator = core.createDuration(0);
+            var slotDate; // will be on the view's first day, but we only care about its time
+            var isLabeled;
+            var axisHtml;
+            // Calculate the time for each slot
+            while (core.asRoughMs(slotTime) < core.asRoughMs(dateProfile.maxTime)) {
+                slotDate = dateEnv.add(dayStart, slotTime);
+                isLabeled = core.wholeDivideDurations(slotIterator, this.labelInterval) !== null;
+                axisHtml =
+                    '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '">' +
+                        (isLabeled ?
+                            '<span>' + // for matchCellWidths
+                                core.htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +
+                                '</span>' :
+                            '') +
+                        '</td>';
+                html +=
+                    '<tr data-time="' + core.formatIsoTimeString(slotDate) + '"' +
+                        (isLabeled ? '' : ' class="fc-minor"') +
+                        '>' +
+                        (!isRtl ? axisHtml : '') +
+                        '<td class="' + theme.getClass('widgetContent') + '"></td>' +
+                        (isRtl ? axisHtml : '') +
+                        '</tr>';
+                slotTime = core.addDurations(slotTime, this.slotDuration);
+                slotIterator = core.addDurations(slotIterator, this.slotDuration);
+            }
+            return html;
+        };
+        TimeGrid.prototype._renderColumns = function (cells, dateProfile) {
+            var _a = this, theme = _a.theme, dateEnv = _a.dateEnv, view = _a.view;
+            var bgRow = new daygrid.DayBgRow(this.context);
+            this.rootBgContainerEl.innerHTML =
+                '<table class="' + theme.getClass('tableGrid') + '">' +
+                    bgRow.renderHtml({
+                        cells: cells,
+                        dateProfile: dateProfile,
+                        renderIntroHtml: this.renderProps.renderBgIntroHtml
+                    }) +
+                    '</table>';
+            this.colEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
+            for (var col = 0; col < this.colCnt; col++) {
+                this.publiclyTrigger('dayRender', [
+                    {
+                        date: dateEnv.toDate(cells[col].date),
+                        el: this.colEls[col],
+                        view: view
+                    }
+                ]);
+            }
+            if (this.isRtl) {
+                this.colEls.reverse();
+            }
+            this.colPositions = new core.PositionCache(this.el, this.colEls, true, // horizontal
+            false);
+            this.renderContentSkeleton();
+            this.isColSizesDirty = true;
+        };
+        TimeGrid.prototype._unrenderColumns = function () {
+            this.unrenderContentSkeleton();
+        };
+        /* Content Skeleton
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Renders the DOM that the view's content will live in
+        TimeGrid.prototype.renderContentSkeleton = function () {
+            var parts = [];
+            var skeletonEl;
+            parts.push(this.renderProps.renderIntroHtml());
+            for (var i = 0; i < this.colCnt; i++) {
+                parts.push('<td>' +
+                    '<div class="fc-content-col">' +
+                    '<div class="fc-event-container fc-mirror-container"></div>' +
+                    '<div class="fc-event-container"></div>' +
+                    '<div class="fc-highlight-container"></div>' +
+                    '<div class="fc-bgevent-container"></div>' +
+                    '<div class="fc-business-container"></div>' +
+                    '</div>' +
+                    '</td>');
+            }
+            if (this.isRtl) {
+                parts.reverse();
+            }
+            skeletonEl = this.contentSkeletonEl = core.htmlToElement('<div class="fc-content-skeleton">' +
+                '<table>' +
+                '<tr>' + parts.join('') + '</tr>' +
+                '</table>' +
+                '</div>');
+            this.colContainerEls = core.findElements(skeletonEl, '.fc-content-col');
+            this.mirrorContainerEls = core.findElements(skeletonEl, '.fc-mirror-container');
+            this.fgContainerEls = core.findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');
+            this.bgContainerEls = core.findElements(skeletonEl, '.fc-bgevent-container');
+            this.highlightContainerEls = core.findElements(skeletonEl, '.fc-highlight-container');
+            this.businessContainerEls = core.findElements(skeletonEl, '.fc-business-container');
+            if (this.isRtl) {
+                this.colContainerEls.reverse();
+                this.mirrorContainerEls.reverse();
+                this.fgContainerEls.reverse();
+                this.bgContainerEls.reverse();
+                this.highlightContainerEls.reverse();
+                this.businessContainerEls.reverse();
+            }
+            this.el.appendChild(skeletonEl);
+        };
+        TimeGrid.prototype.unrenderContentSkeleton = function () {
+            core.removeElement(this.contentSkeletonEl);
+        };
+        // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
+        TimeGrid.prototype.groupSegsByCol = function (segs) {
+            var segsByCol = [];
+            var i;
+            for (i = 0; i < this.colCnt; i++) {
+                segsByCol.push([]);
+            }
+            for (i = 0; i < segs.length; i++) {
+                segsByCol[segs[i].col].push(segs[i]);
+            }
+            return segsByCol;
+        };
+        // Given segments grouped by column, insert the segments' elements into a parallel array of container
+        // elements, each living within a column.
+        TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
+            var col;
+            var segs;
+            var i;
+            for (col = 0; col < this.colCnt; col++) { // iterate each column grouping
+                segs = segsByCol[col];
+                for (i = 0; i < segs.length; i++) {
+                    containerEls[col].appendChild(segs[i].el);
+                }
+            }
+        };
+        /* Now Indicator
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype.getNowIndicatorUnit = function () {
+            return 'minute'; // will refresh on the minute
+        };
+        TimeGrid.prototype.renderNowIndicator = function (segs, date) {
+            // HACK: if date columns not ready for some reason (scheduler)
+            if (!this.colContainerEls) {
+                return;
+            }
+            var top = this.computeDateTop(date);
+            var nodes = [];
+            var i;
+            // render lines within the columns
+            for (i = 0; i < segs.length; i++) {
+                var lineEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });
+                lineEl.style.top = top + 'px';
+                this.colContainerEls[segs[i].col].appendChild(lineEl);
+                nodes.push(lineEl);
+            }
+            // render an arrow over the axis
+            if (segs.length > 0) { // is the current time in view?
+                var arrowEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });
+                arrowEl.style.top = top + 'px';
+                this.contentSkeletonEl.appendChild(arrowEl);
+                nodes.push(arrowEl);
+            }
+            this.nowIndicatorEls = nodes;
+        };
+        TimeGrid.prototype.unrenderNowIndicator = function () {
+            if (this.nowIndicatorEls) {
+                this.nowIndicatorEls.forEach(core.removeElement);
+                this.nowIndicatorEls = null;
+            }
+        };
+        /* Coordinates
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype.getTotalSlatHeight = function () {
+            return this.slatContainerEl.offsetHeight;
+        };
+        // Computes the top coordinate, relative to the bounds of the grid, of the given date.
+        // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
+        TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {
+            if (!startOfDayDate) {
+                startOfDayDate = core.startOfDay(when);
+            }
+            return this.computeTimeTop(when.valueOf() - startOfDayDate.valueOf());
+        };
+        // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
+        TimeGrid.prototype.computeTimeTop = function (timeMs) {
+            var len = this.slatEls.length;
+            var dateProfile = this.props.dateProfile;
+            var slatCoverage = (timeMs - core.asRoughMs(dateProfile.minTime)) / core.asRoughMs(this.slotDuration); // floating-point value of # of slots covered
+            var slatIndex;
+            var slatRemainder;
+            // compute a floating-point number for how many slats should be progressed through.
+            // from 0 to number of slats (inclusive)
+            // constrained because minTime/maxTime might be customized.
+            slatCoverage = Math.max(0, slatCoverage);
+            slatCoverage = Math.min(len, slatCoverage);
+            // an integer index of the furthest whole slat
+            // from 0 to number slats (*exclusive*, so len-1)
+            slatIndex = Math.floor(slatCoverage);
+            slatIndex = Math.min(slatIndex, len - 1);
+            // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
+            // could be 1.0 if slatCoverage is covering *all* the slots
+            slatRemainder = slatCoverage - slatIndex;
+            return this.slatPositions.tops[slatIndex] +
+                this.slatPositions.getHeight(slatIndex) * slatRemainder;
+        };
+        // For each segment in an array, computes and assigns its top and bottom properties
+        TimeGrid.prototype.computeSegVerticals = function (segs) {
+            var eventMinHeight = this.opt('timeGridEventMinHeight');
+            var i;
+            var seg;
+            var dayDate;
+            for (i = 0; i < segs.length; i++) {
+                seg = segs[i];
+                dayDate = this.props.cells[seg.col].date;
+                seg.top = this.computeDateTop(seg.start, dayDate);
+                seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));
+            }
+        };
+        // Given segments that already have their top/bottom properties computed, applies those values to
+        // the segments' elements.
+        TimeGrid.prototype.assignSegVerticals = function (segs) {
+            var i;
+            var seg;
+            for (i = 0; i < segs.length; i++) {
+                seg = segs[i];
+                core.applyStyle(seg.el, this.generateSegVerticalCss(seg));
+            }
+        };
+        // Generates an object with CSS properties for the top/bottom coordinates of a segment element
+        TimeGrid.prototype.generateSegVerticalCss = function (seg) {
+            return {
+                top: seg.top,
+                bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
+            };
+        };
+        /* Sizing
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype.buildPositionCaches = function () {
+            this.buildColPositions();
+            this.buildSlatPositions();
+        };
+        TimeGrid.prototype.buildColPositions = function () {
+            this.colPositions.build();
+        };
+        TimeGrid.prototype.buildSlatPositions = function () {
+            this.slatPositions.build();
+        };
+        /* Hit System
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {
+            var _a = this, dateEnv = _a.dateEnv, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;
+            var colIndex = colPositions.leftToIndex(positionLeft);
+            var slatIndex = slatPositions.topToIndex(positionTop);
+            if (colIndex != null && slatIndex != null) {
+                var slatTop = slatPositions.tops[slatIndex];
+                var slatHeight = slatPositions.getHeight(slatIndex);
+                var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
+                var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
+                var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
+                var dayDate = this.props.cells[colIndex].date;
+                var time = core.addDurations(this.props.dateProfile.minTime, core.multiplyDuration(this.snapDuration, snapIndex));
+                var start = dateEnv.add(dayDate, time);
+                var end = dateEnv.add(start, this.snapDuration);
+                return {
+                    col: colIndex,
+                    dateSpan: {
+                        range: { start: start, end: end },
+                        allDay: false
+                    },
+                    dayEl: this.colEls[colIndex],
+                    relativeRect: {
+                        left: colPositions.lefts[colIndex],
+                        right: colPositions.rights[colIndex],
+                        top: slatTop,
+                        bottom: slatTop + slatHeight
+                    }
+                };
+            }
+        };
+        /* Event Drag Visualization
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype._renderEventDrag = function (state) {
+            if (state) {
+                this.eventRenderer.hideByHash(state.affectedInstances);
+                if (state.isEvent) {
+                    this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
+                }
+                else {
+                    this.fillRenderer.renderSegs('highlight', state.segs);
+                }
+            }
+        };
+        TimeGrid.prototype._unrenderEventDrag = function (state) {
+            if (state) {
+                this.eventRenderer.showByHash(state.affectedInstances);
+                this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
+                this.fillRenderer.unrender('highlight');
+            }
+        };
+        /* Event Resize Visualization
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGrid.prototype._renderEventResize = function (state) {
+            if (state) {
+                this.eventRenderer.hideByHash(state.affectedInstances);
+                this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        TimeGrid.prototype._unrenderEventResize = function (state) {
+            if (state) {
+                this.eventRenderer.showByHash(state.affectedInstances);
+                this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        /* Selection
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
+        TimeGrid.prototype._renderDateSelection = function (segs) {
+            if (segs) {
+                if (this.opt('selectMirror')) {
+                    this.mirrorRenderer.renderSegs(segs, { isSelecting: true });
+                }
+                else {
+                    this.fillRenderer.renderSegs('highlight', segs);
+                }
+            }
+        };
+        TimeGrid.prototype._unrenderDateSelection = function (segs) {
+            this.mirrorRenderer.unrender(segs, { isSelecting: true });
+            this.fillRenderer.unrender('highlight');
+        };
+        return TimeGrid;
+    }(core.DateComponent));
+
+    var AllDaySplitter = /** @class */ (function (_super) {
+        __extends(AllDaySplitter, _super);
+        function AllDaySplitter() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        AllDaySplitter.prototype.getKeyInfo = function () {
+            return {
+                allDay: {},
+                timed: {}
+            };
+        };
+        AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
+            if (dateSpan.allDay) {
+                return ['allDay'];
+            }
+            else {
+                return ['timed'];
+            }
+        };
+        AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
+            if (!eventDef.allDay) {
+                return ['timed'];
+            }
+            else if (core.hasBgRendering(eventDef)) {
+                return ['timed', 'allDay'];
+            }
+            else {
+                return ['allDay'];
+            }
+        };
+        return AllDaySplitter;
+    }(core.Splitter));
+
+    var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;
+    var WEEK_HEADER_FORMAT = core.createFormatter({ week: 'short' });
+    /* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
+    // Responsible for managing width/height.
+    var TimeGridView = /** @class */ (function (_super) {
+        __extends(TimeGridView, _super);
+        function TimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.splitter = new AllDaySplitter();
+            /* Header Render Methods
+            ------------------------------------------------------------------------------------------------------------------*/
+            // Generates the HTML that will go before the day-of week header cells
+            _this.renderHeadIntroHtml = function () {
+                var _a = _this, theme = _a.theme, dateEnv = _a.dateEnv;
+                var range = _this.props.dateProfile.renderRange;
+                var dayCnt = core.diffDays(range.start, range.end);
+                var weekText;
+                if (_this.opt('weekNumbers')) {
+                    weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);
+                    return '' +
+                        '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '>' +
+                        core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
+                        _this, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, core.htmlEscape(weekText) // inner HTML
+                        ) +
+                        '</th>';
+                }
+                else {
+                    return '<th class="fc-axis ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '></th>';
+                }
+            };
+            /* Time Grid Render Methods
+            ------------------------------------------------------------------------------------------------------------------*/
+            // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
+            _this.renderTimeGridBgIntroHtml = function () {
+                var theme = _this.theme;
+                return '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '></td>';
+            };
+            // Generates the HTML that goes before all other types of cells.
+            // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
+            _this.renderTimeGridIntroHtml = function () {
+                return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
+            };
+            /* Day Grid Render Methods
+            ------------------------------------------------------------------------------------------------------------------*/
+            // Generates the HTML that goes before the all-day cells
+            _this.renderDayGridBgIntroHtml = function () {
+                var theme = _this.theme;
+                return '' +
+                    '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '>' +
+                    '<span>' + // needed for matchCellWidths
+                    core.getAllDayHtml(_this) +
+                    '</span>' +
+                    '</td>';
+            };
+            // Generates the HTML that goes before all other types of cells.
+            // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
+            _this.renderDayGridIntroHtml = function () {
+                return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
+            };
+            _this.el.classList.add('fc-timeGrid-view');
+            _this.el.innerHTML = _this.renderSkeletonHtml();
+            _this.scroller = new core.ScrollComponent('hidden', // overflow x
+            'auto' // overflow y
+            );
+            var timeGridWrapEl = _this.scroller.el;
+            _this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);
+            timeGridWrapEl.classList.add('fc-time-grid-container');
+            var timeGridEl = core.createElement('div', { className: 'fc-time-grid' });
+            timeGridWrapEl.appendChild(timeGridEl);
+            _this.timeGrid = new TimeGrid(_this.context, timeGridEl, {
+                renderBgIntroHtml: _this.renderTimeGridBgIntroHtml,
+                renderIntroHtml: _this.renderTimeGridIntroHtml
+            });
+            if (_this.opt('allDaySlot')) { // should we display the "all-day" area?
+                _this.dayGrid = new daygrid.DayGrid(// the all-day subcomponent of this view
+                _this.context, _this.el.querySelector('.fc-day-grid'), {
+                    renderNumberIntroHtml: _this.renderDayGridIntroHtml,
+                    renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
+                    renderIntroHtml: _this.renderDayGridIntroHtml,
+                    colWeekNumbersVisible: false,
+                    cellWeekNumbersVisible: false
+                });
+                // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
+                _this.dayGrid.bottomCoordPadding = _this.el.querySelector('.fc-divider').offsetHeight;
+            }
+            return _this;
+        }
+        TimeGridView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.timeGrid.destroy();
+            if (this.dayGrid) {
+                this.dayGrid.destroy();
+            }
+            this.scroller.destroy();
+        };
+        /* Rendering
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Builds the HTML skeleton for the view.
+        // The day-grid and time-grid components will render inside containers defined by this HTML.
+        TimeGridView.prototype.renderSkeletonHtml = function () {
+            var theme = this.theme;
+            return '' +
+                '<table class="' + theme.getClass('tableGrid') + '">' +
+                (this.opt('columnHeader') ?
+                    '<thead class="fc-head">' +
+                        '<tr>' +
+                        '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
+                        '</tr>' +
+                        '</thead>' :
+                    '') +
+                '<tbody class="fc-body">' +
+                '<tr>' +
+                '<td class="' + theme.getClass('widgetContent') + '">' +
+                (this.opt('allDaySlot') ?
+                    '<div class="fc-day-grid"></div>' +
+                        '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" />' :
+                    '') +
+                '</td>' +
+                '</tr>' +
+                '</tbody>' +
+                '</table>';
+        };
+        /* Now Indicator
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGridView.prototype.getNowIndicatorUnit = function () {
+            return this.timeGrid.getNowIndicatorUnit();
+        };
+        // subclasses should implement
+        // renderNowIndicator(date: DateMarker) {
+        // }
+        TimeGridView.prototype.unrenderNowIndicator = function () {
+            this.timeGrid.unrenderNowIndicator();
+        };
+        /* Dimensions
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
+            _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
+            this.timeGrid.updateSize(isResize);
+            if (this.dayGrid) {
+                this.dayGrid.updateSize(isResize);
+            }
+        };
+        // Adjusts the vertical dimensions of the view to the specified values
+        TimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
+            var _this = this;
+            var eventLimit;
+            var scrollerHeight;
+            var scrollbarWidths;
+            // make all axis cells line up
+            this.axisWidth = core.matchCellWidths(core.findElements(this.el, '.fc-axis'));
+            // hack to give the view some height prior to timeGrid's columns being rendered
+            // TODO: separate setting height from scroller VS timeGrid.
+            if (!this.timeGrid.colEls) {
+                if (!isAuto) {
+                    scrollerHeight = this.computeScrollerHeight(viewHeight);
+                    this.scroller.setHeight(scrollerHeight);
+                }
+                return;
+            }
+            // set of fake row elements that must compensate when scroller has scrollbars
+            var noScrollRowEls = core.findElements(this.el, '.fc-row').filter(function (node) {
+                return !_this.scroller.el.contains(node);
+            });
+            // reset all dimensions back to the original state
+            this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this <hr> is necessary
+            this.scroller.clear(); // sets height to 'auto' and clears overflow
+            noScrollRowEls.forEach(core.uncompensateScroll);
+            // limit number of events in the all-day area
+            if (this.dayGrid) {
+                this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
+                eventLimit = this.opt('eventLimit');
+                if (eventLimit && typeof eventLimit !== 'number') {
+                    eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
+                }
+                if (eventLimit) {
+                    this.dayGrid.limitRows(eventLimit);
+                }
+            }
+            if (!isAuto) { // should we force dimensions of the scroll container?
+                scrollerHeight = this.computeScrollerHeight(viewHeight);
+                this.scroller.setHeight(scrollerHeight);
+                scrollbarWidths = this.scroller.getScrollbarWidths();
+                if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
+                    // make the all-day and header rows lines up
+                    noScrollRowEls.forEach(function (rowEl) {
+                        core.compensateScroll(rowEl, scrollbarWidths);
+                    });
+                    // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
+                    // and reapply the desired height to the scroller.
+                    scrollerHeight = this.computeScrollerHeight(viewHeight);
+                    this.scroller.setHeight(scrollerHeight);
+                }
+                // guarantees the same scrollbar widths
+                this.scroller.lockOverflow(scrollbarWidths);
+                // if there's any space below the slats, show the horizontal rule.
+                // this won't cause any new overflow, because lockOverflow already called.
+                if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
+                    this.timeGrid.bottomRuleEl.style.display = '';
+                }
+            }
+        };
+        // given a desired total height of the view, returns what the height of the scroller should be
+        TimeGridView.prototype.computeScrollerHeight = function (viewHeight) {
+            return viewHeight -
+                core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
+        };
+        /* Scroll
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Computes the initial pre-configured scroll state prior to allowing the user to change it
+        TimeGridView.prototype.computeDateScroll = function (timeMs) {
+            var top = this.timeGrid.computeTimeTop(timeMs);
+            // zoom can give weird floating-point values. rather scroll a little bit further
+            top = Math.ceil(top);
+            if (top) {
+                top++; // to overcome top border that slots beyond the first have. looks better
+            }
+            return { top: top };
+        };
+        TimeGridView.prototype.queryDateScroll = function () {
+            return { top: this.scroller.getScrollTop() };
+        };
+        TimeGridView.prototype.applyDateScroll = function (scroll) {
+            if (scroll.top !== undefined) {
+                this.scroller.setScrollTop(scroll.top);
+            }
+        };
+        // Generates an HTML attribute string for setting the width of the axis, if it is known
+        TimeGridView.prototype.axisStyleAttr = function () {
+            if (this.axisWidth != null) {
+                return 'style="width:' + this.axisWidth + 'px"';
+            }
+            return '';
+        };
+        return TimeGridView;
+    }(core.View));
+    TimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
+
+    var SimpleTimeGrid = /** @class */ (function (_super) {
+        __extends(SimpleTimeGrid, _super);
+        function SimpleTimeGrid(context, timeGrid) {
+            var _this = _super.call(this, context, timeGrid.el) || this;
+            _this.buildDayRanges = core.memoize(buildDayRanges);
+            _this.slicer = new TimeGridSlicer();
+            _this.timeGrid = timeGrid;
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.timeGrid.el
+            });
+            return _this;
+        }
+        SimpleTimeGrid.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        SimpleTimeGrid.prototype.render = function (props) {
+            var dateProfile = props.dateProfile, dayTable = props.dayTable;
+            var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, this.dateEnv);
+            this.timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, this.timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }));
+        };
+        SimpleTimeGrid.prototype.renderNowIndicator = function (date) {
+            this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);
+        };
+        SimpleTimeGrid.prototype.buildPositionCaches = function () {
+            this.timeGrid.buildPositionCaches();
+        };
+        SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this.timeGrid,
+                    dateSpan: rawHit.dateSpan,
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return SimpleTimeGrid;
+    }(core.DateComponent));
+    function buildDayRanges(dayTable, dateProfile, dateEnv) {
+        var ranges = [];
+        for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {
+            var date = _a[_i];
+            ranges.push({
+                start: dateEnv.add(date, dateProfile.minTime),
+                end: dateEnv.add(date, dateProfile.maxTime)
+            });
+        }
+        return ranges;
+    }
+    var TimeGridSlicer = /** @class */ (function (_super) {
+        __extends(TimeGridSlicer, _super);
+        function TimeGridSlicer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {
+            var segs = [];
+            for (var col = 0; col < dayRanges.length; col++) {
+                var segRange = core.intersectRanges(range, dayRanges[col]);
+                if (segRange) {
+                    segs.push({
+                        start: segRange.start,
+                        end: segRange.end,
+                        isStart: segRange.start.valueOf() === range.start.valueOf(),
+                        isEnd: segRange.end.valueOf() === range.end.valueOf(),
+                        col: col
+                    });
+                }
+            }
+            return segs;
+        };
+        return TimeGridSlicer;
+    }(core.Slicer));
+
+    var TimeGridView$1 = /** @class */ (function (_super) {
+        __extends(TimeGridView, _super);
+        function TimeGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.buildDayTable = core.memoize(buildDayTable);
+            if (_this.opt('columnHeader')) {
+                _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
+            }
+            _this.simpleTimeGrid = new SimpleTimeGrid(_this.context, _this.timeGrid);
+            if (_this.dayGrid) {
+                _this.simpleDayGrid = new daygrid.SimpleDayGrid(_this.context, _this.dayGrid);
+            }
+            return _this;
+        }
+        TimeGridView.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            if (this.header) {
+                this.header.destroy();
+            }
+            this.simpleTimeGrid.destroy();
+            if (this.simpleDayGrid) {
+                this.simpleDayGrid.destroy();
+            }
+        };
+        TimeGridView.prototype.render = function (props) {
+            _super.prototype.render.call(this, props); // for flags for updateSize
+            var dateProfile = this.props.dateProfile;
+            var dayTable = this.buildDayTable(dateProfile, this.dateProfileGenerator);
+            var splitProps = this.splitter.splitProps(props);
+            if (this.header) {
+                this.header.receiveProps({
+                    dateProfile: dateProfile,
+                    dates: dayTable.headerDates,
+                    datesRepDistinctDays: true,
+                    renderIntroHtml: this.renderHeadIntroHtml
+                });
+            }
+            this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,
+                dayTable: dayTable }));
+            if (this.simpleDayGrid) {
+                this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,
+                    dayTable: dayTable, nextDayThreshold: this.nextDayThreshold, isRigid: false }));
+            }
+        };
+        TimeGridView.prototype.renderNowIndicator = function (date) {
+            this.simpleTimeGrid.renderNowIndicator(date);
+        };
+        return TimeGridView;
+    }(TimeGridView));
+    function buildDayTable(dateProfile, dateProfileGenerator) {
+        var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
+        return new core.DayTable(daySeries, false);
+    }
+
+    var main = core.createPlugin({
+        defaultView: 'timeGridWeek',
+        views: {
+            timeGrid: {
+                class: TimeGridView$1,
+                allDaySlot: true,
+                slotDuration: '00:30:00',
+                slotEventOverlap: true // a bad name. confused with overlap/constraint system
+            },
+            timeGridDay: {
+                type: 'timeGrid',
+                duration: { days: 1 }
+            },
+            timeGridWeek: {
+                type: 'timeGrid',
+                duration: { weeks: 1 }
+            }
+        }
+    });
+
+    exports.AbstractTimeGridView = TimeGridView;
+    exports.TimeGrid = TimeGrid;
+    exports.TimeGridSlicer = TimeGridSlicer;
+    exports.TimeGridView = TimeGridView$1;
+    exports.buildDayRanges = buildDayRanges;
+    exports.buildDayTable = buildDayTable;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/timegrid/main.min.css b/backoffice/vendors/fullcalendar/timegrid/main.min.css
new file mode 100644 (file)
index 0000000..6ac8a25
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar Time Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/.fc-timeGrid-view .fc-day-grid{position:relative;z-index:2}.fc-timeGrid-view .fc-day-grid .fc-row{min-height:3em}.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-mirror-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event{margin-bottom:1px}.fc-time-grid-event-inset{-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event .fc-content{overflow:hidden;max-height:100%}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:"\000A0-\000A0"}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/timegrid/main.min.js b/backoffice/vendors/fullcalendar/timegrid/main.min.js
new file mode 100644 (file)
index 0000000..0c2dbb8
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Time Grid Plugin v4.1.0
+Docs & License: https://fullcalendar.io/
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core"),require("@fullcalendar/daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/daygrid"],t):(e=e||self,t(e.FullCalendarTimeGrid={},e.FullCalendar,e.FullCalendarDayGrid))}(this,function(e,t,r){"use strict";function i(e,t){function r(){this.constructor=e}u(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function n(e){var t,r,i,n=[];for(t=0;t<e.length;t++){for(r=e[t],i=0;i<n.length&&a(r,n[i]).length;i++);r.level=i,(n[i]||(n[i]=[])).push(r)}return n}function o(e){var t,r,i,n,o;for(t=0;t<e.length;t++)for(r=e[t],i=0;i<r.length;i++)for(n=r[i],n.forwardSegs=[],o=t+1;o<e.length;o++)a(n,e[o],n.forwardSegs)}function s(e){var t,r,i=e.forwardSegs,n=0;if(void 0===e.forwardPressure){for(t=0;t<i.length;t++)r=i[t],s(r),n=Math.max(n,1+r.forwardPressure);e.forwardPressure=n}}function a(e,t,r){void 0===r&&(r=[]);for(var i=0;i<t.length;i++)l(e,t[i])&&r.push(t[i]);return r}function l(e,t){return e.bottom>t.top&&e.top<t.bottom}function d(e){var r=t.buildSegCompareObj(e);return r.forwardPressure=e.forwardPressure,r.backwardCoord=e.backwardCoord,r}function c(e,t,r){for(var i=[],n=0,o=e.headerDates;n<o.length;n++){var s=o[n];i.push({start:r.add(s,t.minTime),end:r.add(s,t.maxTime)})}return i}function h(e,r){var i=new t.DaySeries(e.renderRange,r);return new t.DayTable(i,!1)}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var u=function(e,t){return(u=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},p=function(){return p=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++){t=arguments[r];for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])}return e},p.apply(this,arguments)},f=function(e){function r(r){var i=e.call(this,r.context)||this;return i.timeGrid=r,i.fullTimeFormat=t.createFormatter({hour:"numeric",minute:"2-digit",separator:i.context.options.defaultRangeSeparator}),i}return i(r,e),r.prototype.attachSegs=function(e,t){for(var r=this.timeGrid.groupSegsByCol(e),i=0;i<r.length;i++)r[i]=this.sortEventSegs(r[i]);this.segsByCol=r,this.timeGrid.attachSegsByCol(r,this.timeGrid.fgContainerEls)},r.prototype.detachSegs=function(e){e.forEach(function(e){t.removeElement(e.el)}),this.segsByCol=null},r.prototype.computeSegSizes=function(e){var t=this,r=t.timeGrid,i=t.segsByCol,n=r.colCnt;if(r.computeSegVerticals(e),i)for(var o=0;o<n;o++)this.computeSegHorizontals(i[o])},r.prototype.assignSegSizes=function(e){var t=this,r=t.timeGrid,i=t.segsByCol,n=r.colCnt;if(r.assignSegVerticals(e),i)for(var o=0;o<n;o++)this.assignSegCss(i[o])},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:!1}},r.prototype.computeDisplayEventEnd=function(){return!0},r.prototype.renderSegHtml=function(e,r){var i,n,o,s=e.eventRange,a=s.def,l=s.ui,d=a.allDay,c=l.startEditable,h=e.isStart&&l.durationEditable&&this.context.options.eventResizableFromStart,u=e.isEnd&&l.durationEditable,p=this.getSegClasses(e,c,h||u,r),f=t.cssToStr(this.getSkinCss(l));if(p.unshift("fc-time-grid-event"),t.isMultiDayRange(s.range)){if(e.isStart||e.isEnd){var g=e.start,m=e.end;i=this._getTimeText(g,m,d),n=this._getTimeText(g,m,d,this.fullTimeFormat),o=this._getTimeText(g,m,d,null,!1)}}else i=this.getTimeText(s),n=this.getTimeText(s,this.fullTimeFormat),o=this.getTimeText(s,null,!1);return'<a class="'+p.join(" ")+'"'+(a.url?' href="'+t.htmlEscape(a.url)+'"':"")+(f?' style="'+f+'"':"")+'><div class="fc-content">'+(i?'<div class="fc-time" data-start="'+t.htmlEscape(o)+'" data-full="'+t.htmlEscape(n)+'"><span>'+t.htmlEscape(i)+"</span></div>":"")+(a.title?'<div class="fc-title">'+t.htmlEscape(a.title)+"</div>":"")+"</div>"+(u?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},r.prototype.computeSegHorizontals=function(e){var t,r,i;if(t=n(e),o(t),r=t[0]){for(i=0;i<r.length;i++)s(r[i]);for(i=0;i<r.length;i++)this.computeSegForwardBack(r[i],0,0)}},r.prototype.computeSegForwardBack=function(e,t,r){var i,n=e.forwardSegs;if(void 0===e.forwardCoord)for(n.length?(this.sortForwardSegs(n),this.computeSegForwardBack(n[0],t+1,r),e.forwardCoord=n[0].backwardCoord):e.forwardCoord=1,e.backwardCoord=e.forwardCoord-(e.forwardCoord-r)/(t+1),i=0;i<n.length;i++)this.computeSegForwardBack(n[i],0,e.forwardCoord)},r.prototype.sortForwardSegs=function(e){var r=e.map(d),i=[{field:"forwardPressure",order:-1},{field:"backwardCoord",order:1}].concat(this.context.view.eventOrderSpecs);return r.sort(function(e,r){return t.compareByFieldSpecs(e,r,i)}),r.map(function(e){return e._seg})},r.prototype.assignSegCss=function(e){for(var r=0,i=e;r<i.length;r++){var n=i[r];t.applyStyle(n.el,this.generateSegCss(n)),n.level>0&&n.el.classList.add("fc-time-grid-event-inset"),n.eventRange.def.title&&n.bottom-n.top<30&&n.el.classList.add("fc-short")}},r.prototype.generateSegCss=function(e){var t,r,i=this.context.options.slotEventOverlap,n=e.backwardCoord,o=e.forwardCoord,s=this.timeGrid.generateSegVerticalCss(e),a=this.timeGrid.isRtl;return i&&(o=Math.min(1,n+2*(o-n))),a?(t=1-o,r=n):(t=n,r=1-o),s.zIndex=e.level+1,s.left=100*t+"%",s.right=100*r+"%",i&&e.forwardPressure&&(s[a?"marginLeft":"marginRight"]=20),s},r}(t.FgEventRenderer),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t.prototype.attachSegs=function(e,t){this.segsByCol=this.timeGrid.groupSegsByCol(e),this.timeGrid.attachSegsByCol(this.segsByCol,this.timeGrid.mirrorContainerEls),this.sourceSeg=t.sourceSeg},t.prototype.generateSegCss=function(t){var r=e.prototype.generateSegCss.call(this,t),i=this.sourceSeg;if(i&&i.col===t.col){var n=e.prototype.generateSegCss.call(this,i);r.left=n.left,r.right=n.right,r.marginLeft=n.marginLeft,r.marginRight=n.marginRight}return r},t}(f),m=function(e){function t(t){var r=e.call(this,t.context)||this;return r.timeGrid=t,r}return i(t,e),t.prototype.attachSegs=function(e,t){var r,i=this.timeGrid;return"bgEvent"===e?r=i.bgContainerEls:"businessHours"===e?r=i.businessContainerEls:"highlight"===e&&(r=i.highlightContainerEls),i.attachSegsByCol(i.groupSegsByCol(t),r),t.map(function(e){return e.el})},t.prototype.computeSegSizes=function(e){this.timeGrid.computeSegVerticals(e)},t.prototype.assignSegSizes=function(e){this.timeGrid.assignSegVerticals(e)},t}(t.FillRenderer),y=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],v=function(e){function n(r,i,n){var o=e.call(this,r,i)||this;o.isSlatSizesDirty=!1,o.isColSizesDirty=!1,o.renderSlats=t.memoizeRendering(o._renderSlats);var s=o.eventRenderer=new f(o),a=o.fillRenderer=new m(o);o.mirrorRenderer=new g(o);var l=o.renderColumns=t.memoizeRendering(o._renderColumns,o._unrenderColumns);return o.renderBusinessHours=t.memoizeRendering(a.renderSegs.bind(a,"businessHours"),a.unrender.bind(a,"businessHours"),[l]),o.renderDateSelection=t.memoizeRendering(o._renderDateSelection,o._unrenderDateSelection,[l]),o.renderFgEvents=t.memoizeRendering(s.renderSegs.bind(s),s.unrender.bind(s),[l]),o.renderBgEvents=t.memoizeRendering(a.renderSegs.bind(a,"bgEvent"),a.unrender.bind(a,"bgEvent"),[l]),o.renderEventSelection=t.memoizeRendering(s.selectByInstanceId.bind(s),s.unselectByInstanceId.bind(s),[o.renderFgEvents]),o.renderEventDrag=t.memoizeRendering(o._renderEventDrag,o._unrenderEventDrag,[l]),o.renderEventResize=t.memoizeRendering(o._renderEventResize,o._unrenderEventResize,[l]),o.processOptions(),i.innerHTML='<div class="fc-bg"></div><div class="fc-slats"></div><hr class="fc-divider '+o.theme.getClass("widgetHeader")+'" style="display:none" />',o.rootBgContainerEl=i.querySelector(".fc-bg"),o.slatContainerEl=i.querySelector(".fc-slats"),o.bottomRuleEl=i.querySelector(".fc-divider"),o.renderProps=n,o}return i(n,e),n.prototype.processOptions=function(){var e,r,i=this.opt("slotDuration"),n=this.opt("snapDuration");i=t.createDuration(i),n=n?t.createDuration(n):i,e=t.wholeDivideDurations(i,n),null===e&&(n=i,e=1),this.slotDuration=i,this.snapDuration=n,this.snapsPerSlot=e,r=this.opt("slotLabelFormat"),Array.isArray(r)&&(r=r[r.length-1]),this.labelFormat=t.createFormatter(r||{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"}),r=this.opt("slotLabelInterval"),this.labelInterval=r?t.createDuration(r):this.computeLabelInterval(i)},n.prototype.computeLabelInterval=function(e){var r,i,n;for(r=y.length-1;r>=0;r--)if(i=t.createDuration(y[r]),null!==(n=t.wholeDivideDurations(i,e))&&n>1)return i;return e},n.prototype.render=function(e){var t=e.cells;this.colCnt=t.length,this.renderSlats(e.dateProfile),this.renderColumns(e.cells,e.dateProfile),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderFgEvents(e.fgEventSegs),this.renderBgEvents(e.bgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize)},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSlats.unrender(),this.renderColumns.unrender()},n.prototype.updateSize=function(e){var t=this,r=t.fillRenderer,i=t.eventRenderer,n=t.mirrorRenderer;(e||this.isSlatSizesDirty)&&(this.buildSlatPositions(),this.isSlatSizesDirty=!1),(e||this.isColSizesDirty)&&(this.buildColPositions(),this.isColSizesDirty=!1),r.computeSizes(e),i.computeSizes(e),n.computeSizes(e),r.assignSizes(e),i.assignSizes(e),n.assignSizes(e)},n.prototype._renderSlats=function(e){var r=this.theme;this.slatContainerEl.innerHTML='<table class="'+r.getClass("tableGrid")+'">'+this.renderSlatRowHtml(e)+"</table>",this.slatEls=t.findElements(this.slatContainerEl,"tr"),this.slatPositions=new t.PositionCache(this.el,this.slatEls,!1,!0),this.isSlatSizesDirty=!0},n.prototype.renderSlatRowHtml=function(e){for(var r,i,n,o=this,s=o.dateEnv,a=o.theme,l=o.isRtl,d="",c=t.startOfDay(e.renderRange.start),h=e.minTime,u=t.createDuration(0);t.asRoughMs(h)<t.asRoughMs(e.maxTime);)r=s.add(c,h),i=null!==t.wholeDivideDurations(u,this.labelInterval),n='<td class="fc-axis fc-time '+a.getClass("widgetContent")+'">'+(i?"<span>"+t.htmlEscape(s.format(r,this.labelFormat))+"</span>":"")+"</td>",d+='<tr data-time="'+t.formatIsoTimeString(r)+'"'+(i?"":' class="fc-minor"')+">"+(l?"":n)+'<td class="'+a.getClass("widgetContent")+'"></td>'+(l?n:"")+"</tr>",h=t.addDurations(h,this.slotDuration),u=t.addDurations(u,this.slotDuration);return d},n.prototype._renderColumns=function(e,i){var n=this,o=n.theme,s=n.dateEnv,a=n.view,l=new r.DayBgRow(this.context);this.rootBgContainerEl.innerHTML='<table class="'+o.getClass("tableGrid")+'">'+l.renderHtml({cells:e,dateProfile:i,renderIntroHtml:this.renderProps.renderBgIntroHtml})+"</table>",this.colEls=t.findElements(this.el,".fc-day, .fc-disabled-day");for(var d=0;d<this.colCnt;d++)this.publiclyTrigger("dayRender",[{date:s.toDate(e[d].date),el:this.colEls[d],view:a}]);this.isRtl&&this.colEls.reverse(),this.colPositions=new t.PositionCache(this.el,this.colEls,!0,!1),this.renderContentSkeleton(),this.isColSizesDirty=!0},n.prototype._unrenderColumns=function(){this.unrenderContentSkeleton()},n.prototype.renderContentSkeleton=function(){var e,r=[];r.push(this.renderProps.renderIntroHtml());for(var i=0;i<this.colCnt;i++)r.push('<td><div class="fc-content-col"><div class="fc-event-container fc-mirror-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>');this.isRtl&&r.reverse(),e=this.contentSkeletonEl=t.htmlToElement('<div class="fc-content-skeleton"><table><tr>'+r.join("")+"</tr></table></div>"),this.colContainerEls=t.findElements(e,".fc-content-col"),this.mirrorContainerEls=t.findElements(e,".fc-mirror-container"),this.fgContainerEls=t.findElements(e,".fc-event-container:not(.fc-mirror-container)"),this.bgContainerEls=t.findElements(e,".fc-bgevent-container"),this.highlightContainerEls=t.findElements(e,".fc-highlight-container"),this.businessContainerEls=t.findElements(e,".fc-business-container"),this.isRtl&&(this.colContainerEls.reverse(),this.mirrorContainerEls.reverse(),this.fgContainerEls.reverse(),this.bgContainerEls.reverse(),this.highlightContainerEls.reverse(),this.businessContainerEls.reverse()),this.el.appendChild(e)},n.prototype.unrenderContentSkeleton=function(){t.removeElement(this.contentSkeletonEl)},n.prototype.groupSegsByCol=function(e){var t,r=[];for(t=0;t<this.colCnt;t++)r.push([]);for(t=0;t<e.length;t++)r[e[t].col].push(e[t]);return r},n.prototype.attachSegsByCol=function(e,t){var r,i,n;for(r=0;r<this.colCnt;r++)for(i=e[r],n=0;n<i.length;n++)t[r].appendChild(i[n].el)},n.prototype.getNowIndicatorUnit=function(){return"minute"},n.prototype.renderNowIndicator=function(e,r){if(this.colContainerEls){var i,n=this.computeDateTop(r),o=[];for(i=0;i<e.length;i++){var s=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-line"});s.style.top=n+"px",this.colContainerEls[e[i].col].appendChild(s),o.push(s)}if(e.length>0){var a=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-arrow"});a.style.top=n+"px",this.contentSkeletonEl.appendChild(a),o.push(a)}this.nowIndicatorEls=o}},n.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.forEach(t.removeElement),this.nowIndicatorEls=null)},n.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.offsetHeight},n.prototype.computeDateTop=function(e,r){return r||(r=t.startOfDay(e)),this.computeTimeTop(e.valueOf()-r.valueOf())},n.prototype.computeTimeTop=function(e){var r,i,n=this.slatEls.length,o=this.props.dateProfile,s=(e-t.asRoughMs(o.minTime))/t.asRoughMs(this.slotDuration);return s=Math.max(0,s),s=Math.min(n,s),r=Math.floor(s),r=Math.min(r,n-1),i=s-r,this.slatPositions.tops[r]+this.slatPositions.getHeight(r)*i},n.prototype.computeSegVerticals=function(e){var t,r,i,n=this.opt("timeGridEventMinHeight");for(t=0;t<e.length;t++)r=e[t],i=this.props.cells[r.col].date,r.top=this.computeDateTop(r.start,i),r.bottom=Math.max(r.top+n,this.computeDateTop(r.end,i))},n.prototype.assignSegVerticals=function(e){var r,i;for(r=0;r<e.length;r++)i=e[r],t.applyStyle(i.el,this.generateSegVerticalCss(i))},n.prototype.generateSegVerticalCss=function(e){return{top:e.top,bottom:-e.bottom}},n.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildSlatPositions()},n.prototype.buildColPositions=function(){this.colPositions.build()},n.prototype.buildSlatPositions=function(){this.slatPositions.build()},n.prototype.positionToHit=function(e,r){var i=this,n=i.dateEnv,o=i.snapsPerSlot,s=i.slatPositions,a=i.colPositions,l=a.leftToIndex(e),d=s.topToIndex(r);if(null!=l&&null!=d){var c=s.tops[d],h=s.getHeight(d),u=(r-c)/h,p=Math.floor(u*o),f=d*o+p,g=this.props.cells[l].date,m=t.addDurations(this.props.dateProfile.minTime,t.multiplyDuration(this.snapDuration,f)),y=n.add(g,m);return{col:l,dateSpan:{range:{start:y,end:n.add(y,this.snapDuration)},allDay:!1},dayEl:this.colEls[l],relativeRect:{left:a.lefts[l],right:a.rights[l],top:c,bottom:c+h}}}},n.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),e.isEvent?this.mirrorRenderer.renderSegs(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}):this.fillRenderer.renderSegs("highlight",e.segs))},n.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}),this.fillRenderer.unrender("highlight"))},n.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.mirrorRenderer.renderSegs(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},n.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},n.prototype._renderDateSelection=function(e){e&&(this.opt("selectMirror")?this.mirrorRenderer.renderSegs(e,{isSelecting:!0}):this.fillRenderer.renderSegs("highlight",e))},n.prototype._unrenderDateSelection=function(e){this.mirrorRenderer.unrender(e,{isSelecting:!0}),this.fillRenderer.unrender("highlight")},n}(t.DateComponent),S=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return i(r,e),r.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},r.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},r.prototype.getKeysForEventDef=function(e){return e.allDay?t.hasBgRendering(e)?["timed","allDay"]:["allDay"]:["timed"]},r}(t.Splitter),C=t.createFormatter({week:"short"}),b=function(e){function n(i,n,o,s){var a=e.call(this,i,n,o,s)||this;a.splitter=new S,a.renderHeadIntroHtml=function(){var e,r=a,i=r.theme,n=r.dateEnv,o=a.props.dateProfile.renderRange,s=t.diffDays(o.start,o.end);return a.opt("weekNumbers")?(e=n.format(o.start,C),'<th class="fc-axis fc-week-number '+i.getClass("widgetHeader")+'" '+a.axisStyleAttr()+">"+t.buildGotoAnchorHtml(a,{date:o.start,type:"week",forceOff:s>1},t.htmlEscape(e))+"</th>"):'<th class="fc-axis '+i.getClass("widgetHeader")+'" '+a.axisStyleAttr()+"></th>"},a.renderTimeGridBgIntroHtml=function(){return'<td class="fc-axis '+a.theme.getClass("widgetContent")+'" '+a.axisStyleAttr()+"></td>"},a.renderTimeGridIntroHtml=function(){return'<td class="fc-axis" '+a.axisStyleAttr()+"></td>"},a.renderDayGridBgIntroHtml=function(){return'<td class="fc-axis '+a.theme.getClass("widgetContent")+'" '+a.axisStyleAttr()+"><span>"+t.getAllDayHtml(a)+"</span></td>"},a.renderDayGridIntroHtml=function(){return'<td class="fc-axis" '+a.axisStyleAttr()+"></td>"},a.el.classList.add("fc-timeGrid-view"),a.el.innerHTML=a.renderSkeletonHtml(),a.scroller=new t.ScrollComponent("hidden","auto");var l=a.scroller.el;a.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-time-grid-container");var d=t.createElement("div",{className:"fc-time-grid"});return l.appendChild(d),a.timeGrid=new v(a.context,d,{renderBgIntroHtml:a.renderTimeGridBgIntroHtml,renderIntroHtml:a.renderTimeGridIntroHtml}),a.opt("allDaySlot")&&(a.dayGrid=new r.DayGrid(a.context,a.el.querySelector(".fc-day-grid"),{renderNumberIntroHtml:a.renderDayGridIntroHtml,renderBgIntroHtml:a.renderDayGridBgIntroHtml,renderIntroHtml:a.renderDayGridIntroHtml,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1}),a.dayGrid.bottomCoordPadding=a.el.querySelector(".fc-divider").offsetHeight),a}return i(n,e),n.prototype.destroy=function(){e.prototype.destroy.call(this),this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),this.scroller.destroy()},n.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'">'+(this.opt("columnHeader")?'<thead class="fc-head"><tr><td class="fc-head-container '+e.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+e.getClass("widgetContent")+'">'+(this.opt("allDaySlot")?'<div class="fc-day-grid"></div><hr class="fc-divider '+e.getClass("widgetHeader")+'" />':"")+"</td></tr></tbody></table>"},n.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},n.prototype.unrenderNowIndicator=function(){this.timeGrid.unrenderNowIndicator()},n.prototype.updateSize=function(t,r,i){e.prototype.updateSize.call(this,t,r,i),this.timeGrid.updateSize(t),this.dayGrid&&this.dayGrid.updateSize(t)},n.prototype.updateBaseSize=function(e,r,i){var n,o,s,a=this;if(this.axisWidth=t.matchCellWidths(t.findElements(this.el,".fc-axis")),!this.timeGrid.colEls)return void(i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o)));var l=t.findElements(this.el,".fc-row").filter(function(e){return!a.scroller.el.contains(e)});this.timeGrid.bottomRuleEl.style.display="none",this.scroller.clear(),l.forEach(t.uncompensateScroll),this.dayGrid&&(this.dayGrid.removeSegPopover(),n=this.opt("eventLimit"),n&&"number"!=typeof n&&(n=5),n&&this.dayGrid.limitRows(n)),i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o),s=this.scroller.getScrollbarWidths(),(s.left||s.right)&&(l.forEach(function(e){t.compensateScroll(e,s)}),o=this.computeScrollerHeight(r),this.scroller.setHeight(o)),this.scroller.lockOverflow(s),this.timeGrid.getTotalSlatHeight()<o&&(this.timeGrid.bottomRuleEl.style.display=""))},n.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},n.prototype.computeDateScroll=function(e){var t=this.timeGrid.computeTimeTop(e);return t=Math.ceil(t),t&&t++,{top:t}},n.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},n.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},n.prototype.axisStyleAttr=function(){return null!=this.axisWidth?'style="width:'+this.axisWidth+'px"':""},n}(t.View);b.prototype.usesMinMaxTime=!0;var E=function(e){function r(r,i){var n=e.call(this,r,i.el)||this;return n.buildDayRanges=t.memoize(c),n.slicer=new D,n.timeGrid=i,r.calendar.registerInteractiveComponent(n,{el:n.timeGrid.el}),n}return i(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},r.prototype.render=function(e){var t=e.dateProfile,r=e.dayTable,i=this.dayRanges=this.buildDayRanges(r,t,this.dateEnv);this.timeGrid.receiveProps(p({},this.slicer.sliceProps(e,t,null,this.timeGrid,i),{dateProfile:t,cells:r.cells[0]}))},r.prototype.renderNowIndicator=function(e){this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(e,this.timeGrid,this.dayRanges),e)},r.prototype.buildPositionCaches=function(){this.timeGrid.buildPositionCaches()},r.prototype.queryHit=function(e,t){var r=this.timeGrid.positionToHit(e,t);if(r)return{component:this.timeGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},r}(t.DateComponent),D=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return i(r,e),r.prototype.sliceRange=function(e,r){for(var i=[],n=0;n<r.length;n++){var o=t.intersectRanges(e,r[n]);o&&i.push({start:o.start,end:o.end,isStart:o.start.valueOf()===e.start.valueOf(),isEnd:o.end.valueOf()===e.end.valueOf(),col:n})}return i},r}(t.Slicer),w=function(e){function n(i,n,o,s){var a=e.call(this,i,n,o,s)||this;return a.buildDayTable=t.memoize(h),a.opt("columnHeader")&&(a.header=new t.DayHeader(a.context,a.el.querySelector(".fc-head-container"))),a.simpleTimeGrid=new E(a.context,a.timeGrid),a.dayGrid&&(a.simpleDayGrid=new r.SimpleDayGrid(a.context,a.dayGrid)),a}return i(n,e),n.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.simpleTimeGrid.destroy(),this.simpleDayGrid&&this.simpleDayGrid.destroy()},n.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.props.dateProfile,i=this.buildDayTable(r,this.dateProfileGenerator),n=this.splitter.splitProps(t);this.header&&this.header.receiveProps({dateProfile:r,dates:i.headerDates,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.simpleTimeGrid.receiveProps(p({},n.timed,{dateProfile:r,dayTable:i})),this.simpleDayGrid&&this.simpleDayGrid.receiveProps(p({},n.allDay,{dateProfile:r,dayTable:i,nextDayThreshold:this.nextDayThreshold,isRigid:!1}))},n.prototype.renderNowIndicator=function(e){this.simpleTimeGrid.renderNowIndicator(e)},n}(b),G=t.createPlugin({defaultView:"timeGridWeek",views:{timeGrid:{class:w,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}});e.AbstractTimeGridView=b,e.TimeGrid=v,e.TimeGridSlicer=D,e.TimeGridView=w,e.buildDayRanges=c,e.buildDayTable=h,e.default=G,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/timegrid/package.json b/backoffice/vendors/fullcalendar/timegrid/package.json
new file mode 100644 (file)
index 0000000..3366c81
--- /dev/null
@@ -0,0 +1,65 @@
+{
+  "_from": "@fullcalendar/timegrid",
+  "_id": "@fullcalendar/timegrid@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-UGAXN5qHnL8mDMr/+Zfrn7jh4GMO2WpOCLTUB8GmiSTbewVD+iHjhJuJKhkdrL8CEinEjHidsux3qXKSrFreYQ==",
+  "_location": "/@fullcalendar/timegrid",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/timegrid",
+    "name": "@fullcalendar/timegrid",
+    "escapedName": "@fullcalendar%2ftimegrid",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/timegrid/-/timegrid-4.1.0.tgz",
+  "_shasum": "6e825f0cab79d81875a73fbb563cc69844ff0ecf",
+  "_spec": "@fullcalendar/timegrid",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://fullcalendar.io/reporting-bugs"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "dependencies": {
+    "@fullcalendar/daygrid": "~4.1.0"
+  },
+  "deprecated": false,
+  "description": "Display your events on a grid of time slots",
+  "docs": "https://fullcalendar.io/docs/timegrid-view",
+  "homepage": "https://fullcalendar.io/",
+  "keywords": [
+    "calendar",
+    "event",
+    "full-sized"
+  ],
+  "license": "MIT",
+  "main": "main.js",
+  "name": "@fullcalendar/timegrid",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar"
+  },
+  "title": "FullCalendar Time Grid Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
diff --git a/backoffice/vendors/fullcalendar/timeline/LICENSE.md b/backoffice/vendors/fullcalendar/timeline/LICENSE.md
new file mode 100644 (file)
index 0000000..5229663
--- /dev/null
@@ -0,0 +1,18 @@
+
+For complete licensing information, visit:
+http://fullcalendar.io/scheduler/license
+
+FullCalendar Scheduler is tri-licensed, meaning you must choose
+one of three licenses to use. Here is a summary of those licenses:
+
+- Commercial License
+  (a paid license, meant for commercial use)
+  http://fullcalendar.io/scheduler/license-details
+
+- Creative Commons Non-Commercial No-Derivatives
+  (meant for trial and non-commercial use)
+  https://creativecommons.org/licenses/by-nc-nd/4.0/
+
+- GPLv3 License
+  (meant for open-source projects)
+  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/backoffice/vendors/fullcalendar/timeline/README.md b/backoffice/vendors/fullcalendar/timeline/README.md
new file mode 100644 (file)
index 0000000..ade1cab
--- /dev/null
@@ -0,0 +1,8 @@
+
+# FullCalendar Timeline Plugin
+
+Display events on a horizontal time axis (without resources)
+
+[View the docs &raquo;](https://fullcalendar.io/docs/timeline-view-no-resources)
+
+This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/backoffice/vendors/fullcalendar/timeline/main.css b/backoffice/vendors/fullcalendar/timeline/main.css
new file mode 100644 (file)
index 0000000..faa73dd
--- /dev/null
@@ -0,0 +1,306 @@
+/*!
+FullCalendar Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+/* Scroller
+--------------------------------------------------------------------------------------------------*/
+.fc-scroller-clip {
+  overflow: hidden;
+  /* for clipping scrollbars */
+  position: relative;
+  /* so things like scrollfollowers can attach to this */ }
+
+/* supresses rendering of native scrollbars */
+/* on .fc-scroller */
+.fc-no-scrollbars {
+  background: rgba(255, 255, 255, 0);
+  /* hack for dynamic DOM nodes (in Chrome OSX at least) */ }
+
+.fc-no-scrollbars::-webkit-scrollbar {
+  width: 0;
+  height: 0; }
+
+.fc-scroller-canvas {
+  position: relative;
+  /* origin for bg */
+  box-sizing: border-box;
+  /* so that padding (for gutter) will be part of height */
+  min-height: 100%; }
+
+.fc-scroller-canvas > .fc-bg {
+  z-index: 1;
+  /* make default? */ }
+
+.fc-scroller-canvas > .fc-content {
+  z-index: 2;
+  /* make default? */
+  position: relative;
+  /* origin for inner content */
+  border-style: solid;
+  border-width: 0; }
+
+.fc-scroller-canvas.fc-gutter-left > .fc-content {
+  border-left-width: 1px;
+  margin-left: -1px; }
+
+.fc-scroller-canvas.fc-gutter-right > .fc-content {
+  border-right-width: 1px;
+  margin-right: -1px; }
+
+.fc-scroller-canvas.fc-gutter-top > .fc-content {
+  border-top-width: 1px;
+  margin-top: -1px; }
+
+/* content is responsible for bottom border */
+/* View Structure
+--------------------------------------------------------------------------------------------------*/
+.fc-rtl .fc-timeline {
+  direction: rtl; }
+
+.fc-scrolled .fc-head .fc-scroller {
+  z-index: 2;
+  /* so drop shadow will go above body panes */ }
+
+.fc-timeline.fc-scrolled .fc-head .fc-scroller {
+  box-shadow: 0 3px 4px rgba(0, 0, 0, 0.075); }
+
+.fc-timeline .fc-body .fc-scroller {
+  z-index: 1; }
+
+/*
+on most tables that expand to the edges, kill the outer border,
+because the container elements take care of it.
+example tables:
+.fc-scroller-canvas .fc-content table
+.fc-scroller-canvas .fc-bg .fc-slats table
+*/
+.fc-timeline .fc-scroller-canvas > div > table,
+.fc-timeline .fc-scroller-canvas > div > div > table {
+  border-style: hidden; }
+
+/*
+for resource rows (in both the spreadsheet and timeline areas),
+undo previous rule in order to always show last border.
+*/
+.fc-timeline .fc-scroller-canvas > .fc-content > .fc-rows > table {
+  border-bottom-style: none; }
+
+/* Table Cell Common
+--------------------------------------------------------------------------------------------------*/
+.fc-timeline th,
+.fc-timeline td {
+  white-space: nowrap; }
+
+.fc-timeline .fc-cell-content {
+  overflow: hidden; }
+
+.fc-timeline .fc-cell-text {
+  display: inline-block;
+  padding-left: 4px;
+  padding-right: 4px; }
+
+/*
+Cells at the start of a week
+TODO: figure out better styling
+
+.fc-ltr .fc-timeline .fc-em-cell div {
+  border-left: 3px solid #eee;
+  height: 100%;
+}
+.fc-rtl .fc-timeline .fc-em-cell {
+  border-right-width: 3px;
+}
+*/
+/* head */
+.fc-timeline th {
+  vertical-align: middle; }
+
+.fc-timeline .fc-head .fc-cell-content {
+  padding-top: 3px;
+  padding-bottom: 3px; }
+
+.fc-timeline .fc-head .fc-time-area .fc-cell-content {
+  overflow: visible; }
+
+/* Time Area
+--------------------------------------------------------------------------------------------------*/
+.fc-time-area col {
+  min-width: 2.2em;
+  /* detected by JS */ }
+
+/* head */
+.fc-ltr .fc-time-area .fc-chrono th {
+  text-align: left; }
+
+.fc-rtl .fc-time-area .fc-chrono th {
+  text-align: right; }
+
+/* body slats (vertical lines) */
+.fc-time-area .fc-slats {
+  /* fc-bg is responsible for a lot of this now! */
+  position: absolute;
+  z-index: 1;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0; }
+
+.fc-time-area .fc-slats table {
+  height: 100%; }
+
+.fc-time-area .fc-slats .fc-minor {
+  border-style: dotted; }
+
+.fc-time-area .fc-slats td {
+  border-width: 0 1px;
+  /* need to do this. sometimes -1 margin wouldn't hide the dotted */ }
+
+.fc-ltr .fc-time-area .fc-slats td {
+  border-right-width: 0; }
+
+.fc-rtl .fc-time-area .fc-slats td {
+  border-left-width: 0; }
+
+/* body content containers
+   can be within rows or directly within the pane's content
+*/
+.fc-time-area .fc-bgevent-container,
+.fc-time-area .fc-highlight-container {
+  position: absolute;
+  z-index: 2;
+  /* only for directly within pane. not for row. overridden later */
+  top: 0;
+  bottom: 0;
+  width: 0; }
+
+.fc-ltr .fc-time-area .fc-mirror-container,
+.fc-ltr .fc-time-area .fc-bgevent-container,
+.fc-ltr .fc-time-area .fc-highlight-container {
+  left: 0; }
+
+.fc-rtl .fc-time-area .fc-mirror-container,
+.fc-rtl .fc-time-area .fc-bgevent-container,
+.fc-rtl .fc-time-area .fc-highlight-container {
+  right: 0; }
+
+.fc-time-area .fc-bgevent,
+.fc-time-area .fc-highlight {
+  position: absolute;
+  top: 0;
+  bottom: 0; }
+
+/* Now Indicator
+--------------------------------------------------------------------------------------------------*/
+.fc-timeline .fc-now-indicator {
+  /* both the arrow and the line */
+  z-index: 3;
+  /* one above scroller's fc-content */
+  top: 0; }
+
+.fc-time-area .fc-now-indicator-arrow {
+  margin: 0 -6px;
+  /* 5, then one more to counteract scroller's negative margins */
+  /* triangle pointing down... */
+  border-width: 6px 5px 0 5px;
+  border-left-color: transparent;
+  border-right-color: transparent; }
+
+.fc-time-area .fc-now-indicator-line {
+  margin: 0 -1px;
+  /* counteract scroller's negative margins */
+  bottom: 0;
+  border-left-width: 1px; }
+
+/* Event Container
+--------------------------------------------------------------------------------------------------*/
+.fc-time-area .fc-event-container {
+  position: relative;
+  z-index: 2;
+  /* above bgevent and highlight */
+  width: 0;
+  /* for event positioning. will end up on correct side based on dir */ }
+
+.fc-time-area .fc-mirror-container {
+  /* also an fc-event-container */
+  position: absolute;
+  z-index: 3;
+  top: 0; }
+
+.fc-time-area .fc-event-container {
+  padding-bottom: 8px;
+  top: -1px; }
+
+.fc-time-area tr:first-child .fc-event-container {
+  top: 0; }
+
+.fc-no-overlap .fc-time-area .fc-event-container {
+  padding-bottom: 0;
+  top: 0; }
+
+/* Time Grid Events
+--------------------------------------------------------------------------------------------------*/
+.fc-timeline-event {
+  position: absolute;
+  border-radius: 0;
+  padding: 2px 0;
+  margin-bottom: 1px; }
+
+.fc-no-overlap .fc-timeline-event {
+  padding: 5px 0;
+  margin-bottom: 0; }
+
+/* don't overlap grid lines at the event's end */
+.fc-ltr .fc-timeline-event {
+  margin-right: 1px; }
+
+.fc-rtl .fc-timeline-event {
+  margin-left: 1px; }
+
+.fc-timeline-event .fc-time {
+  font-weight: bold;
+  padding: 0 1px; }
+
+.fc-rtl .fc-timeline-event .fc-time {
+  display: inline-block;
+  /* will force it on the other side */ }
+
+.fc-timeline-event .fc-title {
+  padding: 0 3px;
+  display: inline-block;
+  vertical-align: top;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  max-width: 100%;
+  white-space: nowrap;
+  overflow: hidden; }
+
+.fc-ltr .fc-timeline-event.fc-not-start .fc-content,
+.fc-rtl .fc-timeline-event.fc-not-end .fc-content {
+  margin-left: 8px; }
+
+.fc-rtl .fc-timeline-event.fc-not-start .fc-content,
+.fc-ltr .fc-timeline-event.fc-not-end .fc-content {
+  margin-right: 8px; }
+
+.fc-timeline-event.fc-not-start .fc-content:before,
+.fc-timeline-event.fc-not-end .fc-content:after {
+  content: "";
+  position: absolute;
+  top: 50%;
+  margin-top: -5px;
+  border: 5px solid #000;
+  border-top-color: transparent;
+  border-bottom-color: transparent;
+  opacity: .5; }
+
+.fc-ltr .fc-timeline-event.fc-not-start .fc-content:before,
+.fc-rtl .fc-timeline-event.fc-not-end .fc-content:after {
+  border-left: 0;
+  left: -6px; }
+
+.fc-rtl .fc-timeline-event.fc-not-start .fc-content:before,
+.fc-ltr .fc-timeline-event.fc-not-end .fc-content:after {
+  border-right: 0;
+  right: -6px; }
diff --git a/backoffice/vendors/fullcalendar/timeline/main.d.ts b/backoffice/vendors/fullcalendar/timeline/main.d.ts
new file mode 100644 (file)
index 0000000..27e2525
--- /dev/null
@@ -0,0 +1,397 @@
+declare module "@fullcalendar/timeline/util/ScrollerCanvas" {
+    export { ScrollerCanvas as default, ScrollerCanvas };
+
+    class ScrollerCanvas {
+        el: HTMLElement;
+        contentEl: HTMLElement;
+        bgEl: HTMLElement;
+        gutters: any;
+        width: any;
+        minWidth: any;
+        constructor();
+        setGutters(gutters: any): void;
+        setWidth(width: any): void;
+        setMinWidth(minWidth: any): void;
+        clearWidth(): void;
+        updateSize(): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/util/EnhancedScroller" {
+    import { ScrollComponent, EmitterInterface } from "@fullcalendar/core";
+    import ScrollerCanvas from "@fullcalendar/timeline/util/ScrollerCanvas";
+    export { EnhancedScroller as default, EnhancedScroller };
+    class EnhancedScroller extends ScrollComponent {
+        on: EmitterInterface['on'];
+        one: EmitterInterface['one'];
+        off: EmitterInterface['off'];
+        trigger: EmitterInterface['trigger'];
+        triggerWith: EmitterInterface['triggerWith'];
+        hasHandlers: EmitterInterface['hasHandlers'];
+        canvas: ScrollerCanvas;
+        isScrolling: boolean;
+        isTouching: boolean;
+        isMoving: boolean;
+        isTouchScrollEnabled: boolean;
+        preventTouchScrollHandler: any;
+        requestMovingEnd: any;
+        constructor(overflowX: string, overflowY: string);
+        destroy(): void;
+        disableTouchScroll(): void;
+        enableTouchScroll(): void;
+        bindPreventTouchScroll(): void;
+        unbindPreventTouchScroll(): void;
+        bindHandlers(): void;
+        unbindHandlers(): void;
+        reportScroll: () => void;
+        reportScrollStart: () => void;
+        reportMovingEnd(): void;
+        reportScrollEnd(): void;
+        reportTouchStart: () => void;
+        reportTouchEnd: () => void;
+        getScrollLeft(): number;
+        setScrollLeft(val: any): void;
+        getScrollFromLeft(): number;
+    }
+}
+
+declare module "@fullcalendar/timeline/util/ClippedScroller" {
+    import { ScrollbarWidths } from "@fullcalendar/core";
+    import EnhancedScroller from "@fullcalendar/timeline/util/EnhancedScroller";
+    export { ClippedScroller as default, ClippedScroller };
+    class ClippedScroller {
+        el: HTMLElement;
+        enhancedScroll: EnhancedScroller;
+        isHScrollbarsClipped: boolean;
+        isVScrollbarsClipped: boolean;
+        constructor(overflowX: string, overflowY: string, parentEl: HTMLElement);
+        destroy(): void;
+        updateSize(): void;
+        setHeight(height: number | string): void;
+        getScrollbarWidths(): ScrollbarWidths;
+    }
+}
+
+declare module "@fullcalendar/timeline/util/ScrollJoiner" {
+    import ClippedScroller from "@fullcalendar/timeline/util/ClippedScroller";
+    export { ScrollJoiner as default, ScrollJoiner };
+    class ScrollJoiner {
+        axis: any;
+        scrollers: ClippedScroller[];
+        masterScroller: ClippedScroller;
+        constructor(axis: any, scrollers: ClippedScroller[]);
+        initScroller(scroller: ClippedScroller): void;
+        assignMasterScroller(scroller: any): void;
+        unassignMasterScroller(): void;
+        update(): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/HeaderBodyLayout" {
+    import ClippedScroller from "@fullcalendar/timeline/util/ClippedScroller";
+    import ScrollJoiner from "@fullcalendar/timeline/util/ScrollJoiner";
+    export { HeaderBodyLayout as default, HeaderBodyLayout };
+    class HeaderBodyLayout {
+        headerScroller: ClippedScroller;
+        bodyScroller: ClippedScroller;
+        scrollJoiner: ScrollJoiner;
+        constructor(headerContainerEl: any, bodyContainerEl: any, verticalScroll: any);
+        destroy(): void;
+        setHeight(totalHeight: any, isAuto: any): void;
+        queryHeadHeight(): number;
+    }
+}
+
+declare module "@fullcalendar/timeline/timeline-date-profile" {
+    import { Duration, View, DateProfile, DateMarker, DateEnv, DateRange } from "@fullcalendar/core";
+    export interface TimelineDateProfile {
+        labelInterval: Duration;
+        slotDuration: Duration;
+        headerFormats: any;
+        isTimeScale: boolean;
+        largeUnit: string;
+        emphasizeWeeks: boolean;
+        snapDuration: Duration;
+        snapsPerSlot: number;
+        normalizedRange: DateRange;
+        timeWindowMs: number;
+        slotDates: DateMarker[];
+        isWeekStarts: boolean[];
+        snapDiffToIndex: number[];
+        snapIndexToDiff: number[];
+        snapCnt: number;
+        slotCnt: number;
+        cellRows: TimelineHeaderCell[][];
+    }
+    export interface TimelineHeaderCell {
+        text: string;
+        spanHtml: string;
+        date: DateMarker;
+        colspan: number;
+        isWeekStart: boolean;
+    }
+    export function buildTimelineDateProfile(dateProfile: DateProfile, view: View): TimelineDateProfile;
+    export function normalizeDate(date: DateMarker, tDateProfile: TimelineDateProfile, dateEnv: DateEnv): DateMarker;
+    export function normalizeRange(range: DateRange, tDateProfile: TimelineDateProfile, dateEnv: DateEnv): DateRange;
+    export function isValidDate(date: DateMarker, tDateProfile: TimelineDateProfile, dateProfile: DateProfile, view: View): boolean;
+}
+
+declare module "@fullcalendar/timeline/TimelineHeader" {
+    import { Component, ComponentContext, DateProfile } from "@fullcalendar/core";
+    import { TimelineDateProfile } from "@fullcalendar/timeline/timeline-date-profile";
+    export interface TimelineHeaderProps {
+        dateProfile: DateProfile;
+        tDateProfile: TimelineDateProfile;
+    }
+    export { TimelineHeader as default, TimelineHeader };
+    class TimelineHeader extends Component<TimelineHeaderProps> {
+        tableEl: HTMLElement;
+        slatColEls: HTMLElement[];
+        innerEls: HTMLElement[];
+        constructor(context: ComponentContext, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: TimelineHeaderProps): void;
+        renderDates(tDateProfile: TimelineDateProfile): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/TimelineSlats" {
+    import { PositionCache, Component, ComponentContext, DateProfile } from "@fullcalendar/core";
+    import { TimelineDateProfile } from "@fullcalendar/timeline/timeline-date-profile";
+    export interface TimelineSlatsProps {
+        dateProfile: DateProfile;
+        tDateProfile: TimelineDateProfile;
+    }
+    export { TimelineSlats as default, TimelineSlats };
+    class TimelineSlats extends Component<TimelineSlatsProps> {
+        el: HTMLElement;
+        slatColEls: HTMLElement[];
+        slatEls: HTMLElement[];
+        outerCoordCache: PositionCache;
+        innerCoordCache: PositionCache;
+        constructor(context: ComponentContext, parentEl: HTMLElement);
+        destroy(): void;
+        render(props: TimelineSlatsProps): void;
+        renderDates(tDateProfile: TimelineDateProfile): void;
+        slatCellHtml(date: any, isEm: any, tDateProfile: TimelineDateProfile): string;
+        updateSize(): void;
+        positionToHit(leftPosition: any): {
+            dateSpan: {
+                range: {
+                    start: Date;
+                    end: Date;
+                };
+                allDay: boolean;
+            };
+            dayEl: HTMLElement;
+            left: any;
+            right: any;
+        };
+    }
+}
+
+declare module "@fullcalendar/timeline/TimelineNowIndicator" {
+    export { TimelineNowIndicator as default, TimelineNowIndicator };
+
+    class TimelineNowIndicator {
+        headParent: HTMLElement;
+        bodyParent: HTMLElement;
+        arrowEl: HTMLElement;
+        lineEl: HTMLElement;
+        constructor(headParent: HTMLElement, bodyParent: HTMLElement);
+        render(coord: number, isRtl: boolean): void;
+        unrender(): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/util/StickyScroller" {
+    import { Rect, Point } from "@fullcalendar/core";
+    import EnhancedScroller from "@fullcalendar/timeline/util/EnhancedScroller";
+    interface ElementGeom {
+        parentBound: Rect;
+        naturalBound: Rect | null;
+        elWidth: number;
+        elHeight: number;
+        computedTextAlign: string;
+        intendedTextAlign: string;
+    }
+    export { StickyScroller as default, StickyScroller };
+    class StickyScroller {
+        scroller: EnhancedScroller;
+        usingRelative: boolean | null;
+        constructor(scroller: EnhancedScroller, isRtl: boolean, isVertical: boolean);
+        destroy(): void;
+        updateSize: () => void;
+        queryElGeoms(els: HTMLElement[]): ElementGeom[];
+        computeElDestinations(elGeoms: ElementGeom[], viewportWidth: number): Point[];
+    }
+}
+
+declare module "@fullcalendar/timeline/TimeAxis" {
+    import { DateProfile, DateMarker, Component, ComponentContext } from "@fullcalendar/core";
+    import HeaderBodyLayout from "@fullcalendar/timeline/HeaderBodyLayout";
+    import TimelineHeader from "@fullcalendar/timeline/TimelineHeader";
+    import TimelineSlats from "@fullcalendar/timeline/TimelineSlats";
+    import { TimelineDateProfile } from "@fullcalendar/timeline/timeline-date-profile";
+    import TimelineNowIndicator from "@fullcalendar/timeline/TimelineNowIndicator";
+    import StickyScroller from "@fullcalendar/timeline/util/StickyScroller";
+    export interface TimeAxisProps {
+        dateProfile: DateProfile;
+    }
+    export { TimeAxis as default, TimeAxis };
+    class TimeAxis extends Component<TimeAxisProps> {
+        layout: HeaderBodyLayout;
+        header: TimelineHeader;
+        slats: TimelineSlats;
+        nowIndicator: TimelineNowIndicator;
+        headStickyScroller: StickyScroller;
+        bodyStickyScroller: StickyScroller;
+        tDateProfile: TimelineDateProfile;
+        constructor(context: ComponentContext, headerContainerEl: any, bodyContainerEl: any);
+        destroy(): void;
+        render(props: TimeAxisProps): void;
+        getNowIndicatorUnit(dateProfile: DateProfile): string;
+        renderNowIndicator(date: any): void;
+        unrenderNowIndicator(): void;
+        updateSize(isResize: any, totalHeight: any, isAuto: any): void;
+        updateStickyScrollers(): void;
+        computeSlotWidth(): any;
+        computeDefaultSlotWidth(tDateProfile: any): number;
+        applySlotWidth(slotWidth: number | string): void;
+        computeDateSnapCoverage(date: DateMarker): number;
+        dateToCoord(date: any): any;
+        rangeToCoords(range: any): {
+            right: any;
+            left: any;
+        };
+        computeDateScroll(timeMs: any): {
+            left: number;
+        };
+        queryDateScroll(): {
+            left: number;
+        };
+        applyDateScroll(scroll: any): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/TimelineLaneEventRenderer" {
+    import { FgEventRenderer, Seg, ComponentContext } from "@fullcalendar/core";
+    import TimeAxis from "@fullcalendar/timeline/TimeAxis";
+    export { TimelineLaneEventRenderer as default, TimelineLaneEventRenderer };
+    class TimelineLaneEventRenderer extends FgEventRenderer {
+        timeAxis: TimeAxis;
+        masterContainerEl: HTMLElement;
+        el: HTMLElement;
+        constructor(context: ComponentContext, masterContainerEl: HTMLElement, timeAxis: TimeAxis);
+        renderSegHtml(seg: any, mirrorInfo: any): string;
+        computeDisplayEventTime(): boolean;
+        computeDisplayEventEnd(): boolean;
+        computeEventTimeFormat(): {
+            hour: string;
+            minute: string;
+            omitZeroMinute: boolean;
+            meridiem: string;
+        };
+        attachSegs(segs: Seg[], mirrorInfo: any): void;
+        detachSegs(segs: Seg[]): void;
+        computeSegSizes(segs: Seg[]): void;
+        assignSegSizes(segs: Seg[]): void;
+        buildSegLevels(segs: any): any[];
+    }
+}
+
+declare module "@fullcalendar/timeline/TimelineLaneFillRenderer" {
+    import { FillRenderer, ComponentContext, Seg } from "@fullcalendar/core";
+    import TimeAxis from "@fullcalendar/timeline/TimeAxis";
+    export { TimelineLaneFillRenderer as default, TimelineLaneFillRenderer };
+    class TimelineLaneFillRenderer extends FillRenderer {
+        timeAxis: TimeAxis;
+        masterContainerEl: HTMLElement;
+        constructor(context: ComponentContext, masterContainerEl: HTMLElement, timeAxis: TimeAxis);
+        attachSegs(type: any, segs: any): HTMLElement[];
+        computeSegSizes(segs: Seg[]): void;
+        assignSegSizes(segs: Seg[]): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/TimelineLane" {
+    import { Duration, EventStore, EventUiHash, DateMarker, DateSpan, EventInteractionState, EventSegUiInteractionState, DateComponent, ComponentContext, Seg, DateProfile } from "@fullcalendar/core";
+    import TimeAxis from "@fullcalendar/timeline/TimeAxis";
+    export interface TimelineLaneSeg extends Seg {
+        start: DateMarker;
+        end: DateMarker;
+    }
+    export interface TimelineLaneProps {
+        dateProfile: DateProfile;
+        nextDayThreshold: Duration;
+        businessHours: EventStore | null;
+        eventStore: EventStore | null;
+        eventUiBases: EventUiHash;
+        dateSelection: DateSpan | null;
+        eventSelection: string;
+        eventDrag: EventInteractionState | null;
+        eventResize: EventInteractionState | null;
+    }
+    export { TimelineLane as default, TimelineLane };
+    class TimelineLane extends DateComponent<TimelineLaneProps> {
+        timeAxis: TimeAxis;
+        private slicer;
+        private renderBusinessHours;
+        private renderDateSelection;
+        private renderBgEvents;
+        private renderFgEvents;
+        private renderEventSelection;
+        private renderEventDrag;
+        private renderEventResize;
+        constructor(context: ComponentContext, fgContainerEl: HTMLElement, bgContainerEl: HTMLElement, timeAxis: TimeAxis);
+        render(props: TimelineLaneProps): void;
+        destroy(): void;
+        _renderEventDrag(state: EventSegUiInteractionState): void;
+        _unrenderEventDrag(state: EventSegUiInteractionState): void;
+        _renderEventResize(state: EventSegUiInteractionState): void;
+        _unrenderEventResize(state: EventSegUiInteractionState): void;
+        updateSize(isResize: boolean): void;
+    }
+}
+
+declare module "@fullcalendar/timeline/TimelineView" {
+    import { Hit, View, ViewProps, ComponentContext, ViewSpec, DateProfileGenerator, DateProfile } from "@fullcalendar/core";
+    import TimeAxis from "@fullcalendar/timeline/TimeAxis";
+    import TimelineLane from "@fullcalendar/timeline/TimelineLane";
+    export { TimelineView as default, TimelineView };
+    class TimelineView extends View {
+        timeAxis: TimeAxis;
+        lane: TimelineLane;
+        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
+        destroy(): void;
+        renderSkeletonHtml(): string;
+        render(props: ViewProps): void;
+        updateSize(isResize: any, totalHeight: any, isAuto: any): void;
+        getNowIndicatorUnit(dateProfile: DateProfile): string;
+        renderNowIndicator(date: any): void;
+        unrenderNowIndicator(): void;
+        computeDateScroll(timeMs: number): {
+            left: number;
+        };
+        applyScroll(scroll: any, isResize: any): void;
+        applyDateScroll(scroll: any): void;
+        queryScroll(): {
+            top: number;
+            left: number;
+        };
+        buildPositionCaches(): void;
+        queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit;
+    }
+}
+
+declare module "@fullcalendar/timeline" {
+    import TimelineView from "@fullcalendar/timeline/TimelineView";
+    export { TimelineView };
+    export { default as TimelineLane } from "@fullcalendar/timeline/TimelineLane";
+    export { default as ScrollJoiner } from "@fullcalendar/timeline/util/ScrollJoiner";
+    export { default as StickyScroller } from "@fullcalendar/timeline/util/StickyScroller";
+    export { default as TimeAxis } from "@fullcalendar/timeline/TimeAxis";
+    export { default as HeaderBodyLayout } from "@fullcalendar/timeline/HeaderBodyLayout";
+    const _default_4: import("@fullcalendar/core").PluginDef;
+    export default _default_4;
+}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/timeline/main.js b/backoffice/vendors/fullcalendar/timeline/main.js
new file mode 100644 (file)
index 0000000..c8b8f62
--- /dev/null
@@ -0,0 +1,2010 @@
+/*!
+FullCalendar Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+(function (global, factory) {
+    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
+    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
+    (global = global || self, factory(global.FullCalendarTimeline = {}, global.FullCalendar));
+}(this, function (exports, core) { 'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    /*
+    A rectangular area of content that lives within a Scroller.
+    Can have "gutters", areas of dead spacing around the perimeter.
+    Also very useful for forcing a width, which a Scroller cannot do alone.
+    Has a content area that lives above a background area.
+    */
+    var ScrollerCanvas = /** @class */ (function () {
+        function ScrollerCanvas() {
+            this.gutters = {};
+            this.el = core.htmlToElement("<div class=\"fc-scroller-canvas\"> <div class=\"fc-content\"></div> <div class=\"fc-bg\"></div> </div>");
+            this.contentEl = this.el.querySelector('.fc-content');
+            this.bgEl = this.el.querySelector('.fc-bg');
+        }
+        /*
+        If falsy, resets all the gutters to 0
+        */
+        ScrollerCanvas.prototype.setGutters = function (gutters) {
+            if (!gutters) {
+                this.gutters = {};
+            }
+            else {
+                __assign(this.gutters, gutters);
+            }
+            this.updateSize();
+        };
+        ScrollerCanvas.prototype.setWidth = function (width) {
+            this.width = width;
+            this.updateSize();
+        };
+        ScrollerCanvas.prototype.setMinWidth = function (minWidth) {
+            this.minWidth = minWidth;
+            this.updateSize();
+        };
+        ScrollerCanvas.prototype.clearWidth = function () {
+            this.width = null;
+            this.minWidth = null;
+            this.updateSize();
+        };
+        ScrollerCanvas.prototype.updateSize = function () {
+            var _a = this, gutters = _a.gutters, el = _a.el;
+            // is border-box (width includes padding)
+            core.forceClassName(el, 'fc-gutter-left', gutters.left);
+            core.forceClassName(el, 'fc-gutter-right', gutters.right);
+            core.forceClassName(el, 'fc-gutter-top', gutters.top);
+            core.forceClassName(el, 'fc-gutter-bottom', gutters.bottom);
+            core.applyStyle(el, {
+                paddingLeft: gutters.left || '',
+                paddingRight: gutters.right || '',
+                paddingTop: gutters.top || '',
+                paddingBottom: gutters.bottom || '',
+                width: (this.width != null) ?
+                    this.width + (gutters.left || 0) + (gutters.right || 0) :
+                    '',
+                minWidth: (this.minWidth != null) ?
+                    this.minWidth + (gutters.left || 0) + (gutters.right || 0) :
+                    ''
+            });
+            core.applyStyle(this.bgEl, {
+                left: gutters.left || '',
+                right: gutters.right || '',
+                top: gutters.top || '',
+                bottom: gutters.bottom || ''
+            });
+        };
+        return ScrollerCanvas;
+    }());
+
+    var EnhancedScroller = /** @class */ (function (_super) {
+        __extends(EnhancedScroller, _super);
+        function EnhancedScroller(overflowX, overflowY) {
+            var _this = _super.call(this, overflowX, overflowY) || this;
+            // Scroll Events
+            // ----------------------------------------------------------------------------------------------
+            _this.reportScroll = function () {
+                if (!_this.isScrolling) {
+                    _this.reportScrollStart();
+                }
+                _this.trigger('scroll');
+                _this.isMoving = true;
+                _this.requestMovingEnd();
+            };
+            _this.reportScrollStart = function () {
+                if (!_this.isScrolling) {
+                    _this.isScrolling = true;
+                    _this.trigger('scrollStart', _this.isTouching); // created in constructor
+                }
+            };
+            // Touch Events
+            // ----------------------------------------------------------------------------------------------
+            // will fire *before* the scroll event is fired
+            _this.reportTouchStart = function () {
+                _this.isTouching = true;
+            };
+            _this.reportTouchEnd = function () {
+                if (_this.isTouching) {
+                    _this.isTouching = false;
+                    // if touch scrolling was re-enabled during a recent touch scroll
+                    // then unbind the handlers that are preventing it from happening.
+                    if (_this.isTouchScrollEnabled) {
+                        _this.unbindPreventTouchScroll(); // won't do anything if not bound
+                    }
+                    // if the user ended their touch, and the scroll area wasn't moving,
+                    // we consider this to be the end of the scroll.
+                    if (!_this.isMoving) {
+                        _this.reportScrollEnd(); // won't fire if already ended
+                    }
+                }
+            };
+            _this.isScrolling = false;
+            _this.isTouching = false;
+            _this.isMoving = false;
+            _this.isTouchScrollEnabled = true;
+            _this.requestMovingEnd = core.debounce(_this.reportMovingEnd, 500);
+            _this.canvas = new ScrollerCanvas();
+            _this.el.appendChild(_this.canvas.el);
+            _this.applyOverflow();
+            _this.bindHandlers();
+            return _this;
+        }
+        EnhancedScroller.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.unbindHandlers();
+        };
+        // Touch scroll prevention
+        // ----------------------------------------------------------------------------------------------
+        EnhancedScroller.prototype.disableTouchScroll = function () {
+            this.isTouchScrollEnabled = false;
+            this.bindPreventTouchScroll(); // will be unbound in enableTouchScroll or reportTouchEnd
+        };
+        EnhancedScroller.prototype.enableTouchScroll = function () {
+            this.isTouchScrollEnabled = true;
+            // only immediately unbind if a touch event is NOT in progress.
+            // otherwise, it will be handled by reportTouchEnd.
+            if (!this.isTouching) {
+                this.unbindPreventTouchScroll();
+            }
+        };
+        EnhancedScroller.prototype.bindPreventTouchScroll = function () {
+            if (!this.preventTouchScrollHandler) {
+                this.el.addEventListener('touchmove', (this.preventTouchScrollHandler = core.preventDefault));
+            }
+        };
+        EnhancedScroller.prototype.unbindPreventTouchScroll = function () {
+            if (this.preventTouchScrollHandler) {
+                this.el.removeEventListener('touchmove', this.preventTouchScrollHandler);
+                this.preventTouchScrollHandler = null;
+            }
+        };
+        // Handlers
+        // ----------------------------------------------------------------------------------------------
+        EnhancedScroller.prototype.bindHandlers = function () {
+            this.el.addEventListener('scroll', this.reportScroll);
+            this.el.addEventListener('touchstart', this.reportTouchStart, { passive: true });
+            this.el.addEventListener('touchend', this.reportTouchEnd);
+        };
+        EnhancedScroller.prototype.unbindHandlers = function () {
+            this.el.removeEventListener('scroll', this.reportScroll);
+            this.el.removeEventListener('touchstart', this.reportTouchStart, { passive: true });
+            this.el.removeEventListener('touchend', this.reportTouchEnd);
+        };
+        EnhancedScroller.prototype.reportMovingEnd = function () {
+            this.isMoving = false;
+            // only end the scroll if not currently touching.
+            // if touching, the scrolling will end later, on touchend.
+            if (!this.isTouching) {
+                this.reportScrollEnd();
+            }
+        };
+        EnhancedScroller.prototype.reportScrollEnd = function () {
+            if (this.isScrolling) {
+                this.trigger('scrollEnd');
+                this.isScrolling = false;
+            }
+        };
+        // Horizontal Scroll Normalization
+        // ----------------------------------------------------------------------------------------------
+        // http://stackoverflow.com/questions/24276619/better-way-to-get-the-viewport-of-a-scrollable-div-in-rtl-mode/24394376#24394376
+        // TODO: move all this to util functions
+        /*
+        If RTL, and scrolled to the left, returns NEGATIVE value (like Firefox)
+        */
+        EnhancedScroller.prototype.getScrollLeft = function () {
+            var el = this.el;
+            var direction = window.getComputedStyle(el).direction;
+            var val = el.scrollLeft;
+            if (direction === 'rtl') {
+                switch (getRtlScrollSystem()) {
+                    case 'positive':
+                        val = (val + el.clientWidth) - el.scrollWidth;
+                        break;
+                    case 'reverse':
+                        val = -val;
+                        break;
+                }
+            }
+            return val;
+        };
+        /*
+        Accepts a NEGATIVE value for when scrolled in RTL
+        */
+        EnhancedScroller.prototype.setScrollLeft = function (val) {
+            var el = this.el;
+            var direction = window.getComputedStyle(el).direction;
+            if (direction === 'rtl') {
+                switch (getRtlScrollSystem()) {
+                    case 'positive':
+                        val = (val - el.clientWidth) + el.scrollWidth;
+                        break;
+                    case 'reverse':
+                        val = -val;
+                        break;
+                }
+            }
+            el.scrollLeft = val;
+        };
+        /*
+        Always returns the number of pixels scrolled from the leftmost position (even if RTL).
+        Always positive.
+        */
+        EnhancedScroller.prototype.getScrollFromLeft = function () {
+            var el = this.el;
+            var direction = window.getComputedStyle(el).direction;
+            var val = el.scrollLeft;
+            if (direction === 'rtl') {
+                switch (getRtlScrollSystem()) {
+                    case 'negative':
+                        val = (val - el.clientWidth) + el.scrollWidth;
+                        break;
+                    case 'reverse':
+                        val = (-val - el.clientWidth) + el.scrollWidth;
+                        break;
+                }
+            }
+            return val;
+        };
+        return EnhancedScroller;
+    }(core.ScrollComponent));
+    core.EmitterMixin.mixInto(EnhancedScroller);
+    // Horizontal Scroll System Detection
+    // ----------------------------------------------------------------------------------------------
+    var _rtlScrollSystem;
+    function getRtlScrollSystem() {
+        return _rtlScrollSystem || (_rtlScrollSystem = detectRtlScrollSystem());
+    }
+    function detectRtlScrollSystem() {
+        var el = core.htmlToElement("<div style=\" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; \">A</div>");
+        document.body.appendChild(el);
+        var system;
+        if (el.scrollLeft > 0) {
+            system = 'positive';
+        }
+        else {
+            el.scrollLeft = 1;
+            if (el.scrollLeft > 0) {
+                system = 'reverse';
+            }
+            else {
+                system = 'negative';
+            }
+        }
+        core.removeElement(el);
+        return system;
+    }
+
+    /*
+    A Scroller, but with a wrapping div that allows "clipping" away of native scrollbars,
+    giving the appearance that there are no scrollbars.
+    */
+    var ClippedScroller = /** @class */ (function () {
+        /*
+        Received overflows can be set to 'clipped', meaning scrollbars shouldn't be visible
+        to the user, but the area should still scroll.
+        */
+        function ClippedScroller(overflowX, overflowY, parentEl) {
+            this.isHScrollbarsClipped = false;
+            this.isVScrollbarsClipped = false;
+            if (overflowX === 'clipped-scroll') {
+                overflowX = 'scroll';
+                this.isHScrollbarsClipped = true;
+            }
+            if (overflowY === 'clipped-scroll') {
+                overflowY = 'scroll';
+                this.isVScrollbarsClipped = true;
+            }
+            this.enhancedScroll = new EnhancedScroller(overflowX, overflowY);
+            parentEl.appendChild(this.el = core.createElement('div', {
+                className: 'fc-scroller-clip'
+            }));
+            this.el.appendChild(this.enhancedScroll.el);
+        }
+        ClippedScroller.prototype.destroy = function () {
+            core.removeElement(this.el);
+        };
+        ClippedScroller.prototype.updateSize = function () {
+            var enhancedScroll = this.enhancedScroll;
+            var scrollEl = enhancedScroll.el;
+            var edges = core.computeEdges(scrollEl);
+            var cssProps = { marginLeft: 0, marginRight: 0, marginTop: 0, marginBottom: 0 };
+            // give the inner scrolling div negative margins so that its scrollbars
+            // are nudged outside of the bounding box of the wrapper, which is overflow:hidden
+            if (this.isVScrollbarsClipped) {
+                cssProps.marginLeft = -edges.scrollbarLeft;
+                cssProps.marginRight = -edges.scrollbarRight;
+            }
+            if (this.isHScrollbarsClipped) {
+                cssProps.marginBottom = -edges.scrollbarBottom;
+            }
+            core.applyStyle(scrollEl, cssProps);
+            // if we are attempting to hide the scrollbars offscreen, OSX/iOS will still
+            // display the floating scrollbars. attach a className to force-hide them.
+            if ((this.isHScrollbarsClipped || (enhancedScroll.overflowX === 'hidden')) && // should never show?
+                (this.isVScrollbarsClipped || (enhancedScroll.overflowY === 'hidden')) && // should never show?
+                !( // doesn't have any scrollbar mass
+                edges.scrollbarLeft ||
+                    edges.scrollbarRight ||
+                    edges.scrollbarBottom)) {
+                scrollEl.classList.add('fc-no-scrollbars');
+            }
+            else {
+                scrollEl.classList.remove('fc-no-scrollbars');
+            }
+        };
+        ClippedScroller.prototype.setHeight = function (height) {
+            this.enhancedScroll.setHeight(height);
+        };
+        /*
+        Accounts for 'clipped' scrollbars
+        */
+        ClippedScroller.prototype.getScrollbarWidths = function () {
+            var widths = this.enhancedScroll.getScrollbarWidths();
+            if (this.isVScrollbarsClipped) {
+                widths.left = 0;
+                widths.right = 0;
+            }
+            if (this.isHScrollbarsClipped) {
+                widths.bottom = 0;
+            }
+            return widths;
+        };
+        return ClippedScroller;
+    }());
+
+    var ScrollJoiner = /** @class */ (function () {
+        function ScrollJoiner(axis, scrollers) {
+            this.axis = axis;
+            this.scrollers = scrollers;
+            for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
+                var scroller = _a[_i];
+                this.initScroller(scroller);
+            }
+        }
+        ScrollJoiner.prototype.initScroller = function (scroller) {
+            var _this = this;
+            var enhancedScroll = scroller.enhancedScroll;
+            // when the user scrolls via mousewheel, we know for sure the target
+            // scroller should be the master. capture the various x-browser events that fire.
+            var onScroll = function () {
+                _this.assignMasterScroller(scroller);
+            };
+            'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' ').forEach(function (evName) {
+                enhancedScroll.el.addEventListener(evName, onScroll);
+            });
+            enhancedScroll
+                .on('scrollStart', function () {
+                if (!_this.masterScroller) {
+                    _this.assignMasterScroller(scroller);
+                }
+            })
+                .on('scroll', function () {
+                if (scroller === _this.masterScroller) {
+                    for (var _i = 0, _a = _this.scrollers; _i < _a.length; _i++) {
+                        var otherScroller = _a[_i];
+                        if (otherScroller !== scroller) {
+                            switch (_this.axis) {
+                                case 'horizontal':
+                                    otherScroller.enhancedScroll.el.scrollLeft = enhancedScroll.el.scrollLeft;
+                                    break;
+                                case 'vertical':
+                                    otherScroller.enhancedScroll.setScrollTop(enhancedScroll.getScrollTop());
+                                    break;
+                            }
+                        }
+                    }
+                }
+            })
+                .on('scrollEnd', function () {
+                if (scroller === _this.masterScroller) {
+                    _this.unassignMasterScroller();
+                }
+            });
+        };
+        ScrollJoiner.prototype.assignMasterScroller = function (scroller) {
+            this.unassignMasterScroller();
+            this.masterScroller = scroller;
+            for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
+                var otherScroller = _a[_i];
+                if (otherScroller !== scroller) {
+                    otherScroller.enhancedScroll.disableTouchScroll();
+                }
+            }
+        };
+        ScrollJoiner.prototype.unassignMasterScroller = function () {
+            if (this.masterScroller) {
+                for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
+                    var otherScroller = _a[_i];
+                    otherScroller.enhancedScroll.enableTouchScroll();
+                }
+                this.masterScroller = null;
+            }
+        };
+        ScrollJoiner.prototype.update = function () {
+            var allWidths = this.scrollers.map(function (scroller) { return scroller.getScrollbarWidths(); });
+            var maxLeft = 0;
+            var maxRight = 0;
+            var maxTop = 0;
+            var maxBottom = 0;
+            var widths;
+            var i;
+            for (var _i = 0, allWidths_1 = allWidths; _i < allWidths_1.length; _i++) {
+                widths = allWidths_1[_i];
+                maxLeft = Math.max(maxLeft, widths.left);
+                maxRight = Math.max(maxRight, widths.right);
+                maxTop = Math.max(maxTop, widths.top);
+                maxBottom = Math.max(maxBottom, widths.bottom);
+            }
+            for (i = 0; i < this.scrollers.length; i++) {
+                var scroller = this.scrollers[i];
+                widths = allWidths[i];
+                scroller.enhancedScroll.canvas.setGutters(this.axis === 'horizontal' ?
+                    {
+                        left: maxLeft - widths.left,
+                        right: maxRight - widths.right
+                    } :
+                    {
+                        top: maxTop - widths.top,
+                        bottom: maxBottom - widths.bottom
+                    });
+            }
+        };
+        return ScrollJoiner;
+    }());
+
+    var HeaderBodyLayout = /** @class */ (function () {
+        /*
+        verticalScroll = 'auto' | 'clipped-scroll'
+        */
+        function HeaderBodyLayout(headerContainerEl, bodyContainerEl, verticalScroll) {
+            this.headerScroller = new ClippedScroller('clipped-scroll', 'hidden', headerContainerEl);
+            this.bodyScroller = new ClippedScroller('auto', verticalScroll, bodyContainerEl);
+            this.scrollJoiner = new ScrollJoiner('horizontal', [
+                this.headerScroller,
+                this.bodyScroller
+            ]);
+        }
+        HeaderBodyLayout.prototype.destroy = function () {
+            this.headerScroller.destroy();
+            this.bodyScroller.destroy();
+        };
+        HeaderBodyLayout.prototype.setHeight = function (totalHeight, isAuto) {
+            var bodyHeight;
+            if (isAuto) {
+                bodyHeight = 'auto';
+            }
+            else {
+                bodyHeight = totalHeight - this.queryHeadHeight();
+            }
+            this.bodyScroller.setHeight(bodyHeight);
+            this.headerScroller.updateSize(); // adjusts gutters and classNames
+            this.bodyScroller.updateSize(); // adjusts gutters and classNames
+            this.scrollJoiner.update();
+        };
+        HeaderBodyLayout.prototype.queryHeadHeight = function () {
+            return this.headerScroller.enhancedScroll.canvas.contentEl.offsetHeight; // flawed?
+        };
+        return HeaderBodyLayout;
+    }());
+
+    var TimelineHeader = /** @class */ (function (_super) {
+        __extends(TimelineHeader, _super);
+        function TimelineHeader(context, parentEl) {
+            var _this = _super.call(this, context) || this;
+            parentEl.appendChild(_this.tableEl = core.createElement('table', {
+                className: _this.theme.getClass('tableGrid')
+            }));
+            return _this;
+        }
+        TimelineHeader.prototype.destroy = function () {
+            core.removeElement(this.tableEl);
+            _super.prototype.destroy.call(this);
+        };
+        TimelineHeader.prototype.render = function (props) {
+            this.renderDates(props.tDateProfile);
+        };
+        TimelineHeader.prototype.renderDates = function (tDateProfile) {
+            var _a = this, dateEnv = _a.dateEnv, theme = _a.theme;
+            var cellRows = tDateProfile.cellRows;
+            var lastRow = cellRows[cellRows.length - 1];
+            var isChrono = core.asRoughMs(tDateProfile.labelInterval) > core.asRoughMs(tDateProfile.slotDuration);
+            var oneDay = core.isSingleDay(tDateProfile.slotDuration);
+            var html = '<colgroup>';
+            // needs to be a col for each body slat. header cells will have colspans
+            for (var i = tDateProfile.slotCnt - 1; i >= 0; i--) {
+                html += '<col/>';
+            }
+            html += '</colgroup>';
+            html += '<tbody>';
+            for (var _i = 0, cellRows_1 = cellRows; _i < cellRows_1.length; _i++) {
+                var rowCells = cellRows_1[_i];
+                var isLast = rowCells === lastRow;
+                html += '<tr' + (isChrono && isLast ? ' class="fc-chrono"' : '') + '>';
+                for (var _b = 0, rowCells_1 = rowCells; _b < rowCells_1.length; _b++) {
+                    var cell = rowCells_1[_b];
+                    var headerCellClassNames = [theme.getClass('widgetHeader')];
+                    if (cell.isWeekStart) {
+                        headerCellClassNames.push('fc-em-cell');
+                    }
+                    if (oneDay) {
+                        headerCellClassNames = headerCellClassNames.concat(core.getDayClasses(cell.date, this.props.dateProfile, this.context, true) // adds "today" class and other day-based classes
+                        );
+                    }
+                    html +=
+                        '<th class="' + headerCellClassNames.join(' ') + '"' +
+                            ' data-date="' + dateEnv.formatIso(cell.date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }) + '"' +
+                            (cell.colspan > 1 ? ' colspan="' + cell.colspan + '"' : '') +
+                            '>' +
+                            '<div class="fc-cell-content">' +
+                            cell.spanHtml +
+                            '</div>' +
+                            '</th>';
+                }
+                html += '</tr>';
+            }
+            html += '</tbody>';
+            this.tableEl.innerHTML = html; // TODO: does this work cross-browser?
+            this.slatColEls = core.findElements(this.tableEl, 'col');
+            this.innerEls = core.findElements(this.tableEl.querySelector('tr:last-child'), // compound selector won't work because of query-root problem
+            'th .fc-cell-text');
+            core.findElements(this.tableEl.querySelectorAll('tr:not(:last-child)'), // compound selector won't work because of query-root problem
+            'th .fc-cell-text').forEach(function (innerEl) {
+                innerEl.classList.add('fc-sticky');
+            });
+        };
+        return TimelineHeader;
+    }(core.Component));
+
+    var TimelineSlats = /** @class */ (function (_super) {
+        __extends(TimelineSlats, _super);
+        function TimelineSlats(context, parentEl) {
+            var _this = _super.call(this, context) || this;
+            parentEl.appendChild(_this.el = core.createElement('div', { className: 'fc-slats' }));
+            return _this;
+        }
+        TimelineSlats.prototype.destroy = function () {
+            core.removeElement(this.el);
+            _super.prototype.destroy.call(this);
+        };
+        TimelineSlats.prototype.render = function (props) {
+            this.renderDates(props.tDateProfile);
+        };
+        TimelineSlats.prototype.renderDates = function (tDateProfile) {
+            var _a = this, theme = _a.theme, view = _a.view, dateEnv = _a.dateEnv;
+            var slotDates = tDateProfile.slotDates, isWeekStarts = tDateProfile.isWeekStarts;
+            var html = '<table class="' + theme.getClass('tableGrid') + '">' +
+                '<colgroup>';
+            for (var i = 0; i < slotDates.length; i++) {
+                html += '<col/>';
+            }
+            html += '</colgroup>';
+            html += '<tbody><tr>';
+            for (var i = 0; i < slotDates.length; i++) {
+                html += this.slatCellHtml(slotDates[i], isWeekStarts[i], tDateProfile);
+            }
+            html += '</tr></tbody></table>';
+            this.el.innerHTML = html;
+            this.slatColEls = core.findElements(this.el, 'col');
+            this.slatEls = core.findElements(this.el, 'td');
+            for (var i = 0; i < slotDates.length; i++) {
+                view.publiclyTrigger('dayRender', [
+                    {
+                        date: dateEnv.toDate(slotDates[i]),
+                        el: this.slatEls[i],
+                        view: view
+                    }
+                ]);
+            }
+            this.outerCoordCache = new core.PositionCache(this.el, this.slatEls, true, // isHorizontal
+            false // isVertical
+            );
+            // for the inner divs within the slats
+            // used for event rendering and scrollTime, to disregard slat border
+            this.innerCoordCache = new core.PositionCache(this.el, core.findChildren(this.slatEls, 'div'), true, // isHorizontal
+            false // isVertical
+            );
+        };
+        TimelineSlats.prototype.slatCellHtml = function (date, isEm, tDateProfile) {
+            var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
+            var classes;
+            if (tDateProfile.isTimeScale) {
+                classes = [];
+                classes.push(core.isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval)) ?
+                    'fc-major' :
+                    'fc-minor');
+            }
+            else {
+                classes = core.getDayClasses(date, this.props.dateProfile, this.context);
+                classes.push('fc-day');
+            }
+            classes.unshift(theme.getClass('widgetContent'));
+            if (isEm) {
+                classes.push('fc-em-cell');
+            }
+            return '<td class="' + classes.join(' ') + '"' +
+                ' data-date="' + dateEnv.formatIso(date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }) + '"' +
+                '><div></div></td>';
+        };
+        TimelineSlats.prototype.updateSize = function () {
+            this.outerCoordCache.build();
+            this.innerCoordCache.build();
+        };
+        TimelineSlats.prototype.positionToHit = function (leftPosition) {
+            var outerCoordCache = this.outerCoordCache;
+            var tDateProfile = this.props.tDateProfile;
+            var slatIndex = outerCoordCache.leftToIndex(leftPosition);
+            if (slatIndex != null) {
+                // somewhat similar to what TimeGrid does. consolidate?
+                var slatWidth = outerCoordCache.getWidth(slatIndex);
+                var partial = this.isRtl ?
+                    (outerCoordCache.rights[slatIndex] - leftPosition) / slatWidth :
+                    (leftPosition - outerCoordCache.lefts[slatIndex]) / slatWidth;
+                var localSnapIndex = Math.floor(partial * tDateProfile.snapsPerSlot);
+                var start = this.dateEnv.add(tDateProfile.slotDates[slatIndex], core.multiplyDuration(tDateProfile.snapDuration, localSnapIndex));
+                var end = this.dateEnv.add(start, tDateProfile.snapDuration);
+                return {
+                    dateSpan: {
+                        range: { start: start, end: end },
+                        allDay: !this.props.tDateProfile.isTimeScale
+                    },
+                    dayEl: this.slatColEls[slatIndex],
+                    left: outerCoordCache.lefts[slatIndex],
+                    right: outerCoordCache.rights[slatIndex]
+                };
+            }
+            return null;
+        };
+        return TimelineSlats;
+    }(core.Component));
+
+    var MIN_AUTO_LABELS = 18; // more than `12` months but less that `24` hours
+    var MAX_AUTO_SLOTS_PER_LABEL = 6; // allows 6 10-min slots in an hour
+    var MAX_AUTO_CELLS = 200; // allows 4-days to have a :30 slot duration
+    core.config.MAX_TIMELINE_SLOTS = 1000;
+    // potential nice values for slot-duration and interval-duration
+    var STOCK_SUB_DURATIONS = [
+        { years: 1 },
+        { months: 1 },
+        { days: 1 },
+        { hours: 1 },
+        { minutes: 30 },
+        { minutes: 15 },
+        { minutes: 10 },
+        { minutes: 5 },
+        { minutes: 1 },
+        { seconds: 30 },
+        { seconds: 15 },
+        { seconds: 10 },
+        { seconds: 5 },
+        { seconds: 1 },
+        { milliseconds: 500 },
+        { milliseconds: 100 },
+        { milliseconds: 10 },
+        { milliseconds: 1 }
+    ];
+    function buildTimelineDateProfile(dateProfile, view) {
+        var dateEnv = view.dateEnv;
+        var tDateProfile = {
+            labelInterval: queryDurationOption(view, 'slotLabelInterval'),
+            slotDuration: queryDurationOption(view, 'slotDuration')
+        };
+        validateLabelAndSlot(tDateProfile, dateProfile, dateEnv); // validate after computed grid duration
+        ensureLabelInterval(tDateProfile, dateProfile, dateEnv);
+        ensureSlotDuration(tDateProfile, dateProfile, dateEnv);
+        var input = view.opt('slotLabelFormat');
+        var rawFormats = Array.isArray(input) ?
+            input
+            : (input != null) ?
+                [input]
+                :
+                    computeHeaderFormats(tDateProfile, dateProfile, dateEnv, view);
+        tDateProfile.headerFormats = rawFormats.map(function (rawFormat) {
+            return core.createFormatter(rawFormat);
+        });
+        tDateProfile.isTimeScale = Boolean(tDateProfile.slotDuration.milliseconds);
+        var largeUnit = null;
+        if (!tDateProfile.isTimeScale) {
+            var slotUnit = core.greatestDurationDenominator(tDateProfile.slotDuration).unit;
+            if (/year|month|week/.test(slotUnit)) {
+                largeUnit = slotUnit;
+            }
+        }
+        tDateProfile.largeUnit = largeUnit;
+        tDateProfile.emphasizeWeeks =
+            core.isSingleDay(tDateProfile.slotDuration) &&
+                currentRangeAs('weeks', dateProfile, dateEnv) >= 2 &&
+                !view.opt('businessHours');
+        /*
+        console.log('label interval =', timelineView.labelInterval.humanize())
+        console.log('slot duration =', timelineView.slotDuration.humanize())
+        console.log('header formats =', timelineView.headerFormats)
+        console.log('isTimeScale', timelineView.isTimeScale)
+        console.log('largeUnit', timelineView.largeUnit)
+        */
+        var rawSnapDuration = view.opt('snapDuration');
+        var snapDuration;
+        var snapsPerSlot;
+        if (rawSnapDuration) {
+            snapDuration = core.createDuration(rawSnapDuration);
+            snapsPerSlot = core.wholeDivideDurations(tDateProfile.slotDuration, snapDuration);
+            // ^ TODO: warning if not whole?
+        }
+        if (snapsPerSlot == null) {
+            snapDuration = tDateProfile.slotDuration;
+            snapsPerSlot = 1;
+        }
+        tDateProfile.snapDuration = snapDuration;
+        tDateProfile.snapsPerSlot = snapsPerSlot;
+        // more...
+        var timeWindowMs = core.asRoughMs(dateProfile.maxTime) - core.asRoughMs(dateProfile.minTime);
+        // TODO: why not use normalizeRange!?
+        var normalizedStart = normalizeDate(dateProfile.renderRange.start, tDateProfile, dateEnv);
+        var normalizedEnd = normalizeDate(dateProfile.renderRange.end, tDateProfile, dateEnv);
+        // apply minTime/maxTime
+        // TODO: View should be responsible.
+        if (tDateProfile.isTimeScale) {
+            normalizedStart = dateEnv.add(normalizedStart, dateProfile.minTime);
+            normalizedEnd = dateEnv.add(core.addDays(normalizedEnd, -1), dateProfile.maxTime);
+        }
+        tDateProfile.timeWindowMs = timeWindowMs;
+        tDateProfile.normalizedRange = { start: normalizedStart, end: normalizedEnd };
+        var slotDates = [];
+        var date = normalizedStart;
+        while (date < normalizedEnd) {
+            if (isValidDate(date, tDateProfile, dateProfile, view)) {
+                slotDates.push(date);
+            }
+            date = dateEnv.add(date, tDateProfile.slotDuration);
+        }
+        tDateProfile.slotDates = slotDates;
+        // more...
+        var snapIndex = -1;
+        var snapDiff = 0; // index of the diff :(
+        var snapDiffToIndex = [];
+        var snapIndexToDiff = [];
+        date = normalizedStart;
+        while (date < normalizedEnd) {
+            if (isValidDate(date, tDateProfile, dateProfile, view)) {
+                snapIndex++;
+                snapDiffToIndex.push(snapIndex);
+                snapIndexToDiff.push(snapDiff);
+            }
+            else {
+                snapDiffToIndex.push(snapIndex + 0.5);
+            }
+            date = dateEnv.add(date, tDateProfile.snapDuration);
+            snapDiff++;
+        }
+        tDateProfile.snapDiffToIndex = snapDiffToIndex;
+        tDateProfile.snapIndexToDiff = snapIndexToDiff;
+        tDateProfile.snapCnt = snapIndex + 1; // is always one behind
+        tDateProfile.slotCnt = tDateProfile.snapCnt / tDateProfile.snapsPerSlot;
+        // more...
+        tDateProfile.isWeekStarts = buildIsWeekStarts(tDateProfile, dateEnv);
+        tDateProfile.cellRows = buildCellRows(tDateProfile, dateEnv, view);
+        return tDateProfile;
+    }
+    /*
+    snaps to appropriate unit
+    */
+    function normalizeDate(date, tDateProfile, dateEnv) {
+        var normalDate = date;
+        if (!tDateProfile.isTimeScale) {
+            normalDate = core.startOfDay(normalDate);
+            if (tDateProfile.largeUnit) {
+                normalDate = dateEnv.startOf(normalDate, tDateProfile.largeUnit);
+            }
+        }
+        return normalDate;
+    }
+    /*
+    snaps to appropriate unit
+    */
+    function normalizeRange(range, tDateProfile, dateEnv) {
+        if (!tDateProfile.isTimeScale) {
+            range = core.computeVisibleDayRange(range);
+            if (tDateProfile.largeUnit) {
+                var dayRange = range; // preserve original result
+                range = {
+                    start: dateEnv.startOf(range.start, tDateProfile.largeUnit),
+                    end: dateEnv.startOf(range.end, tDateProfile.largeUnit)
+                };
+                // if date is partially through the interval, or is in the same interval as the start,
+                // make the exclusive end be the *next* interval
+                if (range.end.valueOf() !== dayRange.end.valueOf() || range.end <= range.start) {
+                    range = {
+                        start: range.start,
+                        end: dateEnv.add(range.end, tDateProfile.slotDuration)
+                    };
+                }
+            }
+        }
+        return range;
+    }
+    function isValidDate(date, tDateProfile, dateProfile, view) {
+        if (view.dateProfileGenerator.isHiddenDay(date)) {
+            return false;
+        }
+        else if (tDateProfile.isTimeScale) {
+            // determine if the time is within minTime/maxTime, which may have wacky values
+            var day = core.startOfDay(date);
+            var timeMs = date.valueOf() - day.valueOf();
+            var ms = timeMs - core.asRoughMs(dateProfile.minTime); // milliseconds since minTime
+            ms = ((ms % 86400000) + 86400000) % 86400000; // make negative values wrap to 24hr clock
+            return ms < tDateProfile.timeWindowMs; // before the maxTime?
+        }
+        else {
+            return true;
+        }
+    }
+    function queryDurationOption(view, name) {
+        var input = view.opt(name);
+        if (input != null) {
+            return core.createDuration(input);
+        }
+    }
+    function validateLabelAndSlot(tDateProfile, dateProfile, dateEnv) {
+        var currentRange = dateProfile.currentRange;
+        // make sure labelInterval doesn't exceed the max number of cells
+        if (tDateProfile.labelInterval) {
+            var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.labelInterval);
+            if (labelCnt > core.config.MAX_TIMELINE_SLOTS) {
+                console.warn('slotLabelInterval results in too many cells');
+                tDateProfile.labelInterval = null;
+            }
+        }
+        // make sure slotDuration doesn't exceed the maximum number of cells
+        if (tDateProfile.slotDuration) {
+            var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.slotDuration);
+            if (slotCnt > core.config.MAX_TIMELINE_SLOTS) {
+                console.warn('slotDuration results in too many cells');
+                tDateProfile.slotDuration = null;
+            }
+        }
+        // make sure labelInterval is a multiple of slotDuration
+        if (tDateProfile.labelInterval && tDateProfile.slotDuration) {
+            var slotsPerLabel = core.wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
+            if (slotsPerLabel === null || slotsPerLabel < 1) {
+                console.warn('slotLabelInterval must be a multiple of slotDuration');
+                tDateProfile.slotDuration = null;
+            }
+        }
+    }
+    function ensureLabelInterval(tDateProfile, dateProfile, dateEnv) {
+        var currentRange = dateProfile.currentRange;
+        var labelInterval = tDateProfile.labelInterval;
+        if (!labelInterval) {
+            // compute based off the slot duration
+            // find the largest label interval with an acceptable slots-per-label
+            var input = void 0;
+            if (tDateProfile.slotDuration) {
+                for (var _i = 0, STOCK_SUB_DURATIONS_1 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_1.length; _i++) {
+                    input = STOCK_SUB_DURATIONS_1[_i];
+                    var tryLabelInterval = core.createDuration(input);
+                    var slotsPerLabel = core.wholeDivideDurations(tryLabelInterval, tDateProfile.slotDuration);
+                    if (slotsPerLabel !== null && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
+                        labelInterval = tryLabelInterval;
+                        break;
+                    }
+                }
+                // use the slot duration as a last resort
+                if (!labelInterval) {
+                    labelInterval = tDateProfile.slotDuration;
+                }
+                // compute based off the view's duration
+                // find the largest label interval that yields the minimum number of labels
+            }
+            else {
+                for (var _a = 0, STOCK_SUB_DURATIONS_2 = STOCK_SUB_DURATIONS; _a < STOCK_SUB_DURATIONS_2.length; _a++) {
+                    input = STOCK_SUB_DURATIONS_2[_a];
+                    labelInterval = core.createDuration(input);
+                    var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, labelInterval);
+                    if (labelCnt >= MIN_AUTO_LABELS) {
+                        break;
+                    }
+                }
+            }
+            tDateProfile.labelInterval = labelInterval;
+        }
+        return labelInterval;
+    }
+    function ensureSlotDuration(tDateProfile, dateProfile, dateEnv) {
+        var currentRange = dateProfile.currentRange;
+        var slotDuration = tDateProfile.slotDuration;
+        if (!slotDuration) {
+            var labelInterval = ensureLabelInterval(tDateProfile, dateProfile, dateEnv); // will compute if necessary
+            // compute based off the label interval
+            // find the largest slot duration that is different from labelInterval, but still acceptable
+            for (var _i = 0, STOCK_SUB_DURATIONS_3 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_3.length; _i++) {
+                var input = STOCK_SUB_DURATIONS_3[_i];
+                var trySlotDuration = core.createDuration(input);
+                var slotsPerLabel = core.wholeDivideDurations(labelInterval, trySlotDuration);
+                if (slotsPerLabel !== null && slotsPerLabel > 1 && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
+                    slotDuration = trySlotDuration;
+                    break;
+                }
+            }
+            // only allow the value if it won't exceed the view's # of slots limit
+            if (slotDuration) {
+                var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, slotDuration);
+                if (slotCnt > MAX_AUTO_CELLS) {
+                    slotDuration = null;
+                }
+            }
+            // use the label interval as a last resort
+            if (!slotDuration) {
+                slotDuration = labelInterval;
+            }
+            tDateProfile.slotDuration = slotDuration;
+        }
+        return slotDuration;
+    }
+    function computeHeaderFormats(tDateProfile, dateProfile, dateEnv, view) {
+        var format1;
+        var format2;
+        var labelInterval = tDateProfile.labelInterval;
+        var unit = core.greatestDurationDenominator(labelInterval).unit;
+        var weekNumbersVisible = view.opt('weekNumbers');
+        var format0 = (format1 = (format2 = null));
+        // NOTE: weekNumber computation function wont work
+        if ((unit === 'week') && !weekNumbersVisible) {
+            unit = 'day';
+        }
+        switch (unit) {
+            case 'year':
+                format0 = { year: 'numeric' }; // '2015'
+                break;
+            case 'month':
+                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
+                    format0 = { year: 'numeric' }; // '2015'
+                }
+                format1 = { month: 'short' }; // 'Jan'
+                break;
+            case 'week':
+                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
+                    format0 = { year: 'numeric' }; // '2015'
+                }
+                format1 = { week: 'narrow' }; // 'Wk4'
+                break;
+            case 'day':
+                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
+                    format0 = { year: 'numeric', month: 'long' }; // 'January 2014'
+                }
+                else if (currentRangeAs('months', dateProfile, dateEnv) > 1) {
+                    format0 = { month: 'long' }; // 'January'
+                }
+                if (weekNumbersVisible) {
+                    format1 = { week: 'short' }; // 'Wk 4'
+                }
+                format2 = { weekday: 'narrow', day: 'numeric' }; // 'Su 9'
+                break;
+            case 'hour':
+                if (weekNumbersVisible) {
+                    format0 = { week: 'short' }; // 'Wk 4'
+                }
+                if (currentRangeAs('days', dateProfile, dateEnv) > 1) {
+                    format1 = { weekday: 'short', day: 'numeric', month: 'numeric', omitCommas: true }; // Sat 4/7
+                }
+                format2 = {
+                    hour: 'numeric',
+                    minute: '2-digit',
+                    omitZeroMinute: true,
+                    meridiem: 'short'
+                };
+                break;
+            case 'minute':
+                // sufficiently large number of different minute cells?
+                if ((core.asRoughMinutes(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
+                    format0 = {
+                        hour: 'numeric',
+                        meridiem: 'short'
+                    };
+                    format1 = function (params) {
+                        return ':' + core.padStart(params.date.minute, 2); // ':30'
+                    };
+                }
+                else {
+                    format0 = {
+                        hour: 'numeric',
+                        minute: 'numeric',
+                        meridiem: 'short'
+                    };
+                }
+                break;
+            case 'second':
+                // sufficiently large number of different second cells?
+                if ((core.asRoughSeconds(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
+                    format0 = { hour: 'numeric', minute: '2-digit', meridiem: 'lowercase' }; // '8:30 PM'
+                    format1 = function (params) {
+                        return ':' + core.padStart(params.date.second, 2); // ':30'
+                    };
+                }
+                else {
+                    format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
+                }
+                break;
+            case 'millisecond':
+                format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
+                format1 = function (params) {
+                    return '.' + core.padStart(params.millisecond, 3);
+                };
+                break;
+        }
+        return [].concat(format0 || [], format1 || [], format2 || []);
+    }
+    // Compute the number of the give units in the "current" range.
+    // Won't go more precise than days.
+    // Will return `0` if there's not a clean whole interval.
+    function currentRangeAs(unit, dateProfile, dateEnv) {
+        var range = dateProfile.currentRange;
+        var res = null;
+        if (unit === 'years') {
+            res = dateEnv.diffWholeYears(range.start, range.end);
+        }
+        else if (unit === 'months') {
+            res = dateEnv.diffWholeMonths(range.start, range.end);
+        }
+        else if (unit === 'weeks') {
+            res = dateEnv.diffWholeMonths(range.start, range.end);
+        }
+        else if (unit === 'days') {
+            res = core.diffWholeDays(range.start, range.end);
+        }
+        return res || 0;
+    }
+    function buildIsWeekStarts(tDateProfile, dateEnv) {
+        var slotDates = tDateProfile.slotDates, emphasizeWeeks = tDateProfile.emphasizeWeeks;
+        var prevWeekNumber = null;
+        var isWeekStarts = [];
+        for (var _i = 0, slotDates_1 = slotDates; _i < slotDates_1.length; _i++) {
+            var slotDate = slotDates_1[_i];
+            var weekNumber = dateEnv.computeWeekNumber(slotDate);
+            var isWeekStart = emphasizeWeeks && (prevWeekNumber !== null) && (prevWeekNumber !== weekNumber);
+            prevWeekNumber = weekNumber;
+            isWeekStarts.push(isWeekStart);
+        }
+        return isWeekStarts;
+    }
+    function buildCellRows(tDateProfile, dateEnv, view) {
+        var slotDates = tDateProfile.slotDates;
+        var formats = tDateProfile.headerFormats;
+        var cellRows = formats.map(function (format) { return []; }); // indexed by row,col
+        // specifically for navclicks
+        var rowUnits = formats.map(function (format) {
+            return format.getLargestUnit ? format.getLargestUnit() : null;
+        });
+        // builds cellRows and slotCells
+        for (var i = 0; i < slotDates.length; i++) {
+            var date = slotDates[i];
+            var isWeekStart = tDateProfile.isWeekStarts[i];
+            for (var row = 0; row < formats.length; row++) {
+                var format = formats[row];
+                var rowCells = cellRows[row];
+                var leadingCell = rowCells[rowCells.length - 1];
+                var isSuperRow = (formats.length > 1) && (row < (formats.length - 1)); // more than one row and not the last
+                var newCell = null;
+                if (isSuperRow) {
+                    var text = dateEnv.format(date, format);
+                    if (!leadingCell || (leadingCell.text !== text)) {
+                        newCell = buildCellObject(date, text, rowUnits[row], view);
+                    }
+                    else {
+                        leadingCell.colspan += 1;
+                    }
+                }
+                else {
+                    if (!leadingCell ||
+                        core.isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval))) {
+                        var text = dateEnv.format(date, format);
+                        newCell = buildCellObject(date, text, rowUnits[row], view);
+                    }
+                    else {
+                        leadingCell.colspan += 1;
+                    }
+                }
+                if (newCell) {
+                    newCell.weekStart = isWeekStart;
+                    rowCells.push(newCell);
+                }
+            }
+        }
+        return cellRows;
+    }
+    function buildCellObject(date, text, rowUnit, view) {
+        var spanHtml = core.buildGotoAnchorHtml(view, {
+            date: date,
+            type: rowUnit,
+            forceOff: !rowUnit
+        }, {
+            'class': 'fc-cell-text'
+        }, core.htmlEscape(text));
+        return { text: text, spanHtml: spanHtml, date: date, colspan: 1, isWeekStart: false };
+    }
+
+    var TimelineNowIndicator = /** @class */ (function () {
+        function TimelineNowIndicator(headParent, bodyParent) {
+            this.headParent = headParent;
+            this.bodyParent = bodyParent;
+        }
+        TimelineNowIndicator.prototype.render = function (coord, isRtl) {
+            var styleProps = isRtl ? { right: -coord } : { left: coord };
+            this.headParent.appendChild(this.arrowEl = core.createElement('div', {
+                className: 'fc-now-indicator fc-now-indicator-arrow',
+                style: styleProps
+            }));
+            this.bodyParent.appendChild(this.lineEl = core.createElement('div', {
+                className: 'fc-now-indicator fc-now-indicator-line',
+                style: styleProps
+            }));
+        };
+        TimelineNowIndicator.prototype.unrender = function () {
+            if (this.arrowEl) {
+                core.removeElement(this.arrowEl);
+            }
+            if (this.lineEl) {
+                core.removeElement(this.lineEl);
+            }
+        };
+        return TimelineNowIndicator;
+    }());
+
+    var STICKY_PROP_VAL = computeStickyPropVal(); // if null, means not supported at all
+    var IS_MS_EDGE = /Edge/.test(navigator.userAgent);
+    var IS_SAFARI = STICKY_PROP_VAL === '-webkit-sticky'; // good b/c doesn't confuse chrome
+    var STICKY_CLASSNAME = 'fc-sticky';
+    /*
+    useful beyond the native position:sticky for these reasons:
+    - support in IE11
+    - nice centering support
+    */
+    var StickyScroller = /** @class */ (function () {
+        function StickyScroller(scroller, isRtl, isVertical) {
+            var _this = this;
+            this.usingRelative = null;
+            /*
+            known bug: called twice on init. problem when mixing with ScrollJoiner
+            */
+            this.updateSize = function () {
+                var els = Array.prototype.slice.call(_this.scroller.canvas.el.querySelectorAll('.' + STICKY_CLASSNAME));
+                var elGeoms = _this.queryElGeoms(els);
+                var viewportWidth = _this.scroller.el.clientWidth;
+                if (_this.usingRelative) {
+                    var elDestinations = _this.computeElDestinations(elGeoms, viewportWidth); // read before prepPositioning
+                    assignRelativePositions(els, elGeoms, elDestinations);
+                }
+                else {
+                    assignStickyPositions(els, elGeoms, viewportWidth);
+                }
+            };
+            this.scroller = scroller;
+            this.usingRelative =
+                !STICKY_PROP_VAL || // IE11
+                    (IS_MS_EDGE && isRtl) || // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/18883305/
+                    ((IS_MS_EDGE || IS_SAFARI) && isVertical); // because doesn't work with rowspan in tables, our only vertial use
+            if (this.usingRelative) {
+                scroller.on('scrollEnd', this.updateSize);
+            }
+        }
+        StickyScroller.prototype.destroy = function () {
+            this.scroller.off('scrollEnd', this.updateSize);
+        };
+        StickyScroller.prototype.queryElGeoms = function (els) {
+            var canvasOrigin = this.scroller.canvas.el.getBoundingClientRect();
+            var elGeoms = [];
+            for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {
+                var el = els_1[_i];
+                var parentBound = core.translateRect(el.parentNode.getBoundingClientRect(), -canvasOrigin.left, -canvasOrigin.top);
+                var elRect = el.getBoundingClientRect();
+                var computedStyles = window.getComputedStyle(el);
+                var computedTextAlign = window.getComputedStyle(el.parentNode).textAlign; // ask the parent
+                var intendedTextAlign = computedTextAlign;
+                var naturalBound = null;
+                if (computedStyles.position !== 'sticky') {
+                    naturalBound = core.translateRect(elRect, -canvasOrigin.left - (parseFloat(computedStyles.left) || 0), // could be 'auto'
+                    -canvasOrigin.top - (parseFloat(computedStyles.top) || 0));
+                }
+                if (el.hasAttribute('data-sticky-center')) {
+                    intendedTextAlign = 'center';
+                }
+                elGeoms.push({
+                    parentBound: parentBound,
+                    naturalBound: naturalBound,
+                    elWidth: elRect.width,
+                    elHeight: elRect.height,
+                    computedTextAlign: computedTextAlign,
+                    intendedTextAlign: intendedTextAlign
+                });
+            }
+            return elGeoms;
+        };
+        StickyScroller.prototype.computeElDestinations = function (elGeoms, viewportWidth) {
+            var viewportLeft = this.scroller.getScrollFromLeft();
+            var viewportTop = this.scroller.getScrollTop();
+            var viewportRight = viewportLeft + viewportWidth;
+            return elGeoms.map(function (elGeom) {
+                var elWidth = elGeom.elWidth, elHeight = elGeom.elHeight, parentBound = elGeom.parentBound, naturalBound = elGeom.naturalBound;
+                var destLeft; // relative to canvas topleft
+                var destTop; // "
+                switch (elGeom.intendedTextAlign) {
+                    case 'left':
+                        destLeft = viewportLeft;
+                        break;
+                    case 'right':
+                        destLeft = viewportRight - elWidth;
+                        break;
+                    case 'center':
+                        destLeft = (viewportLeft + viewportRight) / 2 - elWidth / 2;
+                        break;
+                }
+                destLeft = Math.min(destLeft, parentBound.right - elWidth);
+                destLeft = Math.max(destLeft, parentBound.left);
+                destTop = viewportTop;
+                destTop = Math.min(destTop, parentBound.bottom - elHeight);
+                destTop = Math.max(destTop, naturalBound.top); // better to use natural top for upper bound
+                return { left: destLeft, top: destTop };
+            });
+        };
+        return StickyScroller;
+    }());
+    function assignRelativePositions(els, elGeoms, elDestinations) {
+        els.forEach(function (el, i) {
+            var naturalBound = elGeoms[i].naturalBound;
+            core.applyStyle(el, {
+                position: 'relative',
+                left: elDestinations[i].left - naturalBound.left,
+                top: elDestinations[i].top - naturalBound.top
+            });
+        });
+    }
+    function assignStickyPositions(els, elGeoms, viewportWidth) {
+        els.forEach(function (el, i) {
+            var stickyLeft = 0;
+            if (elGeoms[i].intendedTextAlign === 'center') {
+                stickyLeft = (viewportWidth - elGeoms[i].elWidth) / 2;
+                // needs to be forced to left?
+                if (elGeoms[i].computedTextAlign === 'center') {
+                    el.setAttribute('data-sticky-center', '') // remember for next queryElGeoms
+                    ;
+                    el.parentNode.style.textAlign = 'left';
+                }
+            }
+            core.applyStyle(el, {
+                position: STICKY_PROP_VAL,
+                left: stickyLeft,
+                right: 0,
+                top: 0
+            });
+        });
+    }
+    function computeStickyPropVal() {
+        var el = core.htmlToElement('<div style="position:-webkit-sticky;position:sticky"></div>');
+        var val = el.style.position;
+        if (val.indexOf('sticky') !== -1) {
+            return val;
+        }
+        else {
+            return null;
+        }
+    }
+
+    var TimeAxis = /** @class */ (function (_super) {
+        __extends(TimeAxis, _super);
+        function TimeAxis(context, headerContainerEl, bodyContainerEl) {
+            var _this = _super.call(this, context) || this;
+            var layout = _this.layout = new HeaderBodyLayout(headerContainerEl, bodyContainerEl, 'auto');
+            var headerEnhancedScroller = layout.headerScroller.enhancedScroll;
+            var bodyEnhancedScroller = layout.bodyScroller.enhancedScroll;
+            // needs to go after layout, which has ScrollJoiner
+            _this.headStickyScroller = new StickyScroller(headerEnhancedScroller, _this.isRtl, false); // isVertical=false
+            _this.bodyStickyScroller = new StickyScroller(bodyEnhancedScroller, _this.isRtl, false); // isVertical=false
+            _this.header = new TimelineHeader(context, headerEnhancedScroller.canvas.contentEl);
+            _this.slats = new TimelineSlats(context, bodyEnhancedScroller.canvas.bgEl);
+            _this.nowIndicator = new TimelineNowIndicator(headerEnhancedScroller.canvas.el, bodyEnhancedScroller.canvas.el);
+            return _this;
+        }
+        TimeAxis.prototype.destroy = function () {
+            this.layout.destroy();
+            this.header.destroy();
+            this.slats.destroy();
+            this.nowIndicator.unrender();
+            this.headStickyScroller.destroy();
+            this.bodyStickyScroller.destroy();
+            _super.prototype.destroy.call(this);
+        };
+        TimeAxis.prototype.render = function (props) {
+            var tDateProfile = this.tDateProfile =
+                buildTimelineDateProfile(props.dateProfile, this.view); // TODO: cache
+            this.header.receiveProps({
+                dateProfile: props.dateProfile,
+                tDateProfile: tDateProfile
+            });
+            this.slats.receiveProps({
+                dateProfile: props.dateProfile,
+                tDateProfile: tDateProfile
+            });
+        };
+        // Now Indicator
+        // ------------------------------------------------------------------------------------------
+        TimeAxis.prototype.getNowIndicatorUnit = function (dateProfile) {
+            // yuck
+            var tDateProfile = this.tDateProfile =
+                buildTimelineDateProfile(dateProfile, this.view); // TODO: cache
+            if (tDateProfile.isTimeScale) {
+                return core.greatestDurationDenominator(tDateProfile.slotDuration).unit;
+            }
+        };
+        // will only execute if isTimeScale
+        TimeAxis.prototype.renderNowIndicator = function (date) {
+            if (core.rangeContainsMarker(this.tDateProfile.normalizedRange, date)) {
+                this.nowIndicator.render(this.dateToCoord(date), this.isRtl);
+            }
+        };
+        // will only execute if isTimeScale
+        TimeAxis.prototype.unrenderNowIndicator = function () {
+            this.nowIndicator.unrender();
+        };
+        // Sizing
+        // ------------------------------------------------------------------------------------------
+        TimeAxis.prototype.updateSize = function (isResize, totalHeight, isAuto) {
+            this.applySlotWidth(this.computeSlotWidth());
+            // adjusts gutters. do after slot widths set
+            this.layout.setHeight(totalHeight, isAuto);
+            // pretty much just queries coords. do last
+            this.slats.updateSize();
+        };
+        TimeAxis.prototype.updateStickyScrollers = function () {
+            this.headStickyScroller.updateSize();
+            this.bodyStickyScroller.updateSize();
+        };
+        TimeAxis.prototype.computeSlotWidth = function () {
+            var slotWidth = this.opt('slotWidth') || '';
+            if (slotWidth === '') {
+                slotWidth = this.computeDefaultSlotWidth(this.tDateProfile);
+            }
+            return slotWidth;
+        };
+        TimeAxis.prototype.computeDefaultSlotWidth = function (tDateProfile) {
+            var maxInnerWidth = 0; // TODO: harness core's `matchCellWidths` for this
+            this.header.innerEls.forEach(function (innerEl, i) {
+                maxInnerWidth = Math.max(maxInnerWidth, innerEl.getBoundingClientRect().width);
+            });
+            var headingCellWidth = Math.ceil(maxInnerWidth) + 1; // assume no padding, and one pixel border
+            // in TimelineView.defaults we ensured that labelInterval is an interval of slotDuration
+            // TODO: rename labelDuration?
+            var slotsPerLabel = core.wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
+            var slotWidth = Math.ceil(headingCellWidth / slotsPerLabel);
+            var minWidth = window.getComputedStyle(this.header.slatColEls[0]).minWidth;
+            if (minWidth) {
+                minWidth = parseInt(minWidth, 10);
+                if (minWidth) {
+                    slotWidth = Math.max(slotWidth, minWidth);
+                }
+            }
+            return slotWidth;
+        };
+        TimeAxis.prototype.applySlotWidth = function (slotWidth) {
+            var _a = this, layout = _a.layout, tDateProfile = _a.tDateProfile;
+            var containerWidth = '';
+            var containerMinWidth = '';
+            var nonLastSlotWidth = '';
+            if (slotWidth !== '') {
+                slotWidth = Math.round(slotWidth);
+                containerWidth = slotWidth * tDateProfile.slotDates.length;
+                containerMinWidth = '';
+                nonLastSlotWidth = slotWidth;
+                var availableWidth = layout.bodyScroller.enhancedScroll.getClientWidth();
+                if (availableWidth > containerWidth) {
+                    containerMinWidth = availableWidth;
+                    containerWidth = '';
+                    nonLastSlotWidth = Math.floor(availableWidth / tDateProfile.slotDates.length);
+                }
+            }
+            layout.headerScroller.enhancedScroll.canvas.setWidth(containerWidth);
+            layout.headerScroller.enhancedScroll.canvas.setMinWidth(containerMinWidth);
+            layout.bodyScroller.enhancedScroll.canvas.setWidth(containerWidth);
+            layout.bodyScroller.enhancedScroll.canvas.setMinWidth(containerMinWidth);
+            if (nonLastSlotWidth !== '') {
+                this.header.slatColEls.slice(0, -1).concat(this.slats.slatColEls.slice(0, -1)).forEach(function (el) {
+                    el.style.width = nonLastSlotWidth + 'px';
+                });
+            }
+        };
+        // returned value is between 0 and the number of snaps
+        TimeAxis.prototype.computeDateSnapCoverage = function (date) {
+            var _a = this, dateEnv = _a.dateEnv, tDateProfile = _a.tDateProfile;
+            var snapDiff = dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.snapDuration);
+            if (snapDiff < 0) {
+                return 0;
+            }
+            else if (snapDiff >= tDateProfile.snapDiffToIndex.length) {
+                return tDateProfile.snapCnt;
+            }
+            else {
+                var snapDiffInt = Math.floor(snapDiff);
+                var snapCoverage = tDateProfile.snapDiffToIndex[snapDiffInt];
+                if (core.isInt(snapCoverage)) { // not an in-between value
+                    snapCoverage += snapDiff - snapDiffInt; // add the remainder
+                }
+                else {
+                    // a fractional value, meaning the date is not visible
+                    // always round up in this case. works for start AND end dates in a range.
+                    snapCoverage = Math.ceil(snapCoverage);
+                }
+                return snapCoverage;
+            }
+        };
+        // for LTR, results range from 0 to width of area
+        // for RTL, results range from negative width of area to 0
+        TimeAxis.prototype.dateToCoord = function (date) {
+            var tDateProfile = this.tDateProfile;
+            var snapCoverage = this.computeDateSnapCoverage(date);
+            var slotCoverage = snapCoverage / tDateProfile.snapsPerSlot;
+            var slotIndex = Math.floor(slotCoverage);
+            slotIndex = Math.min(slotIndex, tDateProfile.slotCnt - 1);
+            var partial = slotCoverage - slotIndex;
+            var _a = this.slats, innerCoordCache = _a.innerCoordCache, outerCoordCache = _a.outerCoordCache;
+            if (this.isRtl) {
+                return (outerCoordCache.rights[slotIndex] -
+                    (innerCoordCache.getWidth(slotIndex) * partial)) - outerCoordCache.originClientRect.width;
+            }
+            else {
+                return (outerCoordCache.lefts[slotIndex] +
+                    (innerCoordCache.getWidth(slotIndex) * partial));
+            }
+        };
+        TimeAxis.prototype.rangeToCoords = function (range) {
+            if (this.isRtl) {
+                return { right: this.dateToCoord(range.start), left: this.dateToCoord(range.end) };
+            }
+            else {
+                return { left: this.dateToCoord(range.start), right: this.dateToCoord(range.end) };
+            }
+        };
+        // Scrolling
+        // ------------------------------------------------------------------------------------------
+        TimeAxis.prototype.computeDateScroll = function (timeMs) {
+            var dateEnv = this.dateEnv;
+            var dateProfile = this.props.dateProfile;
+            var left = 0;
+            if (dateProfile) {
+                left = this.dateToCoord(dateEnv.add(core.startOfDay(dateProfile.activeRange.start), // startOfDay needed?
+                core.createDuration(timeMs)));
+                // hack to overcome the left borders of non-first slat
+                if (!this.isRtl && left) {
+                    left += 1;
+                }
+            }
+            return { left: left };
+        };
+        TimeAxis.prototype.queryDateScroll = function () {
+            var enhancedScroll = this.layout.bodyScroller.enhancedScroll;
+            return {
+                left: enhancedScroll.getScrollLeft()
+            };
+        };
+        TimeAxis.prototype.applyDateScroll = function (scroll) {
+            // TODO: lame we have to update both. use the scrolljoiner instead maybe
+            this.layout.bodyScroller.enhancedScroll.setScrollLeft(scroll.left || 0);
+            this.layout.headerScroller.enhancedScroll.setScrollLeft(scroll.left || 0);
+        };
+        return TimeAxis;
+    }(core.Component));
+
+    // import { computeResourceEditable } from '@fullcalendar/resource-common' ... CAN'T HAVE THIS DEP! COPIED AND PASTED BELOW!
+    var TimelineLaneEventRenderer = /** @class */ (function (_super) {
+        __extends(TimelineLaneEventRenderer, _super);
+        function TimelineLaneEventRenderer(context, masterContainerEl, timeAxis) {
+            var _this = _super.call(this, context) || this;
+            _this.masterContainerEl = masterContainerEl;
+            _this.timeAxis = timeAxis;
+            return _this;
+        }
+        TimelineLaneEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
+            var eventRange = seg.eventRange;
+            var eventDef = eventRange.def;
+            var eventUi = eventRange.ui;
+            var isDraggable = eventUi.startEditable || computeResourceEditable(eventDef, this.timeAxis.calendar);
+            var isResizableFromStart = seg.isStart && eventUi.durationEditable && this.context.options.eventResizableFromStart;
+            var isResizableFromEnd = seg.isEnd && eventUi.durationEditable;
+            var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
+            classes.unshift('fc-timeline-event', 'fc-h-event');
+            var timeText = this.getTimeText(eventRange);
+            return '<a class="' + classes.join(' ') + '" style="' + core.cssToStr(this.getSkinCss(eventUi)) + '"' +
+                (eventDef.url ?
+                    ' href="' + core.htmlEscape(eventDef.url) + '"' :
+                    '') +
+                '>' +
+                '<div class="fc-content">' +
+                (timeText ?
+                    '<span class="fc-time">' +
+                        core.htmlEscape(timeText) +
+                        '</span>'
+                    :
+                        '') +
+                '<span class="fc-title fc-sticky">' +
+                (eventDef.title ? core.htmlEscape(eventDef.title) : '&nbsp;') +
+                '</span>' +
+                '</div>' +
+                (isResizableFromStart ?
+                    '<div class="fc-resizer fc-start-resizer"></div>' :
+                    '') +
+                (isResizableFromEnd ?
+                    '<div class="fc-resizer fc-end-resizer"></div>' :
+                    '') +
+                '</a>';
+        };
+        TimelineLaneEventRenderer.prototype.computeDisplayEventTime = function () {
+            return !this.timeAxis.tDateProfile.isTimeScale; // because times should be obvious via axis
+        };
+        TimelineLaneEventRenderer.prototype.computeDisplayEventEnd = function () {
+            return false;
+        };
+        // Computes a default event time formatting string if `timeFormat` is not explicitly defined
+        TimelineLaneEventRenderer.prototype.computeEventTimeFormat = function () {
+            return {
+                hour: 'numeric',
+                minute: '2-digit',
+                omitZeroMinute: true,
+                meridiem: 'narrow'
+            };
+        };
+        TimelineLaneEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
+            if (!this.el && this.masterContainerEl) {
+                this.el = core.createElement('div', { className: 'fc-event-container' });
+                if (mirrorInfo) {
+                    this.el.classList.add('fc-mirror-container');
+                }
+                this.masterContainerEl.appendChild(this.el);
+            }
+            if (this.el) {
+                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                    var seg = segs_1[_i];
+                    this.el.appendChild(seg.el);
+                }
+            }
+        };
+        TimelineLaneEventRenderer.prototype.detachSegs = function (segs) {
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                core.removeElement(seg.el);
+            }
+        };
+        // computes AND assigns (assigns the left/right at least). bad
+        TimelineLaneEventRenderer.prototype.computeSegSizes = function (segs) {
+            var timeAxis = this.timeAxis;
+            for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
+                var seg = segs_3[_i];
+                var coords = timeAxis.rangeToCoords(seg); // works because Seg has start/end
+                core.applyStyle(seg.el, {
+                    left: (seg.left = coords.left),
+                    right: -(seg.right = coords.right)
+                });
+            }
+        };
+        TimelineLaneEventRenderer.prototype.assignSegSizes = function (segs) {
+            if (!this.el) {
+                return;
+            }
+            // compute seg verticals
+            for (var _i = 0, segs_4 = segs; _i < segs_4.length; _i++) {
+                var seg = segs_4[_i];
+                seg.height = core.computeHeightAndMargins(seg.el);
+            }
+            this.buildSegLevels(segs); // populates above/below props for computeOffsetForSegs
+            var totalHeight = computeOffsetForSegs(segs); // also assigns seg.top
+            core.applyStyleProp(this.el, 'height', totalHeight);
+            // assign seg verticals
+            for (var _a = 0, segs_5 = segs; _a < segs_5.length; _a++) {
+                var seg = segs_5[_a];
+                core.applyStyleProp(seg.el, 'top', seg.top);
+            }
+        };
+        TimelineLaneEventRenderer.prototype.buildSegLevels = function (segs) {
+            var segLevels = [];
+            segs = this.sortEventSegs(segs);
+            for (var _i = 0, segs_6 = segs; _i < segs_6.length; _i++) {
+                var unplacedSeg = segs_6[_i];
+                unplacedSeg.above = [];
+                // determine the first level with no collisions
+                var level = 0; // level index
+                while (level < segLevels.length) {
+                    var isLevelCollision = false;
+                    // determine collisions
+                    for (var _a = 0, _b = segLevels[level]; _a < _b.length; _a++) {
+                        var placedSeg = _b[_a];
+                        if (timeRowSegsCollide(unplacedSeg, placedSeg)) {
+                            unplacedSeg.above.push(placedSeg);
+                            isLevelCollision = true;
+                        }
+                    }
+                    if (isLevelCollision) {
+                        level += 1;
+                    }
+                    else {
+                        break;
+                    }
+                }
+                // insert into the first non-colliding level. create if necessary
+                (segLevels[level] || (segLevels[level] = []))
+                    .push(unplacedSeg);
+                // record possible colliding segments below (TODO: automated test for this)
+                level += 1;
+                while (level < segLevels.length) {
+                    for (var _c = 0, _d = segLevels[level]; _c < _d.length; _c++) {
+                        var belowSeg = _d[_c];
+                        if (timeRowSegsCollide(unplacedSeg, belowSeg)) {
+                            belowSeg.above.push(unplacedSeg);
+                        }
+                    }
+                    level += 1;
+                }
+            }
+            return segLevels;
+        };
+        return TimelineLaneEventRenderer;
+    }(core.FgEventRenderer));
+    function computeOffsetForSegs(segs) {
+        var max = 0;
+        for (var _i = 0, segs_7 = segs; _i < segs_7.length; _i++) {
+            var seg = segs_7[_i];
+            max = Math.max(max, computeOffsetForSeg(seg));
+        }
+        return max;
+    }
+    function computeOffsetForSeg(seg) {
+        if ((seg.top == null)) {
+            seg.top = computeOffsetForSegs(seg.above);
+        }
+        return seg.top + seg.height;
+    }
+    function timeRowSegsCollide(seg0, seg1) {
+        return (seg0.left < seg1.right) && (seg0.right > seg1.left);
+    }
+    // HACK
+    function computeResourceEditable(eventDef, calendar) {
+        var resourceEditable = eventDef.resourceEditable;
+        if (resourceEditable == null) {
+            var source = eventDef.sourceId && calendar.state.eventSources[eventDef.sourceId];
+            if (source) {
+                resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
+            }
+            if (resourceEditable == null) {
+                resourceEditable = calendar.opt('eventResourceEditable');
+                if (resourceEditable == null) {
+                    resourceEditable = true; // TODO: use defaults system instead
+                }
+            }
+        }
+        return resourceEditable;
+    }
+
+    var TimelineLaneFillRenderer = /** @class */ (function (_super) {
+        __extends(TimelineLaneFillRenderer, _super);
+        function TimelineLaneFillRenderer(context, masterContainerEl, timeAxis) {
+            var _this = _super.call(this, context) || this;
+            _this.masterContainerEl = masterContainerEl;
+            _this.timeAxis = timeAxis;
+            return _this;
+        }
+        TimelineLaneFillRenderer.prototype.attachSegs = function (type, segs) {
+            if (segs.length) {
+                var className = void 0;
+                if (type === 'businessHours') {
+                    className = 'bgevent';
+                }
+                else {
+                    className = type.toLowerCase();
+                }
+                // making a new container each time is OKAY
+                // all types of segs (background or business hours or whatever) are rendered in one pass
+                var containerEl = core.createElement('div', { className: 'fc-' + className + '-container' });
+                this.masterContainerEl.appendChild(containerEl);
+                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                    var seg = segs_1[_i];
+                    containerEl.appendChild(seg.el);
+                }
+                return [containerEl]; // return value
+            }
+        };
+        TimelineLaneFillRenderer.prototype.computeSegSizes = function (segs) {
+            var timeAxis = this.timeAxis;
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                var coords = timeAxis.rangeToCoords(seg);
+                seg.left = coords.left;
+                seg.right = coords.right;
+            }
+        };
+        TimelineLaneFillRenderer.prototype.assignSegSizes = function (segs) {
+            for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
+                var seg = segs_3[_i];
+                core.applyStyle(seg.el, {
+                    left: seg.left,
+                    right: -seg.right
+                });
+            }
+        };
+        return TimelineLaneFillRenderer;
+    }(core.FillRenderer));
+
+    var TimelineLane = /** @class */ (function (_super) {
+        __extends(TimelineLane, _super);
+        function TimelineLane(context, fgContainerEl, bgContainerEl, timeAxis) {
+            var _this = _super.call(this, context, bgContainerEl) // should el be bgContainerEl???
+             || this;
+            _this.slicer = new TimelineLaneSlicer();
+            _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag);
+            _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize);
+            var fillRenderer = _this.fillRenderer = new TimelineLaneFillRenderer(context, bgContainerEl, timeAxis);
+            var eventRenderer = _this.eventRenderer = new TimelineLaneEventRenderer(context, fgContainerEl, timeAxis);
+            _this.mirrorRenderer = new TimelineLaneEventRenderer(context, fgContainerEl, timeAxis);
+            _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'));
+            _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'));
+            _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'));
+            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
+            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
+            _this.timeAxis = timeAxis;
+            return _this;
+        }
+        TimelineLane.prototype.render = function (props) {
+            var slicedProps = this.slicer.sliceProps(props, props.dateProfile, this.timeAxis.tDateProfile.isTimeScale ? null : props.nextDayThreshold, this, this.timeAxis);
+            this.renderBusinessHours(slicedProps.businessHourSegs);
+            this.renderDateSelection(slicedProps.dateSelectionSegs);
+            this.renderBgEvents(slicedProps.bgEventSegs);
+            this.renderFgEvents(slicedProps.fgEventSegs);
+            this.renderEventSelection(slicedProps.eventSelection);
+            this.renderEventDrag(slicedProps.eventDrag);
+            this.renderEventResize(slicedProps.eventResize);
+        };
+        TimelineLane.prototype.destroy = function () {
+            _super.prototype.destroy.call(this);
+            this.renderBusinessHours.unrender();
+            this.renderDateSelection.unrender();
+            this.renderBgEvents.unrender();
+            this.renderFgEvents.unrender();
+            this.renderEventSelection.unrender();
+            this.renderEventDrag.unrender();
+            this.renderEventResize.unrender();
+        };
+        TimelineLane.prototype._renderEventDrag = function (state) {
+            if (state) {
+                this.eventRenderer.hideByHash(state.affectedInstances);
+                this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        TimelineLane.prototype._unrenderEventDrag = function (state) {
+            if (state) {
+                this.eventRenderer.showByHash(state.affectedInstances);
+                this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        TimelineLane.prototype._renderEventResize = function (state) {
+            if (state) {
+                // HACK. eventRenderer and fillRenderer both use these segs. would compete over seg.el
+                var segsForHighlight = state.segs.map(function (seg) {
+                    return __assign({}, seg);
+                });
+                this.eventRenderer.hideByHash(state.affectedInstances);
+                this.fillRenderer.renderSegs('highlight', segsForHighlight);
+                this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        TimelineLane.prototype._unrenderEventResize = function (state) {
+            if (state) {
+                this.eventRenderer.showByHash(state.affectedInstances);
+                this.fillRenderer.unrender('highlight');
+                this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
+            }
+        };
+        TimelineLane.prototype.updateSize = function (isResize) {
+            var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
+            fillRenderer.computeSizes(isResize);
+            eventRenderer.computeSizes(isResize);
+            mirrorRenderer.computeSizes(isResize);
+            fillRenderer.assignSizes(isResize);
+            eventRenderer.assignSizes(isResize);
+            mirrorRenderer.assignSizes(isResize);
+        };
+        return TimelineLane;
+    }(core.DateComponent));
+    var TimelineLaneSlicer = /** @class */ (function (_super) {
+        __extends(TimelineLaneSlicer, _super);
+        function TimelineLaneSlicer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineLaneSlicer.prototype.sliceRange = function (origRange, timeAxis) {
+            var tDateProfile = timeAxis.tDateProfile;
+            var dateProfile = timeAxis.props.dateProfile;
+            var normalRange = normalizeRange(origRange, tDateProfile, timeAxis.dateEnv);
+            var segs = [];
+            // protect against when the span is entirely in an invalid date region
+            if (timeAxis.computeDateSnapCoverage(normalRange.start) < timeAxis.computeDateSnapCoverage(normalRange.end)) {
+                // intersect the footprint's range with the grid's range
+                var slicedRange = core.intersectRanges(normalRange, tDateProfile.normalizedRange);
+                if (slicedRange) {
+                    segs.push({
+                        start: slicedRange.start,
+                        end: slicedRange.end,
+                        isStart: slicedRange.start.valueOf() === normalRange.start.valueOf() && isValidDate(slicedRange.start, tDateProfile, dateProfile, timeAxis.view),
+                        isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf() && isValidDate(core.addMs(slicedRange.end, -1), tDateProfile, dateProfile, timeAxis.view)
+                    });
+                }
+            }
+            return segs;
+        };
+        return TimelineLaneSlicer;
+    }(core.Slicer));
+
+    var TimelineView = /** @class */ (function (_super) {
+        __extends(TimelineView, _super);
+        function TimelineView(context, viewSpec, dateProfileGenerator, parentEl) {
+            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
+            _this.el.classList.add('fc-timeline');
+            if (_this.opt('eventOverlap') === false) {
+                _this.el.classList.add('fc-no-overlap');
+            }
+            _this.el.innerHTML = _this.renderSkeletonHtml();
+            _this.timeAxis = new TimeAxis(_this.context, _this.el.querySelector('thead .fc-time-area'), _this.el.querySelector('tbody .fc-time-area'));
+            _this.lane = new TimelineLane(_this.context, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl, _this.timeAxis);
+            context.calendar.registerInteractiveComponent(_this, {
+                el: _this.timeAxis.slats.el
+            });
+            return _this;
+        }
+        TimelineView.prototype.destroy = function () {
+            this.timeAxis.destroy();
+            this.lane.destroy();
+            _super.prototype.destroy.call(this);
+            this.calendar.unregisterInteractiveComponent(this);
+        };
+        TimelineView.prototype.renderSkeletonHtml = function () {
+            var theme = this.theme;
+            return "<table class=\"" + theme.getClass('tableGrid') + "\"> <thead class=\"fc-head\"> <tr> <td class=\"fc-time-area " + theme.getClass('widgetHeader') + "\"></td> </tr> </thead> <tbody class=\"fc-body\"> <tr> <td class=\"fc-time-area " + theme.getClass('widgetContent') + "\"></td> </tr> </tbody> </table>";
+        };
+        TimelineView.prototype.render = function (props) {
+            _super.prototype.render.call(this, props); // flags for updateSize, addScroll
+            this.timeAxis.receiveProps({
+                dateProfile: props.dateProfile
+            });
+            this.lane.receiveProps(__assign({}, props, { nextDayThreshold: this.nextDayThreshold }));
+        };
+        TimelineView.prototype.updateSize = function (isResize, totalHeight, isAuto) {
+            this.timeAxis.updateSize(isResize, totalHeight, isAuto);
+            this.lane.updateSize(isResize);
+        };
+        // Now Indicator
+        // ------------------------------------------------------------------------------------------
+        TimelineView.prototype.getNowIndicatorUnit = function (dateProfile) {
+            return this.timeAxis.getNowIndicatorUnit(dateProfile);
+        };
+        TimelineView.prototype.renderNowIndicator = function (date) {
+            this.timeAxis.renderNowIndicator(date);
+        };
+        TimelineView.prototype.unrenderNowIndicator = function () {
+            this.timeAxis.unrenderNowIndicator();
+        };
+        // Scroll System
+        // ------------------------------------------------------------------------------------------
+        TimelineView.prototype.computeDateScroll = function (timeMs) {
+            return this.timeAxis.computeDateScroll(timeMs);
+        };
+        TimelineView.prototype.applyScroll = function (scroll, isResize) {
+            _super.prototype.applyScroll.call(this, scroll, isResize); // will call applyDateScroll
+            // avoid updating stickyscroll too often
+            // TODO: repeat code as ResourceTimelineView::updateSize
+            var calendar = this.calendar;
+            if (isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated) {
+                this.timeAxis.updateStickyScrollers();
+            }
+        };
+        TimelineView.prototype.applyDateScroll = function (scroll) {
+            this.timeAxis.applyDateScroll(scroll);
+        };
+        TimelineView.prototype.queryScroll = function () {
+            var enhancedScroll = this.timeAxis.layout.bodyScroller.enhancedScroll;
+            return {
+                top: enhancedScroll.getScrollTop(),
+                left: enhancedScroll.getScrollLeft()
+            };
+        };
+        // Hit System
+        // ------------------------------------------------------------------------------------------
+        TimelineView.prototype.buildPositionCaches = function () {
+            this.timeAxis.slats.updateSize();
+        };
+        TimelineView.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
+            var slatHit = this.timeAxis.slats.positionToHit(positionLeft);
+            if (slatHit) {
+                return {
+                    component: this,
+                    dateSpan: slatHit.dateSpan,
+                    rect: {
+                        left: slatHit.left,
+                        right: slatHit.right,
+                        top: 0,
+                        bottom: elHeight
+                    },
+                    dayEl: slatHit.dayEl,
+                    layer: 0
+                };
+            }
+        };
+        return TimelineView;
+    }(core.View));
+
+    var main = core.createPlugin({
+        defaultView: 'timelineDay',
+        views: {
+            timeline: {
+                class: TimelineView,
+                eventResizableFromStart: true // how is this consumed for TimelineView tho?
+            },
+            timelineDay: {
+                type: 'timeline',
+                duration: { days: 1 }
+            },
+            timelineWeek: {
+                type: 'timeline',
+                duration: { weeks: 1 }
+            },
+            timelineMonth: {
+                type: 'timeline',
+                duration: { months: 1 }
+            },
+            timelineYear: {
+                type: 'timeline',
+                duration: { years: 1 }
+            }
+        }
+    });
+
+    exports.HeaderBodyLayout = HeaderBodyLayout;
+    exports.ScrollJoiner = ScrollJoiner;
+    exports.StickyScroller = StickyScroller;
+    exports.TimeAxis = TimeAxis;
+    exports.TimelineLane = TimelineLane;
+    exports.TimelineView = TimelineView;
+    exports.default = main;
+
+    Object.defineProperty(exports, '__esModule', { value: true });
+
+}));
diff --git a/backoffice/vendors/fullcalendar/timeline/main.min.css b/backoffice/vendors/fullcalendar/timeline/main.min.css
new file mode 100644 (file)
index 0000000..e5c9d6a
--- /dev/null
@@ -0,0 +1,5 @@
+/*!
+FullCalendar Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/.fc-scroller-clip{overflow:hidden;position:relative}.fc-no-scrollbars{background:rgba(255,255,255,0)}.fc-no-scrollbars::-webkit-scrollbar{width:0;height:0}.fc-scroller-canvas{position:relative;box-sizing:border-box;min-height:100%}.fc-scroller-canvas>.fc-bg{z-index:1}.fc-scroller-canvas>.fc-content{z-index:2;position:relative;border-style:solid;border-width:0}.fc-scroller-canvas.fc-gutter-left>.fc-content{border-left-width:1px;margin-left:-1px}.fc-scroller-canvas.fc-gutter-right>.fc-content{border-right-width:1px;margin-right:-1px}.fc-scroller-canvas.fc-gutter-top>.fc-content{border-top-width:1px;margin-top:-1px}.fc-rtl .fc-timeline{direction:rtl}.fc-scrolled .fc-head .fc-scroller{z-index:2}.fc-timeline.fc-scrolled .fc-head .fc-scroller{box-shadow:0 3px 4px rgba(0,0,0,.075)}.fc-timeline .fc-body .fc-scroller{z-index:1}.fc-timeline .fc-scroller-canvas>div>div>table,.fc-timeline .fc-scroller-canvas>div>table{border-style:hidden}.fc-timeline .fc-scroller-canvas>.fc-content>.fc-rows>table{border-bottom-style:none}.fc-timeline td,.fc-timeline th{white-space:nowrap}.fc-timeline .fc-cell-content{overflow:hidden}.fc-timeline .fc-cell-text{display:inline-block;padding-left:4px;padding-right:4px}.fc-timeline th{vertical-align:middle}.fc-timeline .fc-head .fc-cell-content{padding-top:3px;padding-bottom:3px}.fc-timeline .fc-head .fc-time-area .fc-cell-content{overflow:visible}.fc-time-area col{min-width:2.2em}.fc-ltr .fc-time-area .fc-chrono th{text-align:left}.fc-rtl .fc-time-area .fc-chrono th{text-align:right}.fc-time-area .fc-slats{position:absolute;z-index:1;top:0;left:0;right:0;bottom:0}.fc-time-area .fc-slats table{height:100%}.fc-time-area .fc-slats .fc-minor{border-style:dotted}.fc-time-area .fc-slats td{border-width:0 1px}.fc-ltr .fc-time-area .fc-slats td{border-right-width:0}.fc-rtl .fc-time-area .fc-slats td{border-left-width:0}.fc-time-area .fc-bgevent-container,.fc-time-area .fc-highlight-container{position:absolute;z-index:2;top:0;bottom:0;width:0}.fc-ltr .fc-time-area .fc-bgevent-container,.fc-ltr .fc-time-area .fc-highlight-container,.fc-ltr .fc-time-area .fc-mirror-container{left:0}.fc-rtl .fc-time-area .fc-bgevent-container,.fc-rtl .fc-time-area .fc-highlight-container,.fc-rtl .fc-time-area .fc-mirror-container{right:0}.fc-time-area .fc-bgevent,.fc-time-area .fc-highlight{position:absolute;top:0;bottom:0}.fc-timeline .fc-now-indicator{z-index:3;top:0}.fc-time-area .fc-now-indicator-arrow{margin:0 -6px;border-width:6px 5px 0;border-left-color:transparent;border-right-color:transparent}.fc-time-area .fc-now-indicator-line{margin:0 -1px;bottom:0;border-left-width:1px}.fc-time-area .fc-event-container{position:relative;z-index:2;width:0}.fc-time-area .fc-mirror-container{position:absolute;z-index:3;top:0}.fc-time-area .fc-event-container{padding-bottom:8px;top:-1px}.fc-time-area tr:first-child .fc-event-container{top:0}.fc-no-overlap .fc-time-area .fc-event-container{padding-bottom:0;top:0}.fc-timeline-event{position:absolute;border-radius:0;padding:2px 0;margin-bottom:1px}.fc-no-overlap .fc-timeline-event{padding:5px 0;margin-bottom:0}.fc-ltr .fc-timeline-event{margin-right:1px}.fc-rtl .fc-timeline-event{margin-left:1px}.fc-timeline-event .fc-time{font-weight:700;padding:0 1px}.fc-rtl .fc-timeline-event .fc-time{display:inline-block}.fc-timeline-event .fc-title{padding:0 3px;display:inline-block;vertical-align:top;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;max-width:100%;white-space:nowrap;overflow:hidden}.fc-ltr .fc-timeline-event.fc-not-start .fc-content,.fc-rtl .fc-timeline-event.fc-not-end .fc-content{margin-left:8px}.fc-ltr .fc-timeline-event.fc-not-end .fc-content,.fc-rtl .fc-timeline-event.fc-not-start .fc-content{margin-right:8px}.fc-timeline-event.fc-not-end .fc-content:after,.fc-timeline-event.fc-not-start .fc-content:before{content:"";position:absolute;top:50%;margin-top:-5px;border:5px solid #000;border-top-color:transparent;border-bottom-color:transparent;opacity:.5}.fc-ltr .fc-timeline-event.fc-not-start .fc-content:before,.fc-rtl .fc-timeline-event.fc-not-end .fc-content:after{border-left:0;left:-6px}.fc-ltr .fc-timeline-event.fc-not-end .fc-content:after,.fc-rtl .fc-timeline-event.fc-not-start .fc-content:before{border-right:0;right:-6px}
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/timeline/main.min.js b/backoffice/vendors/fullcalendar/timeline/main.min.js
new file mode 100644 (file)
index 0000000..b63ebfc
--- /dev/null
@@ -0,0 +1,20 @@
+/*!
+FullCalendar Timeline Plugin v4.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2019 Adam Shaw
+*/
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):(e=e||self,t(e.FullCalendarTimeline={},e.FullCalendar))}(this,function(e,t){"use strict";function r(e,t){function r(){this.constructor=e}T(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}function n(){return z||(z=i())}function i(){var e=t.htmlToElement('<div style=" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; ">A</div>');document.body.appendChild(e);var r;return e.scrollLeft>0?r="positive":(e.scrollLeft=1,r=e.scrollLeft>0?"reverse":"negative"),t.removeElement(e),r}function o(e,r){var n=r.dateEnv,i={labelInterval:c(r,"slotLabelInterval"),slotDuration:c(r,"slotDuration")};d(i,e,n),h(i,e,n),u(i,e,n);var o=r.opt("slotLabelFormat"),s=Array.isArray(o)?o:null!=o?[o]:p(i,e,n,r);i.headerFormats=s.map(function(e){return t.createFormatter(e)}),i.isTimeScale=Boolean(i.slotDuration.milliseconds);var v=null;if(!i.isTimeScale){var y=t.greatestDurationDenominator(i.slotDuration).unit;/year|month|week/.test(y)&&(v=y)}i.largeUnit=v,i.emphasizeWeeks=t.isSingleDay(i.slotDuration)&&f("weeks",e,n)>=2&&!r.opt("businessHours");var S,b,E=r.opt("snapDuration");E&&(S=t.createDuration(E),b=t.wholeDivideDurations(i.slotDuration,S)),null==b&&(S=i.slotDuration,b=1),i.snapDuration=S,i.snapsPerSlot=b;var D=t.asRoughMs(e.maxTime)-t.asRoughMs(e.minTime),w=l(e.renderRange.start,i,n),C=l(e.renderRange.end,i,n);i.isTimeScale&&(w=n.add(w,e.minTime),C=n.add(t.addDays(C,-1),e.maxTime)),i.timeWindowMs=D,i.normalizedRange={start:w,end:C};for(var T=[],R=w;R<C;)a(R,i,e,r)&&T.push(R),R=n.add(R,i.slotDuration);i.slotDates=T;var x=-1,M=0,z=[],k=[];for(R=w;R<C;)a(R,i,e,r)?(x++,z.push(x),k.push(M)):z.push(x+.5),R=n.add(R,i.snapDuration),M++;return i.snapDiffToIndex=z,i.snapIndexToDiff=k,i.snapCnt=x+1,i.slotCnt=i.snapCnt/i.snapsPerSlot,i.isWeekStarts=g(i,n),i.cellRows=m(i,n,r),i}function l(e,r,n){var i=e;return r.isTimeScale||(i=t.startOfDay(i),r.largeUnit&&(i=n.startOf(i,r.largeUnit))),i}function s(e,r,n){if(!r.isTimeScale&&(e=t.computeVisibleDayRange(e),r.largeUnit)){var i=e;e={start:n.startOf(e.start,r.largeUnit),end:n.startOf(e.end,r.largeUnit)},(e.end.valueOf()!==i.end.valueOf()||e.end<=e.start)&&(e={start:e.start,end:n.add(e.end,r.slotDuration)})}return e}function a(e,r,n,i){if(i.dateProfileGenerator.isHiddenDay(e))return!1;if(r.isTimeScale){var o=t.startOfDay(e),l=e.valueOf()-o.valueOf(),s=l-t.asRoughMs(n.minTime);return s=(s%864e5+864e5)%864e5,s<r.timeWindowMs}return!0}function c(e,r){var n=e.opt(r);if(null!=n)return t.createDuration(n)}function d(e,r,n){var i=r.currentRange;if(e.labelInterval){var o=n.countDurationsBetween(i.start,i.end,e.labelInterval);o>t.config.MAX_TIMELINE_SLOTS&&(console.warn("slotLabelInterval results in too many cells"),e.labelInterval=null)}if(e.slotDuration){var l=n.countDurationsBetween(i.start,i.end,e.slotDuration);l>t.config.MAX_TIMELINE_SLOTS&&(console.warn("slotDuration results in too many cells"),e.slotDuration=null)}if(e.labelInterval&&e.slotDuration){var s=t.wholeDivideDurations(e.labelInterval,e.slotDuration);(null===s||s<1)&&(console.warn("slotLabelInterval must be a multiple of slotDuration"),e.slotDuration=null)}}function h(e,r,n){var i=r.currentRange,o=e.labelInterval;if(!o){var l=void 0;if(e.slotDuration){for(var s=0,a=O;s<a.length;s++){l=a[s];var c=t.createDuration(l),d=t.wholeDivideDurations(c,e.slotDuration);if(null!==d&&d<=A){o=c;break}}o||(o=e.slotDuration)}else for(var h=0,u=O;h<u.length;h++){l=u[h],o=t.createDuration(l);var p=n.countDurationsBetween(i.start,i.end,o);if(p>=W)break}e.labelInterval=o}return o}function u(e,r,n){var i=r.currentRange,o=e.slotDuration;if(!o){for(var l=h(e,r,n),s=0,a=O;s<a.length;s++){var c=a[s],d=t.createDuration(c),u=t.wholeDivideDurations(l,d);if(null!==u&&u>1&&u<=A){o=d;break}}if(o){var p=n.countDurationsBetween(i.start,i.end,o);p>B&&(o=null)}o||(o=l),e.slotDuration=o}return o}function p(e,r,n,i){var o,l,s=e.labelInterval,a=t.greatestDurationDenominator(s).unit,c=i.opt("weekNumbers"),d=o=l=null;switch("week"!==a||c||(a="day"),a){case"year":d={year:"numeric"};break;case"month":f("years",r,n)>1&&(d={year:"numeric"}),o={month:"short"};break;case"week":f("years",r,n)>1&&(d={year:"numeric"}),o={week:"narrow"};break;case"day":f("years",r,n)>1?d={year:"numeric",month:"long"}:f("months",r,n)>1&&(d={month:"long"}),c&&(o={week:"short"}),l={weekday:"narrow",day:"numeric"};break;case"hour":c&&(d={week:"short"}),f("days",r,n)>1&&(o={weekday:"short",day:"numeric",month:"numeric",omitCommas:!0}),l={hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"};break;case"minute":t.asRoughMinutes(s)/60>=A?(d={hour:"numeric",meridiem:"short"},o=function(e){return":"+t.padStart(e.date.minute,2)}):d={hour:"numeric",minute:"numeric",meridiem:"short"};break;case"second":t.asRoughSeconds(s)/60>=A?(d={hour:"numeric",minute:"2-digit",meridiem:"lowercase"},o=function(e){return":"+t.padStart(e.date.second,2)}):d={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"};break;case"millisecond":d={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"},o=function(e){return"."+t.padStart(e.millisecond,3)}}return[].concat(d||[],o||[],l||[])}function f(e,r,n){var i=r.currentRange,o=null;return"years"===e?o=n.diffWholeYears(i.start,i.end):"months"===e?o=n.diffWholeMonths(i.start,i.end):"weeks"===e?o=n.diffWholeMonths(i.start,i.end):"days"===e&&(o=t.diffWholeDays(i.start,i.end)),o||0}function g(e,t){for(var r=e.slotDates,n=e.emphasizeWeeks,i=null,o=[],l=0,s=r;l<s.length;l++){var a=s[l],c=t.computeWeekNumber(a),d=n&&null!==i&&i!==c;i=c,o.push(d)}return o}function m(e,r,n){for(var i=e.slotDates,o=e.headerFormats,l=o.map(function(e){return[]}),s=o.map(function(e){return e.getLargestUnit?e.getLargestUnit():null}),a=0;a<i.length;a++)for(var c=i[a],d=e.isWeekStarts[a],h=0;h<o.length;h++){var u=o[h],p=l[h],f=p[p.length-1],g=o.length>1&&h<o.length-1,m=null;if(g){var y=r.format(c,u);f&&f.text===y?f.colspan+=1:m=v(c,y,s[h],n)}else if(!f||t.isInt(r.countDurationsBetween(e.normalizedRange.start,c,e.labelInterval))){var y=r.format(c,u);m=v(c,y,s[h],n)}else f.colspan+=1;m&&(m.weekStart=d,p.push(m))}return l}function v(e,r,n,i){var o=t.buildGotoAnchorHtml(i,{date:e,type:n,forceOff:!n},{"class":"fc-cell-text"},t.htmlEscape(r));return{text:r,spanHtml:o,date:e,colspan:1,isWeekStart:!1}}function y(e,r,n){e.forEach(function(e,i){var o=r[i].naturalBound;t.applyStyle(e,{position:"relative",left:n[i].left-o.left,top:n[i].top-o.top})})}function S(e,r,n){e.forEach(function(e,i){var o=0;"center"===r[i].intendedTextAlign&&(o=(n-r[i].elWidth)/2,"center"===r[i].computedTextAlign&&(e.setAttribute("data-sticky-center",""),e.parentNode.style.textAlign="left")),t.applyStyle(e,{position:_,left:o,right:0,top:0})})}function b(){var e=t.htmlToElement('<div style="position:-webkit-sticky;position:sticky"></div>'),r=e.style.position;return r.indexOf("sticky")!==-1?r:null}function E(e){for(var t=0,r=0,n=e;r<n.length;r++){var i=n[r];t=Math.max(t,D(i))}return t}function D(e){return null==e.top&&(e.top=E(e.above)),e.top+e.height}function w(e,t){return e.left<t.right&&e.right>t.left}function C(e,t){var r=e.resourceEditable;if(null==r){var n=e.sourceId&&t.state.eventSources[e.sourceId];n&&(r=n.extendedProps.resourceEditable),null==r&&(r=t.opt("eventResourceEditable"),null==r&&(r=!0))}return r}/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation. All rights reserved.
+    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+    this file except in compliance with the License. You may obtain a copy of the
+    License at http://www.apache.org/licenses/LICENSE-2.0
+
+    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+    MERCHANTABLITY OR NON-INFRINGEMENT.
+
+    See the Apache Version 2.0 License for specific language governing permissions
+    and limitations under the License.
+    ***************************************************************************** */
+var T=function(e,t){return(T=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},R=function(){return R=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++){t=arguments[r];for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])}return e},R.apply(this,arguments)},x=function(){function e(){this.gutters={},this.el=t.htmlToElement('<div class="fc-scroller-canvas"> <div class="fc-content"></div> <div class="fc-bg"></div> </div>'),this.contentEl=this.el.querySelector(".fc-content"),this.bgEl=this.el.querySelector(".fc-bg")}return e.prototype.setGutters=function(e){e?R(this.gutters,e):this.gutters={},this.updateSize()},e.prototype.setWidth=function(e){this.width=e,this.updateSize()},e.prototype.setMinWidth=function(e){this.minWidth=e,this.updateSize()},e.prototype.clearWidth=function(){this.width=null,this.minWidth=null,this.updateSize()},e.prototype.updateSize=function(){var e=this,r=e.gutters,n=e.el;t.forceClassName(n,"fc-gutter-left",r.left),t.forceClassName(n,"fc-gutter-right",r.right),t.forceClassName(n,"fc-gutter-top",r.top),t.forceClassName(n,"fc-gutter-bottom",r.bottom),t.applyStyle(n,{paddingLeft:r.left||"",paddingRight:r.right||"",paddingTop:r.top||"",paddingBottom:r.bottom||"",width:null!=this.width?this.width+(r.left||0)+(r.right||0):"",minWidth:null!=this.minWidth?this.minWidth+(r.left||0)+(r.right||0):""}),t.applyStyle(this.bgEl,{left:r.left||"",right:r.right||"",top:r.top||"",bottom:r.bottom||""})},e}(),M=function(e){function i(r,n){var i=e.call(this,r,n)||this;return i.reportScroll=function(){i.isScrolling||i.reportScrollStart(),i.trigger("scroll"),i.isMoving=!0,i.requestMovingEnd()},i.reportScrollStart=function(){i.isScrolling||(i.isScrolling=!0,i.trigger("scrollStart",i.isTouching))},i.reportTouchStart=function(){i.isTouching=!0},i.reportTouchEnd=function(){i.isTouching&&(i.isTouching=!1,i.isTouchScrollEnabled&&i.unbindPreventTouchScroll(),i.isMoving||i.reportScrollEnd())},i.isScrolling=!1,i.isTouching=!1,i.isMoving=!1,i.isTouchScrollEnabled=!0,i.requestMovingEnd=t.debounce(i.reportMovingEnd,500),i.canvas=new x,i.el.appendChild(i.canvas.el),i.applyOverflow(),i.bindHandlers(),i}return r(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.unbindHandlers()},i.prototype.disableTouchScroll=function(){this.isTouchScrollEnabled=!1,this.bindPreventTouchScroll()},i.prototype.enableTouchScroll=function(){this.isTouchScrollEnabled=!0,this.isTouching||this.unbindPreventTouchScroll()},i.prototype.bindPreventTouchScroll=function(){this.preventTouchScrollHandler||this.el.addEventListener("touchmove",this.preventTouchScrollHandler=t.preventDefault)},i.prototype.unbindPreventTouchScroll=function(){this.preventTouchScrollHandler&&(this.el.removeEventListener("touchmove",this.preventTouchScrollHandler),this.preventTouchScrollHandler=null)},i.prototype.bindHandlers=function(){this.el.addEventListener("scroll",this.reportScroll),this.el.addEventListener("touchstart",this.reportTouchStart,{passive:!0}),this.el.addEventListener("touchend",this.reportTouchEnd)},i.prototype.unbindHandlers=function(){this.el.removeEventListener("scroll",this.reportScroll),this.el.removeEventListener("touchstart",this.reportTouchStart,{passive:!0}),this.el.removeEventListener("touchend",this.reportTouchEnd)},i.prototype.reportMovingEnd=function(){this.isMoving=!1,this.isTouching||this.reportScrollEnd()},i.prototype.reportScrollEnd=function(){this.isScrolling&&(this.trigger("scrollEnd"),this.isScrolling=!1)},i.prototype.getScrollLeft=function(){var e=this.el,t=window.getComputedStyle(e).direction,r=e.scrollLeft;if("rtl"===t)switch(n()){case"positive":r=r+e.clientWidth-e.scrollWidth;break;case"reverse":r=-r}return r},i.prototype.setScrollLeft=function(e){var t=this.el,r=window.getComputedStyle(t).direction;if("rtl"===r)switch(n()){case"positive":e=e-t.clientWidth+t.scrollWidth;break;case"reverse":e=-e}t.scrollLeft=e},i.prototype.getScrollFromLeft=function(){var e=this.el,t=window.getComputedStyle(e).direction,r=e.scrollLeft;if("rtl"===t)switch(n()){case"negative":r=r-e.clientWidth+e.scrollWidth;break;case"reverse":r=-r-e.clientWidth+e.scrollWidth}return r},i}(t.ScrollComponent);t.EmitterMixin.mixInto(M);var z,k=function(){function e(e,r,n){this.isHScrollbarsClipped=!1,this.isVScrollbarsClipped=!1,"clipped-scroll"===e&&(e="scroll",this.isHScrollbarsClipped=!0),"clipped-scroll"===r&&(r="scroll",this.isVScrollbarsClipped=!0),this.enhancedScroll=new M(e,r),n.appendChild(this.el=t.createElement("div",{className:"fc-scroller-clip"})),this.el.appendChild(this.enhancedScroll.el)}return e.prototype.destroy=function(){t.removeElement(this.el)},e.prototype.updateSize=function(){var e=this.enhancedScroll,r=e.el,n=t.computeEdges(r),i={marginLeft:0,marginRight:0,marginTop:0,marginBottom:0};this.isVScrollbarsClipped&&(i.marginLeft=-n.scrollbarLeft,i.marginRight=-n.scrollbarRight),this.isHScrollbarsClipped&&(i.marginBottom=-n.scrollbarBottom),t.applyStyle(r,i),!this.isHScrollbarsClipped&&"hidden"!==e.overflowX||!this.isVScrollbarsClipped&&"hidden"!==e.overflowY||n.scrollbarLeft||n.scrollbarRight||n.scrollbarBottom?r.classList.remove("fc-no-scrollbars"):r.classList.add("fc-no-scrollbars")},e.prototype.setHeight=function(e){this.enhancedScroll.setHeight(e)},e.prototype.getScrollbarWidths=function(){var e=this.enhancedScroll.getScrollbarWidths();return this.isVScrollbarsClipped&&(e.left=0,e.right=0),this.isHScrollbarsClipped&&(e.bottom=0),e},e}(),I=function(){function e(e,t){this.axis=e,this.scrollers=t;for(var r=0,n=this.scrollers;r<n.length;r++){var i=n[r];this.initScroller(i)}}return e.prototype.initScroller=function(e){var t=this,r=e.enhancedScroll,n=function(){t.assignMasterScroller(e)};"wheel mousewheel DomMouseScroll MozMousePixelScroll".split(" ").forEach(function(e){r.el.addEventListener(e,n)}),r.on("scrollStart",function(){t.masterScroller||t.assignMasterScroller(e)}).on("scroll",function(){if(e===t.masterScroller)for(var n=0,i=t.scrollers;n<i.length;n++){var o=i[n];if(o!==e)switch(t.axis){case"horizontal":o.enhancedScroll.el.scrollLeft=r.el.scrollLeft;break;case"vertical":o.enhancedScroll.setScrollTop(r.getScrollTop())}}}).on("scrollEnd",function(){e===t.masterScroller&&t.unassignMasterScroller()})},e.prototype.assignMasterScroller=function(e){this.unassignMasterScroller(),this.masterScroller=e;for(var t=0,r=this.scrollers;t<r.length;t++){var n=r[t];n!==e&&n.enhancedScroll.disableTouchScroll()}},e.prototype.unassignMasterScroller=function(){if(this.masterScroller){for(var e=0,t=this.scrollers;e<t.length;e++){var r=t[e];r.enhancedScroll.enableTouchScroll()}this.masterScroller=null}},e.prototype.update=function(){for(var e,t,r=this.scrollers.map(function(e){return e.getScrollbarWidths()}),n=0,i=0,o=0,l=0,s=0,a=r;s<a.length;s++)e=a[s],n=Math.max(n,e.left),i=Math.max(i,e.right),o=Math.max(o,e.top),l=Math.max(l,e.bottom);for(t=0;t<this.scrollers.length;t++){var c=this.scrollers[t];e=r[t],c.enhancedScroll.canvas.setGutters("horizontal"===this.axis?{left:n-e.left,right:i-e.right}:{top:o-e.top,bottom:l-e.bottom})}},e}(),P=function(){function e(e,t,r){this.headerScroller=new k("clipped-scroll","hidden",e),this.bodyScroller=new k("auto",r,t),this.scrollJoiner=new I("horizontal",[this.headerScroller,this.bodyScroller])}return e.prototype.destroy=function(){this.headerScroller.destroy(),this.bodyScroller.destroy()},e.prototype.setHeight=function(e,t){var r;r=t?"auto":e-this.queryHeadHeight(),this.bodyScroller.setHeight(r),this.headerScroller.updateSize(),this.bodyScroller.updateSize(),this.scrollJoiner.update()},e.prototype.queryHeadHeight=function(){return this.headerScroller.enhancedScroll.canvas.contentEl.offsetHeight},e}(),H=function(e){function n(r,n){var i=e.call(this,r)||this;return n.appendChild(i.tableEl=t.createElement("table",{className:i.theme.getClass("tableGrid")})),i}return r(n,e),n.prototype.destroy=function(){t.removeElement(this.tableEl),e.prototype.destroy.call(this)},n.prototype.render=function(e){this.renderDates(e.tDateProfile)},n.prototype.renderDates=function(e){for(var r=this,n=r.dateEnv,i=r.theme,o=e.cellRows,l=o[o.length-1],s=t.asRoughMs(e.labelInterval)>t.asRoughMs(e.slotDuration),a=t.isSingleDay(e.slotDuration),c="<colgroup>",d=e.slotCnt-1;d>=0;d--)c+="<col/>";c+="</colgroup>",c+="<tbody>";for(var h=0,u=o;h<u.length;h++){var p=u[h],f=p===l;c+="<tr"+(s&&f?' class="fc-chrono"':"")+">";for(var g=0,m=p;g<m.length;g++){var v=m[g],y=[i.getClass("widgetHeader")];v.isWeekStart&&y.push("fc-em-cell"),a&&(y=y.concat(t.getDayClasses(v.date,this.props.dateProfile,this.context,!0))),c+='<th class="'+y.join(" ")+'" data-date="'+n.formatIso(v.date,{omitTime:!e.isTimeScale,omitTimeZoneOffset:!0})+'"'+(v.colspan>1?' colspan="'+v.colspan+'"':"")+'><div class="fc-cell-content">'+v.spanHtml+"</div></th>"}c+="</tr>"}c+="</tbody>",this.tableEl.innerHTML=c,this.slatColEls=t.findElements(this.tableEl,"col"),this.innerEls=t.findElements(this.tableEl.querySelector("tr:last-child"),"th .fc-cell-text"),t.findElements(this.tableEl.querySelectorAll("tr:not(:last-child)"),"th .fc-cell-text").forEach(function(e){e.classList.add("fc-sticky")})},n}(t.Component),L=function(e){function n(r,n){var i=e.call(this,r)||this;return n.appendChild(i.el=t.createElement("div",{className:"fc-slats"})),i}return r(n,e),n.prototype.destroy=function(){t.removeElement(this.el),e.prototype.destroy.call(this)},n.prototype.render=function(e){this.renderDates(e.tDateProfile)},n.prototype.renderDates=function(e){for(var r=this,n=r.theme,i=r.view,o=r.dateEnv,l=e.slotDates,s=e.isWeekStarts,a='<table class="'+n.getClass("tableGrid")+'"><colgroup>',c=0;c<l.length;c++)a+="<col/>";a+="</colgroup>",a+="<tbody><tr>";for(var c=0;c<l.length;c++)a+=this.slatCellHtml(l[c],s[c],e);a+="</tr></tbody></table>",this.el.innerHTML=a,this.slatColEls=t.findElements(this.el,"col"),this.slatEls=t.findElements(this.el,"td");for(var c=0;c<l.length;c++)i.publiclyTrigger("dayRender",[{date:o.toDate(l[c]),el:this.slatEls[c],view:i}]);this.outerCoordCache=new t.PositionCache(this.el,this.slatEls,(!0),(!1)),this.innerCoordCache=new t.PositionCache(this.el,t.findChildren(this.slatEls,"div"),(!0),(!1))},n.prototype.slatCellHtml=function(e,r,n){var i,o=this,l=o.theme,s=o.dateEnv;return n.isTimeScale?(i=[],i.push(t.isInt(s.countDurationsBetween(n.normalizedRange.start,e,n.labelInterval))?"fc-major":"fc-minor")):(i=t.getDayClasses(e,this.props.dateProfile,this.context),i.push("fc-day")),i.unshift(l.getClass("widgetContent")),r&&i.push("fc-em-cell"),'<td class="'+i.join(" ")+'" data-date="'+s.formatIso(e,{omitTime:!n.isTimeScale,omitTimeZoneOffset:!0})+'"><div></div></td>'},n.prototype.updateSize=function(){this.outerCoordCache.build(),this.innerCoordCache.build()},n.prototype.positionToHit=function(e){var r=this.outerCoordCache,n=this.props.tDateProfile,i=r.leftToIndex(e);if(null!=i){var o=r.getWidth(i),l=this.isRtl?(r.rights[i]-e)/o:(e-r.lefts[i])/o,s=Math.floor(l*n.snapsPerSlot),a=this.dateEnv.add(n.slotDates[i],t.multiplyDuration(n.snapDuration,s)),c=this.dateEnv.add(a,n.snapDuration);return{dateSpan:{range:{start:a,end:c},allDay:!this.props.tDateProfile.isTimeScale},dayEl:this.slatColEls[i],left:r.lefts[i],right:r.rights[i]}}return null},n}(t.Component),W=18,A=6,B=200;t.config.MAX_TIMELINE_SLOTS=1e3;var O=[{years:1},{months:1},{days:1},{hours:1},{minutes:30},{minutes:15},{minutes:10},{minutes:5},{minutes:1},{seconds:30},{seconds:15},{seconds:10},{seconds:5},{seconds:1},{milliseconds:500},{milliseconds:100},{milliseconds:10},{milliseconds:1}],N=function(){function e(e,t){this.headParent=e,this.bodyParent=t}return e.prototype.render=function(e,r){var n=r?{right:-e}:{left:e};this.headParent.appendChild(this.arrowEl=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-arrow",style:n})),this.bodyParent.appendChild(this.lineEl=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-line",style:n}))},e.prototype.unrender=function(){this.arrowEl&&t.removeElement(this.arrowEl),this.lineEl&&t.removeElement(this.lineEl)},e}(),_=b(),F=/Edge/.test(navigator.userAgent),q="-webkit-sticky"===_,U="fc-sticky",j=function(){function e(e,t,r){var n=this;this.usingRelative=null,this.updateSize=function(){var e=Array.prototype.slice.call(n.scroller.canvas.el.querySelectorAll("."+U)),t=n.queryElGeoms(e),r=n.scroller.el.clientWidth;if(n.usingRelative){var i=n.computeElDestinations(t,r);y(e,t,i)}else S(e,t,r)},this.scroller=e,this.usingRelative=!_||F&&t||(F||q)&&r,this.usingRelative&&e.on("scrollEnd",this.updateSize)}return e.prototype.destroy=function(){this.scroller.off("scrollEnd",this.updateSize)},e.prototype.queryElGeoms=function(e){for(var r=this.scroller.canvas.el.getBoundingClientRect(),n=[],i=0,o=e;i<o.length;i++){var l=o[i],s=t.translateRect(l.parentNode.getBoundingClientRect(),-r.left,-r.top),a=l.getBoundingClientRect(),c=window.getComputedStyle(l),d=window.getComputedStyle(l.parentNode).textAlign,h=d,u=null;"sticky"!==c.position&&(u=t.translateRect(a,-r.left-(parseFloat(c.left)||0),-r.top-(parseFloat(c.top)||0))),l.hasAttribute("data-sticky-center")&&(h="center"),n.push({parentBound:s,naturalBound:u,elWidth:a.width,elHeight:a.height,computedTextAlign:d,intendedTextAlign:h})}return n},e.prototype.computeElDestinations=function(e,t){var r=this.scroller.getScrollFromLeft(),n=this.scroller.getScrollTop(),i=r+t;return e.map(function(e){var t,o,l=e.elWidth,s=e.elHeight,a=e.parentBound,c=e.naturalBound;switch(e.intendedTextAlign){case"left":t=r;break;case"right":t=i-l;break;case"center":t=(r+i)/2-l/2}return t=Math.min(t,a.right-l),t=Math.max(t,a.left),o=n,o=Math.min(o,a.bottom-s),o=Math.max(o,c.top),{left:t,top:o}})},e}(),V=function(e){function n(t,r,n){var i=e.call(this,t)||this,o=i.layout=new P(r,n,"auto"),l=o.headerScroller.enhancedScroll,s=o.bodyScroller.enhancedScroll;return i.headStickyScroller=new j(l,i.isRtl,(!1)),i.bodyStickyScroller=new j(s,i.isRtl,(!1)),i.header=new H(t,l.canvas.contentEl),i.slats=new L(t,s.canvas.bgEl),i.nowIndicator=new N(l.canvas.el,s.canvas.el),i}return r(n,e),n.prototype.destroy=function(){this.layout.destroy(),this.header.destroy(),this.slats.destroy(),this.nowIndicator.unrender(),this.headStickyScroller.destroy(),this.bodyStickyScroller.destroy(),e.prototype.destroy.call(this)},n.prototype.render=function(e){var t=this.tDateProfile=o(e.dateProfile,this.view);this.header.receiveProps({dateProfile:e.dateProfile,tDateProfile:t}),this.slats.receiveProps({dateProfile:e.dateProfile,tDateProfile:t})},n.prototype.getNowIndicatorUnit=function(e){var r=this.tDateProfile=o(e,this.view);if(r.isTimeScale)return t.greatestDurationDenominator(r.slotDuration).unit},n.prototype.renderNowIndicator=function(e){t.rangeContainsMarker(this.tDateProfile.normalizedRange,e)&&this.nowIndicator.render(this.dateToCoord(e),this.isRtl)},n.prototype.unrenderNowIndicator=function(){this.nowIndicator.unrender()},n.prototype.updateSize=function(e,t,r){this.applySlotWidth(this.computeSlotWidth()),this.layout.setHeight(t,r),this.slats.updateSize()},n.prototype.updateStickyScrollers=function(){this.headStickyScroller.updateSize(),this.bodyStickyScroller.updateSize()},n.prototype.computeSlotWidth=function(){var e=this.opt("slotWidth")||"";return""===e&&(e=this.computeDefaultSlotWidth(this.tDateProfile)),e},n.prototype.computeDefaultSlotWidth=function(e){var r=0;this.header.innerEls.forEach(function(e,t){r=Math.max(r,e.getBoundingClientRect().width)});var n=Math.ceil(r)+1,i=t.wholeDivideDurations(e.labelInterval,e.slotDuration),o=Math.ceil(n/i),l=window.getComputedStyle(this.header.slatColEls[0]).minWidth;return l&&(l=parseInt(l,10),l&&(o=Math.max(o,l))),o},n.prototype.applySlotWidth=function(e){var t=this,r=t.layout,n=t.tDateProfile,i="",o="",l="";if(""!==e){e=Math.round(e),i=e*n.slotDates.length,o="",l=e;var s=r.bodyScroller.enhancedScroll.getClientWidth();s>i&&(o=s,i="",l=Math.floor(s/n.slotDates.length))}r.headerScroller.enhancedScroll.canvas.setWidth(i),r.headerScroller.enhancedScroll.canvas.setMinWidth(o),r.bodyScroller.enhancedScroll.canvas.setWidth(i),r.bodyScroller.enhancedScroll.canvas.setMinWidth(o),""!==l&&this.header.slatColEls.slice(0,-1).concat(this.slats.slatColEls.slice(0,-1)).forEach(function(e){e.style.width=l+"px"})},n.prototype.computeDateSnapCoverage=function(e){var r=this,n=r.dateEnv,i=r.tDateProfile,o=n.countDurationsBetween(i.normalizedRange.start,e,i.snapDuration);if(o<0)return 0;if(o>=i.snapDiffToIndex.length)return i.snapCnt;var l=Math.floor(o),s=i.snapDiffToIndex[l];return t.isInt(s)?s+=o-l:s=Math.ceil(s),s},n.prototype.dateToCoord=function(e){var t=this.tDateProfile,r=this.computeDateSnapCoverage(e),n=r/t.snapsPerSlot,i=Math.floor(n);i=Math.min(i,t.slotCnt-1);var o=n-i,l=this.slats,s=l.innerCoordCache,a=l.outerCoordCache;return this.isRtl?a.rights[i]-s.getWidth(i)*o-a.originClientRect.width:a.lefts[i]+s.getWidth(i)*o},n.prototype.rangeToCoords=function(e){return this.isRtl?{right:this.dateToCoord(e.start),left:this.dateToCoord(e.end)}:{left:this.dateToCoord(e.start),right:this.dateToCoord(e.end)}},n.prototype.computeDateScroll=function(e){var r=this.dateEnv,n=this.props.dateProfile,i=0;return n&&(i=this.dateToCoord(r.add(t.startOfDay(n.activeRange.start),t.createDuration(e))),!this.isRtl&&i&&(i+=1)),{left:i}},n.prototype.queryDateScroll=function(){var e=this.layout.bodyScroller.enhancedScroll;return{left:e.getScrollLeft()}},n.prototype.applyDateScroll=function(e){this.layout.bodyScroller.enhancedScroll.setScrollLeft(e.left||0),this.layout.headerScroller.enhancedScroll.setScrollLeft(e.left||0)},n}(t.Component),G=function(e){function n(t,r,n){var i=e.call(this,t)||this;return i.masterContainerEl=r,i.timeAxis=n,i}return r(n,e),n.prototype.renderSegHtml=function(e,r){var n=e.eventRange,i=n.def,o=n.ui,l=o.startEditable||C(i,this.timeAxis.calendar),s=e.isStart&&o.durationEditable&&this.context.options.eventResizableFromStart,a=e.isEnd&&o.durationEditable,c=this.getSegClasses(e,l,s||a,r);c.unshift("fc-timeline-event","fc-h-event");var d=this.getTimeText(n);return'<a class="'+c.join(" ")+'" style="'+t.cssToStr(this.getSkinCss(o))+'"'+(i.url?' href="'+t.htmlEscape(i.url)+'"':"")+'><div class="fc-content">'+(d?'<span class="fc-time">'+t.htmlEscape(d)+"</span>":"")+'<span class="fc-title fc-sticky">'+(i.title?t.htmlEscape(i.title):"&nbsp;")+"</span></div>"+(s?'<div class="fc-resizer fc-start-resizer"></div>':"")+(a?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},n.prototype.computeDisplayEventTime=function(){return!this.timeAxis.tDateProfile.isTimeScale},n.prototype.computeDisplayEventEnd=function(){return!1},n.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},n.prototype.attachSegs=function(e,r){if(!this.el&&this.masterContainerEl&&(this.el=t.createElement("div",{className:"fc-event-container"}),r&&this.el.classList.add("fc-mirror-container"),this.masterContainerEl.appendChild(this.el)),this.el)for(var n=0,i=e;n<i.length;n++){var o=i[n];this.el.appendChild(o.el)}},n.prototype.detachSegs=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.removeElement(i.el)}},n.prototype.computeSegSizes=function(e){for(var r=this.timeAxis,n=0,i=e;n<i.length;n++){var o=i[n],l=r.rangeToCoords(o);t.applyStyle(o.el,{left:o.left=l.left,right:-(o.right=l.right)})}},n.prototype.assignSegSizes=function(e){if(this.el){for(var r=0,n=e;r<n.length;r++){var i=n[r];i.height=t.computeHeightAndMargins(i.el)}this.buildSegLevels(e);var o=E(e);t.applyStyleProp(this.el,"height",o);for(var l=0,s=e;l<s.length;l++){var i=s[l];t.applyStyleProp(i.el,"top",i.top)}}},n.prototype.buildSegLevels=function(e){var t=[];e=this.sortEventSegs(e);for(var r=0,n=e;r<n.length;r++){var i=n[r];i.above=[];for(var o=0;o<t.length;){for(var l=!1,s=0,a=t[o];s<a.length;s++){var c=a[s];w(i,c)&&(i.above.push(c),l=!0)}if(!l)break;o+=1}for((t[o]||(t[o]=[])).push(i),o+=1;o<t.length;){for(var d=0,h=t[o];d<h.length;d++){var u=h[d];w(i,u)&&u.above.push(i)}o+=1}}return t},n}(t.FgEventRenderer),X=function(e){function n(t,r,n){var i=e.call(this,t)||this;return i.masterContainerEl=r,i.timeAxis=n,i}return r(n,e),n.prototype.attachSegs=function(e,r){if(r.length){var n=void 0;n="businessHours"===e?"bgevent":e.toLowerCase();var i=t.createElement("div",{className:"fc-"+n+"-container"});this.masterContainerEl.appendChild(i);for(var o=0,l=r;o<l.length;o++){var s=l[o];i.appendChild(s.el)}return[i]}},n.prototype.computeSegSizes=function(e){for(var t=this.timeAxis,r=0,n=e;r<n.length;r++){var i=n[r],o=t.rangeToCoords(i);i.left=o.left,i.right=o.right}},n.prototype.assignSegSizes=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.applyStyle(i.el,{left:i.left,right:-i.right})}},n}(t.FillRenderer),Z=function(e){function n(r,n,i,o){var l=e.call(this,r,i)||this;l.slicer=new J,l.renderEventDrag=t.memoizeRendering(l._renderEventDrag,l._unrenderEventDrag),l.renderEventResize=t.memoizeRendering(l._renderEventResize,l._unrenderEventResize);var s=l.fillRenderer=new X(r,i,o),a=l.eventRenderer=new G(r,n,o);return l.mirrorRenderer=new G(r,n,o),l.renderBusinessHours=t.memoizeRendering(s.renderSegs.bind(s,"businessHours"),s.unrender.bind(s,"businessHours")),l.renderDateSelection=t.memoizeRendering(s.renderSegs.bind(s,"highlight"),s.unrender.bind(s,"highlight")),l.renderBgEvents=t.memoizeRendering(s.renderSegs.bind(s,"bgEvent"),s.unrender.bind(s,"bgEvent")),l.renderFgEvents=t.memoizeRendering(a.renderSegs.bind(a),a.unrender.bind(a)),l.renderEventSelection=t.memoizeRendering(a.selectByInstanceId.bind(a),a.unselectByInstanceId.bind(a),[l.renderFgEvents]),l.timeAxis=o,l}return r(n,e),n.prototype.render=function(e){var t=this.slicer.sliceProps(e,e.dateProfile,this.timeAxis.tDateProfile.isTimeScale?null:e.nextDayThreshold,this,this.timeAxis);this.renderBusinessHours(t.businessHourSegs),this.renderDateSelection(t.dateSelectionSegs),this.renderBgEvents(t.bgEventSegs),this.renderFgEvents(t.fgEventSegs),this.renderEventSelection(t.eventSelection),this.renderEventDrag(t.eventDrag),this.renderEventResize(t.eventResize)},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderBusinessHours.unrender(),this.renderDateSelection.unrender(),this.renderBgEvents.unrender(),this.renderFgEvents.unrender(),this.renderEventSelection.unrender(),this.renderEventDrag.unrender(),this.renderEventResize.unrender()},n.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.mirrorRenderer.renderSegs(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}))},n.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}))},n.prototype._renderEventResize=function(e){if(e){var t=e.segs.map(function(e){return R({},e)});this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",t),this.mirrorRenderer.renderSegs(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg})}},n.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"),this.mirrorRenderer.unrender(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}))},n.prototype.updateSize=function(e){var t=this,r=t.fillRenderer,n=t.eventRenderer,i=t.mirrorRenderer;r.computeSizes(e),n.computeSizes(e),i.computeSizes(e),r.assignSizes(e),n.assignSizes(e),i.assignSizes(e)},n}(t.DateComponent),J=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return r(n,e),n.prototype.sliceRange=function(e,r){var n=r.tDateProfile,i=r.props.dateProfile,o=s(e,n,r.dateEnv),l=[];if(r.computeDateSnapCoverage(o.start)<r.computeDateSnapCoverage(o.end)){var c=t.intersectRanges(o,n.normalizedRange);c&&l.push({start:c.start,end:c.end,isStart:c.start.valueOf()===o.start.valueOf()&&a(c.start,n,i,r.view),isEnd:c.end.valueOf()===o.end.valueOf()&&a(t.addMs(c.end,-1),n,i,r.view)})}return l},n}(t.Slicer),Y=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n,i)||this;return o.el.classList.add("fc-timeline"),o.opt("eventOverlap")===!1&&o.el.classList.add("fc-no-overlap"),o.el.innerHTML=o.renderSkeletonHtml(),o.timeAxis=new V(o.context,o.el.querySelector("thead .fc-time-area"),o.el.querySelector("tbody .fc-time-area")),o.lane=new Z(o.context,o.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl,o.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl,o.timeAxis),t.calendar.registerInteractiveComponent(o,{el:o.timeAxis.slats.el}),o}return r(t,e),t.prototype.destroy=function(){this.timeAxis.destroy(),this.lane.destroy(),e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},t.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'"> <thead class="fc-head"> <tr> <td class="fc-time-area '+e.getClass("widgetHeader")+'"></td> </tr> </thead> <tbody class="fc-body"> <tr> <td class="fc-time-area '+e.getClass("widgetContent")+'"></td> </tr> </tbody> </table>'},t.prototype.render=function(t){e.prototype.render.call(this,t),this.timeAxis.receiveProps({dateProfile:t.dateProfile}),this.lane.receiveProps(R({},t,{nextDayThreshold:this.nextDayThreshold}))},t.prototype.updateSize=function(e,t,r){this.timeAxis.updateSize(e,t,r),this.lane.updateSize(e)},t.prototype.getNowIndicatorUnit=function(e){return this.timeAxis.getNowIndicatorUnit(e)},t.prototype.renderNowIndicator=function(e){this.timeAxis.renderNowIndicator(e)},t.prototype.unrenderNowIndicator=function(){this.timeAxis.unrenderNowIndicator()},t.prototype.computeDateScroll=function(e){return this.timeAxis.computeDateScroll(e)},t.prototype.applyScroll=function(t,r){e.prototype.applyScroll.call(this,t,r);var n=this.calendar;(r||n.isViewUpdated||n.isDatesUpdated||n.isEventsUpdated)&&this.timeAxis.updateStickyScrollers()},t.prototype.applyDateScroll=function(e){this.timeAxis.applyDateScroll(e)},t.prototype.queryScroll=function(){var e=this.timeAxis.layout.bodyScroller.enhancedScroll;return{top:e.getScrollTop(),left:e.getScrollLeft()}},t.prototype.buildPositionCaches=function(){this.timeAxis.slats.updateSize()},t.prototype.queryHit=function(e,t,r,n){var i=this.timeAxis.slats.positionToHit(e);if(i)return{component:this,dateSpan:i.dateSpan,rect:{left:i.left,right:i.right,top:0,bottom:n},dayEl:i.dayEl,layer:0}},t}(t.View),K=t.createPlugin({defaultView:"timelineDay",views:{timeline:{"class":Y,eventResizableFromStart:!0},timelineDay:{type:"timeline",duration:{days:1}},timelineWeek:{type:"timeline",duration:{weeks:1}},timelineMonth:{type:"timeline",duration:{months:1}},timelineYear:{type:"timeline",duration:{years:1}}}});e.HeaderBodyLayout=P,e.ScrollJoiner=I,e.StickyScroller=j,e.TimeAxis=V,e.TimelineLane=Z,e.TimelineView=Y,e["default"]=K,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/backoffice/vendors/fullcalendar/timeline/package.json b/backoffice/vendors/fullcalendar/timeline/package.json
new file mode 100644 (file)
index 0000000..9d6c528
--- /dev/null
@@ -0,0 +1,57 @@
+{
+  "_from": "@fullcalendar/timeline",
+  "_id": "@fullcalendar/timeline@4.1.0",
+  "_inBundle": false,
+  "_integrity": "sha512-GS3ocCuK8dvM+cbsBtqhEOnUl1u0/FO8b8wpgH+kxT8K4bkPoOTyRRqeX4oZKkNSxZReFHOfYfTUVHpwhhSEGQ==",
+  "_location": "/@fullcalendar/timeline",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "tag",
+    "registry": true,
+    "raw": "@fullcalendar/timeline",
+    "name": "@fullcalendar/timeline",
+    "escapedName": "@fullcalendar%2ftimeline",
+    "scope": "@fullcalendar",
+    "rawSpec": "",
+    "saveSpec": null,
+    "fetchSpec": "latest"
+  },
+  "_requiredBy": [
+    "#USER",
+    "/"
+  ],
+  "_resolved": "https://registry.npmjs.org/@fullcalendar/timeline/-/timeline-4.1.0.tgz",
+  "_shasum": "e85f43ff56b1c238b844e89e56d926cda367ee21",
+  "_spec": "@fullcalendar/timeline",
+  "_where": "C:\\Users\\ksaff\\Workspace\\Websites\\fullcalendar",
+  "author": {
+    "name": "Adam Shaw",
+    "email": "arshaw@arshaw.com",
+    "url": "http://arshaw.com/"
+  },
+  "bugs": {
+    "url": "https://github.com/fullcalendar/fullcalendar-scheduler/issues"
+  },
+  "bundleDependencies": false,
+  "copyright": "2019 Adam Shaw",
+  "deprecated": false,
+  "description": "Display events on a horizontal time axis (without resources)",
+  "docs": "https://fullcalendar.io/docs/timeline-view-no-resources",
+  "homepage": "https://fullcalendar.io/scheduler",
+  "license": "SEE LICENSE IN LICENSE.md",
+  "main": "main.js",
+  "name": "@fullcalendar/timeline",
+  "peerDependencies": {
+    "@fullcalendar/core": "~4.1.0"
+  },
+  "releaseDate": "2019-04-24",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/fullcalendar/fullcalendar-scheduler.git",
+    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
+  },
+  "title": "FullCalendar Timeline Plugin",
+  "types": "main.d.ts",
+  "unpkg": "main.min.js",
+  "version": "4.1.0"
+}
index 4fd085d..b92849b 100644 (file)
--- a/index.cgi
+++ b/index.cgi
@@ -2,8 +2,7 @@
 
 use strict;
 use File::Basename qw/dirname basename/;
-use lib ('./lib');
-use lib ('./api/lib');
+use lib ('./backoffice/api/lib');
 
 use Template;
 use CGI;