diff --git a/.gitignore b/.gitignore index 587791b56..8612f5e05 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ test/demo.hforge.org/ *.xhtml.ca *.xhtml.nl_BE ikaaro/ui_dev/aruni/node_modules/ +.idea diff --git a/CREDITS.txt b/ikaaro/CREDITS.txt similarity index 100% rename from CREDITS.txt rename to ikaaro/CREDITS.txt diff --git a/ikaaro/__init__.py b/ikaaro/__init__.py index dcbb6ee34..d1f4350ef 100644 --- a/ikaaro/__init__.py +++ b/ikaaro/__init__.py @@ -26,11 +26,14 @@ from itools.gettext import register_domain # Import from ikaaro -from file import File -from folder import Folder -from registry import register_document_type -import text -from webpage import WebPage +# Add class to register +from .root import Root +from .file import File +from .folder import Folder +from .registry import register_document_type +from . import text +from .webpage import WebPage + getLogger("ikaaro").addHandler(NullHandler()) getLogger("ikaaro.web").addHandler(NullHandler()) @@ -56,7 +59,7 @@ # Import required modules -import users +from . import users # Register the itools domain path = get_abspath('locale') diff --git a/ikaaro/api/urls.py b/ikaaro/api/urls.py index 8df338ba1..8317d9236 100644 --- a/ikaaro/api/urls.py +++ b/ikaaro/api/urls.py @@ -18,13 +18,13 @@ from ikaaro.urls import urlpattern # Import from here -from views import Api_DocView, ApiStatus_View -from views import Api_LoginView -from views import ApiDevPanel_ResourceJSON, ApiDevPanel_ResourceRaw, ApiDevPanel_ResourceHistory -from views import ApiDevPanel_ClassidViewDetails, ApiDevPanel_ClassidViewList -from views import ApiDevPanel_Config, ApiDevPanel_Log -from views import ApiDevPanel_CatalogReindex, UUIDView -from views import ApiDevPanel_ServerView, ApiDevPanel_ServerStop +from .views import Api_DocView, ApiStatus_View +from .views import Api_LoginView +from .views import ApiDevPanel_ResourceJSON, ApiDevPanel_ResourceRaw, ApiDevPanel_ResourceHistory +from .views import ApiDevPanel_ClassidViewDetails, ApiDevPanel_ClassidViewList +from .views import ApiDevPanel_Config, ApiDevPanel_Log +from .views import ApiDevPanel_CatalogReindex, UUIDView +from .views import ApiDevPanel_ServerView, ApiDevPanel_ServerStop urlpatterns = [ diff --git a/ikaaro/api/views.py b/ikaaro/api/views.py index 2e372339c..4d390e76e 100644 --- a/ikaaro/api/views.py +++ b/ikaaro/api/views.py @@ -59,10 +59,9 @@ def get_namespace(self, resource, context): 'methods': view.known_methods, 'description': view.__doc__} namespace['endpoints'].append(kw) - i +=1 + i += 1 return namespace - def get_view_query_as_list(self, view, schema): l = [] for key, field in schema.items(): @@ -74,15 +73,12 @@ def get_view_query_as_list(self, view, schema): return l - - class Api_View(ItoolsView): response_schema = {} route = None use_cookies = False - @classmethod def get_route(cls): """ @@ -90,7 +86,6 @@ def get_route(cls): """ return cls.route - def get_resource(self, context): return context.resource @@ -126,7 +121,7 @@ class UUIDView(Api_View): access = True known_methods = ['DELETE'] - path_query_schema = {'uuid': Char_Field(title=MSG(u'The uuid of a resource in DB'))} + path_query_schema = {'uuid': Char_Field(title=MSG('The uuid of a resource in DB'))} def get_resource(self, context): query = get_resource_by_uuid_query( @@ -143,7 +138,7 @@ def get_resource(self, context): # Forbidden (403) raise Forbidden raise NotFound - return search.get_resources(size=1).next() + return next(search.get_resources(size=1)) access_DELETE = 'is_allowed_to_remove' @@ -160,7 +155,7 @@ class ApiDevPanel_ResourceJSON(UUIDView): access = 'is_admin' known_methods = ['GET', 'DELETE'] - query_schema = {'pretty': Boolean_Field(title=MSG(u'Pretty ?'))} + query_schema = {'pretty': Boolean_Field(title=MSG('Pretty ?'))} def GET(self, root, context): resource = self.get_resource(context) @@ -195,10 +190,10 @@ class ApiDevPanel_ResourceHistory(UUIDView): access = 'is_admin' known_methods = ['GET', 'DELETE'] response_schema = { - 'sha': Char_Field(title=MSG(u'SHA of the commit')), + 'sha': Char_Field(title=MSG('SHA of the commit')), 'author_date': Datetime_Field(title=MSG("Datetime of commit")), - 'author_name': Char_Field(title=MSG(u"Commit's author name")), - 'message_short': Char_Field(title=MSG(u"Commit's title")) + 'author_name': Char_Field(title=MSG("Commit's author name")), + 'message_short': Char_Field(title=MSG("Commit's title")) } def GET(self, root, context): resource = self.get_resource(context) @@ -230,11 +225,11 @@ class ApiDevPanel_ClassidViewDetails(Api_View): access = 'is_admin' path_query_schema = { - 'class_id': Char_Field(title=MSG(u'A class_id registered in DB')) + 'class_id': Char_Field(title=MSG('A class_id registered in DB')) } response_schema = { - 'class_title': Char_Field(title=MSG(u'The class_title of the resource cls')), - 'class_id': Char_Field(title=MSG(u'The class_id of the resource cls')) + 'class_title': Char_Field(title=MSG('The class_title of the resource cls')), + 'class_id': Char_Field(title=MSG('The class_id of the resource cls')) } @@ -265,8 +260,8 @@ class Api_LoginView(Api_View): access = True known_methods = ['POST'] - schema = {'email': Email_Field(title=MSG(u'Username'), required=True), - 'password': Password_Field(title=MSG(u'Password'), required=True)} + schema = {'email': Email_Field(title=MSG('Username'), required=True), + 'password': Password_Field(title=MSG('Password'), required=True)} def POST(self, root, context): raise NotImplementedError @@ -317,9 +312,9 @@ class ApiDevPanel_ServerView(Api_View): access = 'is_admin' known_methods = ['GET'] response_schema = { - 'timestamp': Char_Field(title=MSG(u"Server's start timestamp")), - 'pid': Integer_Field(title=MSG(u"Server's PID")), - 'port': Integer_Field(title=MSG(u"Server's port")) + 'timestamp': Char_Field(title=MSG("Server's start timestamp")), + 'pid': Integer_Field(title=MSG("Server's PID")), + 'port': Integer_Field(title=MSG("Server's port")) } def GET(self, root, context): diff --git a/ikaaro/autoadd.py b/ikaaro/autoadd.py index 0b1c8d526..0e47d1726 100644 --- a/ikaaro/autoadd.py +++ b/ikaaro/autoadd.py @@ -22,13 +22,13 @@ from itools.web import get_context, ERROR, FormError # Import from ikaaro -from autoform import AutoForm -from datatypes import BirthDate -from datatypes import Days, Months, Years -from buttons import Button -from fields import Field -import messages -from widgets import HiddenWidget, ReadOnlyWidget +from .autoform import AutoForm +from .datatypes import BirthDate +from .datatypes import Days, Months, Years +from .buttons import Button +from .fields import Field +from . import messages +from .widgets import HiddenWidget, ReadOnlyWidget @@ -37,7 +37,7 @@ class AutoAdd(AutoForm): access = 'is_allowed_to_add' - actions = [Button(access=True, css='btn btn-primary', title=MSG(u'Add'))] + actions = [Button(access=True, css='btn btn-primary', title=MSG('Add'))] action_goto = None goto_view = None goto_parent_view = None # DEPRECATED -> use action_goto @@ -90,10 +90,10 @@ def get_title(self, context): cls = self._resource_class if cls: class_title = cls.class_title.gettext() - title = MSG(u'Add {class_title}') + title = MSG('Add {class_title}') return title.gettext(class_title=class_title) - return MSG(u'Add resource').gettext() + return MSG('Add resource').gettext() def _get_datatype(self, resource, context, name): @@ -162,11 +162,11 @@ def get_value(self, resource, context, name, datatype): # View cls_description value = getattr(self, name, None) if value is not None: - return value.gettext() if value else u'' + return value.gettext() if value else '' # Resource cls_description cls = self._resource_class value = cls.class_description - return value.gettext() if value else u'' + return value.gettext() if value else '' elif name == 'referrer': referrer = context.query.get('referrer') return referrer or context.get_referrer() @@ -177,7 +177,7 @@ def get_value(self, resource, context, name, datatype): if getattr(datatype, 'multilingual', False): for language in resource.get_edit_languages(context): - value.setdefault(language, u'') + value.setdefault(language, '') return value @@ -196,7 +196,7 @@ def get_container(self, resource, context, form): root = context.root if not root.has_permission(context.user, 'add', container, class_id): path = '/' if path == '.' else '/%s/' % path - msg = ERROR(u'Adding resources to {path} is not allowed.') + msg = ERROR('Adding resources to {path} is not allowed.') raise FormError(msg.gettext(path=path)) # Ok diff --git a/ikaaro/autoedit.py b/ikaaro/autoedit.py index 39adc2faa..a8b2e1433 100644 --- a/ikaaro/autoedit.py +++ b/ikaaro/autoedit.py @@ -29,18 +29,18 @@ from itools.web import get_context # Import from ikaaro -from autoform import AutoForm -from widgets import HiddenWidget, timestamp_widget -from datatypes import BirthDate -from datatypes import Days, Months, Years -from fields import Field -import messages -from views import ContextMenu +from .autoform import AutoForm +from .widgets import HiddenWidget, timestamp_widget +from .datatypes import BirthDate +from .datatypes import Days, Months, Years +from .fields import Field +from . import messages +from .views import ContextMenu class EditLanguageMenu(ContextMenu): - title = MSG(u'Configuration') + title = MSG('Configuration') template = '/ui/ikaaro/generic/edit_language_menu.xml' view = None @@ -87,7 +87,7 @@ def display(self): class AutoEdit(AutoForm): access = 'is_allowed_to_edit' - title = MSG(u'Edit') + title = MSG('Edit') fields = ['title', 'description', 'subject'] def get_fields(self): diff --git a/ikaaro/autoform.py b/ikaaro/autoform.py index ec6e60778..2f25f3854 100644 --- a/ikaaro/autoform.py +++ b/ikaaro/autoform.py @@ -30,9 +30,9 @@ from itools.web import STLView # Import from ikaaro -from buttons import Button -from datatypes import BirthDate -from datatypes import Days, Months, Years +from .buttons import Button +from .datatypes import BirthDate +from .datatypes import Days, Months, Years ########################################################################### @@ -46,8 +46,8 @@ class AutoForm(STLView): Widgets is a list: - [TextWidget('firstname', title=MSG(u'Firstname')), - TextWidget('lastname', title=MSG(u'Lastname'))] + [TextWidget('firstname', title=MSG('Firstname')), + TextWidget('lastname', title=MSG('Lastname'))] """ template = '/ui/ikaaro/auto_form.xml' @@ -58,7 +58,7 @@ class AutoForm(STLView): widgets = [] description = None method = 'post' - actions = [Button(access=True, css='btn btn-success', title=MSG(u'Save'))] + actions = [Button(access=True, css='btn btn-success', title=MSG('Save'))] def get_widgets(self, resource, context): return self.widgets diff --git a/ikaaro/buttons.py b/ikaaro/buttons.py index 550e6ecfe..0d5800911 100644 --- a/ikaaro/buttons.py +++ b/ikaaro/buttons.py @@ -20,8 +20,8 @@ from itools.stl import STLTemplate # Import from ikaaro -from datatypes import CopyCookie -from utils import make_stl_template +from .datatypes import CopyCookie +from .utils import make_stl_template class Button(STLTemplate): @@ -51,7 +51,7 @@ def onclick(cls): confirm = cls.confirm if not confirm: return None - return u'return confirm("%s");' % confirm.gettext() + return 'return confirm("%s");' % confirm.gettext() @proto_lazy_property @@ -66,10 +66,10 @@ def show(self): class Remove_Button(Button): access = 'is_allowed_to_remove' - confirm = MSG(u'Are you sure you want to delete this?') + confirm = MSG('Are you sure you want to delete this?') css = 'btn btn-danger' name = 'remove' - title = MSG(u'Remove') + title = MSG('Remove') ########################################################################### @@ -89,7 +89,7 @@ def show(self): class Remove_BrowseButton(Remove_Button, BrowseButton): - confirm = MSG(u'Are you sure you want to delete the selection?') + confirm = MSG('Are you sure you want to delete the selection?') @@ -98,7 +98,7 @@ class RenameButton(BrowseButton): access = 'is_allowed_to_move' css = 'btn btn-success' name = 'rename' - title = MSG(u'Rename') + title = MSG('Rename') @@ -107,7 +107,7 @@ class CopyButton(BrowseButton): access = 'is_allowed_to_copy' css = 'btn btn-primary' name = 'copy' - title = MSG(u'Copy') + title = MSG('Copy') @@ -116,7 +116,7 @@ class CutButton(BrowseButton): access = 'is_allowed_to_move' css = 'btn btn-primary' name = 'cut' - title = MSG(u'Cut') + title = MSG('Cut') @@ -125,7 +125,7 @@ class PasteButton(BrowseButton): access = 'is_allowed_to_move' css = 'btn btn-primary' name = 'paste' - title = MSG(u'Paste') + title = MSG('Paste') @proto_lazy_property @@ -141,7 +141,7 @@ class AddButton(BrowseButton): access = 'is_allowed_to_edit' name = 'add' - title = MSG(u'Add') + title = MSG('Add') css = 'btn btn-primary' @@ -150,19 +150,19 @@ class ZipButton(BrowseButton): access = 'is_allowed_to_edit' name = 'zip' - title = MSG(u'Zip') + title = MSG('Zip') class SearchButton(BrowseButton): access = 'is_allowed_to_view' name = 'search' - title = MSG(u'Search') + title = MSG('Search') class ExportAsJSONButton(BrowseButton): - title = MSG(u"Exporter les ressources (JSON)") + title = MSG("Exporter les ressources (JSON)") css = "btn btn-primary" access = "is_admin" name = "export_as_json" diff --git a/ikaaro/config.py b/ikaaro/config.py index 2de22f648..dbc980fb1 100644 --- a/ikaaro/config.py +++ b/ikaaro/config.py @@ -17,41 +17,34 @@ # # You should have received a copy of the GNU General Public License # along with this program. If not, see . - # Import from itools -from itools.database import OrQuery from itools.datatypes import String from itools.gettext import MSG from itools.i18n import get_language_name, get_languages -from itools.uri import Path from itools.web import STLView, INFO, ERROR -from itools.database import PhraseQuery -# Import from ikaaro -from ikaaro.views.folder_views import Folder_BrowseContent # Import from here -from folder import Folder -from messages import MSG_CHANGES_SAVED -from utils import get_base_path_query -from views import IconsView +from .folder import Folder +from .messages import MSG_CHANGES_SAVED +from .views import IconsView ########################################################################### # Views ########################################################################### GROUPS = [ - ('access', MSG(u'Users, Access Control & Security')), - ('webmaster', MSG(u'Webmaster tools')), - ('content', MSG(u'Content')), - ('other', MSG(u'Other')), + ('access', MSG('Users, Access Control & Security')), + ('webmaster', MSG('Webmaster tools')), + ('content', MSG('Content')), + ('other', MSG('Other')), ] class Configuration_View(STLView): access = 'is_allowed_to_edit' - title = MSG(u'Configuration') + title = MSG('Configuration') template = '/ui/ikaaro/website/config.xml' def get_namespace(self, resource, context): @@ -98,15 +91,15 @@ def action(self, resource, context, form): if resource.get_resource(name, soft=True) is None: resource.make_resource(name, module) - context.message = MSG(u'New modules initialized.') + context.message = MSG('New modules initialized.') class Config_EditLanguages(STLView): access = 'is_admin' - title = MSG(u'Languages') - description = MSG(u'Define the Web Site languages.') + title = MSG('Languages') + description = MSG('Define the Web Site languages.') icon = 'languages.png' template = '/ui/ikaaro/website/edit_languages.xml' schema = {'codes': String(multiple=True, mandatory=True)} @@ -129,8 +122,8 @@ def get_namespace(self, resource, context): # Not active languages not_active = [ - x for x in get_languages() if x['code'] not in ws_languages ] - not_active.sort(lambda x, y: cmp(x['name'], y['name'])) + x for x in get_languages() if x['code'] not in ws_languages] + not_active = sorted(not_active, key=lambda x: x["name"]) # Ok return { @@ -146,7 +139,7 @@ def action_change_default_language(self, resource, context, form): # This action requires only one language to be selected codes = form['codes'] if len(codes) != 1: - message = ERROR(u'You must select one and only one language.') + message = ERROR('You must select one and only one language.') context.message = message return default = codes[0] @@ -168,7 +161,7 @@ def action_remove_languages(self, resource, context, form): languages = resource.get_value('website_languages') default = languages[0] if default in codes: - message = ERROR(u'You can not remove the default language.') + message = ERROR('You can not remove the default language.') context.message = message return @@ -176,7 +169,7 @@ def action_remove_languages(self, resource, context, form): languages = [ x for x in languages if x not in codes ] resource.set_property('website_languages', languages) # Ok - context.message = INFO(u'Languages removed.') + context.message = INFO('Languages removed.') ####################################################################### @@ -192,7 +185,7 @@ def action_add_language(self, resource, context, form): ws_languages.append(form['code']) resource.set_property('website_languages', ws_languages) # Ok - context.message = INFO(u'Language added.') + context.message = INFO('Language added.') @@ -202,7 +195,7 @@ def action_add_language(self, resource, context, form): class Configuration(Folder): class_id = 'configuration' - class_title = MSG(u'Configuration') + class_title = MSG('Configuration') class_views = ['view', 'edit_languages'] class_icon_css = 'fa-cogs' @@ -232,13 +225,13 @@ def unregister_module(cls, name): # Import core config modules -import config_access -import config_captcha -import config_footer -import config_groups -import config_mail -import config_menu -import config_models -import config_register -import config_seo -import config_theme +from . import config_access +from . import config_captcha +from . import config_footer +from . import config_groups +from . import config_mail +from . import config_menu +from . import config_models +from . import config_register +from . import config_seo +from . import config_theme diff --git a/ikaaro/config_access.py b/ikaaro/config_access.py index a4e61cd41..aa3b38a72 100644 --- a/ikaaro/config_access.py +++ b/ikaaro/config_access.py @@ -26,16 +26,16 @@ from ikaaro.views.folder_views import Folder_BrowseContent # Import from here -from autoadd import AutoAdd -from autoedit import AutoEdit -from buttons import Remove_BrowseButton -from config import Configuration -from config_common import NewResource_Local -from enumerates import Groups_Datatype -from fields import Select_Field -from folder import Folder -from resource_ import DBResource -from utils import get_base_path_query +from .autoadd import AutoAdd +from .autoedit import AutoEdit +from .buttons import Remove_BrowseButton +from .config import Configuration +from .config_common import NewResource_Local +from .enumerates import Groups_Datatype +from .fields import Select_Field +from .folder import Folder +from .resource_ import DBResource +from .utils import get_base_path_query ########################################################################### @@ -52,7 +52,7 @@ def get_options(self): title = '/' if not path else ('%s/' % path) items.append({'name': path, 'value': title, 'selected': False}) - items.sort(key=lambda x: x['value']) + items = sorted(items, key=lambda x: x['value']) return items @@ -60,41 +60,41 @@ class Path_Field(Select_Field): datatype = Path_Datatype() has_empty_option = False - title = MSG(u'Path') + title = MSG('Path') class PathDepth_Field(Select_Field): - title = MSG(u'Depth') + title = MSG('Depth') default = '0' multiple = False has_empty_option = False endline = True options = [ - {'name': '0', 'value': u'0'}, - {'name': '1', 'value': u'1'}, - {'name': '2', 'value': u'2'}, - {'name': '3', 'value': u'3'}, - {'name': '4', 'value': u'4'}, - {'name': '5', 'value': u'5'}, - {'name': '*', 'value': MSG(u'No limit')}] + {'name': '0', 'value': '0'}, + {'name': '1', 'value': '1'}, + {'name': '2', 'value': '2'}, + {'name': '3', 'value': '3'}, + {'name': '4', 'value': '4'}, + {'name': '5', 'value': '5'}, + {'name': '*', 'value': MSG('No limit')}] class Permission_Datatype(Enumerate): options = [ - {'name': 'view', 'value': MSG(u'View')}, - {'name': 'edit', 'value': MSG(u'Remove and modify')}, - {'name': 'share', 'value': MSG(u'Share')}, - {'name': 'add', 'value': MSG(u'Add')}] + {'name': 'view', 'value': MSG('View')}, + {'name': 'edit', 'value': MSG('Remove and modify')}, + {'name': 'share', 'value': MSG('Share')}, + {'name': 'add', 'value': MSG('Add')}] class Permissions_Field(Select_Field): - title = MSG(u'Permission') + title = MSG('Permission') datatype = Permission_Datatype() @@ -110,14 +110,13 @@ def get_options(self): options = [ {'name': class_id, 'value': cls.class_title.gettext()} for class_id, cls in options.items() ] - - options.sort(key=lambda x: x['value']) + options = sorted(options, key=lambda x: x['value']) return options class SearchFormat_Field(Select_Field): - title = MSG(u'Resource type') + title = MSG('Resource type') datatype = SearchFormat_Datatype() @@ -127,7 +126,7 @@ class SearchFormat_Field(Select_Field): ########################################################################### class AccessRule_Results(Folder_BrowseContent): - title = MSG(u'View results') + title = MSG('View results') search_schema = {} search_widgets = [] @@ -138,10 +137,10 @@ def get_items_query(self, resource, context): class AccessRule(DBResource): class_id = 'config-access-rule' - class_title = MSG(u'Access rule') + class_title = MSG('Access rule') # Fields - group = Select_Field(required=True, title=MSG(u'User group'), + group = Select_Field(required=True, title=MSG('User group'), datatype=Groups_Datatype(), indexed=True, stored=True) permission = Permissions_Field(required=True, indexed=True, stored=True) search_path = Path_Field(indexed=True, stored=True) @@ -234,7 +233,7 @@ def search_schema(self): def table_columns(self): columns = [ ('checkbox', None), - ('abspath', MSG(u'Num.'))] + ('abspath', MSG('Num.'))] for name, field in self._search_fields: columns.append((name, field.title)) @@ -288,8 +287,8 @@ class ConfigAccess(Folder): class_id = 'config-access' class_version = '20110606' - class_title = MSG(u'Access Control') - class_description = MSG(u'Choose the security policy.') + class_title = MSG('Access Control') + class_description = MSG('Choose the security policy.') class_icon_css = 'fa-user-plus' # Configuration @@ -388,7 +387,7 @@ def get_document_types(self): # Views class_views = ['browse_content', 'add_rule', 'edit'] browse_content = ConfigAccess_Browse() - add_rule = NewResource_Local(title=MSG(u'Add rule')) + add_rule = NewResource_Local(title=MSG('Add rule')) diff --git a/ikaaro/config_captcha.py b/ikaaro/config_captcha.py index 49d94b08f..6961b6a4f 100644 --- a/ikaaro/config_captcha.py +++ b/ikaaro/config_captcha.py @@ -15,7 +15,7 @@ # along with this program. If not, see . # Import from standard library -import urllib, urllib2 +import urllib.request, urllib.parse, urllib.error, urllib.request, urllib.error, urllib.parse # Import from itools from itools.core import proto_lazy_property @@ -24,13 +24,13 @@ from itools.web import get_context # Import from ikaaro -from autoedit import AutoEdit -from config import Configuration -from fields import Field, Select_Field, Text_Field -from folder import Folder -from resource_ import DBResource -from utils import make_stl_template -from widgets import TextWidget, RadioWidget, Widget +from .autoedit import AutoEdit +from .config import Configuration +from .fields import Field, Select_Field, Text_Field +from .folder import Folder +from .resource_ import DBResource +from .utils import make_stl_template +from .widgets import TextWidget, RadioWidget, Widget class CaptchaFieldML(Text_Field): @@ -43,7 +43,7 @@ class CaptchaFieldML(Text_Field): class RecaptchaWidget(Widget): - title = MSG(u"Please enter the words below") + title = MSG("Please enter the words below") public_key = None template = make_stl_template( @@ -85,23 +85,23 @@ def is_valid(cls, value): recaptcha_response_field = context.get_form_value( 'recaptcha_response_field', type=String) # Test if captcha value is valid - params = urllib.urlencode ({ + params = urllib.parse.urlencode({ 'privatekey': cls.private_key, - 'remoteip' : remote_ip, + 'remoteip': remote_ip, 'challenge': recaptcha_challenge_field, - 'response' : recaptcha_response_field, + 'response': recaptcha_response_field, }) - request = urllib2.Request ( - url = "http://api-verify.recaptcha.net/verify", - data = params, - headers = { + request = urllib.request.Request( + url="http://api-verify.recaptcha.net/verify", + data=params, + headers={ "Content-type": "application/x-www-form-urlencoded", "User-agent": "reCAPTCHA Python" } ) - httpresp = urllib2.urlopen (request) - return_values = httpresp.read ().splitlines (); - httpresp.close(); + httpresp = urllib.request.urlopen(request) + return_values = httpresp.read().splitlines() + httpresp.close() context.recaptcha_return_code = return_code = return_values[0] return return_code == 'true' @@ -110,12 +110,12 @@ def is_valid(cls, value): class Captcha_Recaptcha(DBResource): class_id = 'config-captcha-recaptcha' - class_title = MSG(u'Recaptcha') + class_title = MSG('Recaptcha') class_views = ['edit'] # Fields - public_key = CaptchaFieldML(title=MSG(u"Recaptcha public key")) - private_key = CaptchaFieldML(title=MSG(u"Recaptcha private key")) + public_key = CaptchaFieldML(title=MSG("Recaptcha public key")) + private_key = CaptchaFieldML(title=MSG("Recaptcha private key")) # Views edit = AutoEdit(fields=['public_key', 'private_key']) @@ -145,7 +145,7 @@ def is_valid(cls, value): class QuestionCaptchaWidget(TextWidget): - title = MSG(u"Please answer the question below:") + title = MSG("Please answer the question below:") question = None template = make_stl_template(""" @@ -159,12 +159,12 @@ class QuestionCaptchaWidget(TextWidget): class Captcha_Question(DBResource): class_id = 'config-captcha-question' - class_title = MSG(u'Captcha question') + class_title = MSG('Captcha question') class_views = ['edit'] # Fields - question = CaptchaFieldML(default=u'2 + 3', title=MSG(u"Question")) - answer = CaptchaFieldML(default=u'5', title=MSG(u"Answer")) + question = CaptchaFieldML(default='2 + 3', title=MSG("Question")) + answer = CaptchaFieldML(default='5', title=MSG("Answer")) # Views edit = AutoEdit(fields=['question', 'answer']) @@ -248,27 +248,27 @@ class CaptchaType(Enumerate): default = 'question' options = [ - {'name': 'question', 'value': MSG(u'Question captcha')}, - {'name': 'recaptcha', 'value': MSG(u'Recaptcha')}] + {'name': 'question', 'value': MSG('Question captcha')}, + {'name': 'recaptcha', 'value': MSG('Recaptcha')}] class Captcha(Folder): class_id = 'config-captcha' - class_title = MSG(u'Captcha') - class_description = MSG(u'Feature to protect from spammers') + class_title = MSG('Captcha') + class_description = MSG('Feature to protect from spammers') class_icon48 = '/ui/ikaaro/icons/48x48/captcha.png' class_icon_css = 'fa-user-secret' # Fields captcha_type = Select_Field( - required=True, title=MSG(u"Captcha type"), datatype=CaptchaType, + required=True, title=MSG("Captcha type"), datatype=CaptchaType, widget = Select_CaptchaWidget(has_empty_option=False)) # Views class_views = ['edit'] - edit = AutoEdit(title=MSG(u'Edit captcha'), fields=['captcha_type']) + edit = AutoEdit(title=MSG('Edit captcha'), fields=['captcha_type']) # Configuration config_name = 'captcha' diff --git a/ikaaro/config_common.py b/ikaaro/config_common.py index f6d86a4ec..1c6fc5c3e 100644 --- a/ikaaro/config_common.py +++ b/ikaaro/config_common.py @@ -15,7 +15,7 @@ # along with this program. If not, see . # Import from ikaaro -from views.folder_views import Folder_NewResource +from .views.folder_views import Folder_NewResource print('[OBSOLETE] NewResource_Local has been renamed Folder_NewResource') diff --git a/ikaaro/config_footer.py b/ikaaro/config_footer.py index 1eac61d93..88d9a02df 100644 --- a/ikaaro/config_footer.py +++ b/ikaaro/config_footer.py @@ -18,16 +18,16 @@ from itools.gettext import MSG # Import from ikaaro -from config import Configuration -from file_views import File_Edit -from webpage import WebPage +from .config import Configuration +from .file_views import File_Edit +from .webpage import WebPage class Footer(WebPage): class_id = 'config-footer' - class_title = MSG(u'Footer') - class_description = MSG(u'Define the site footer.') + class_title = MSG('Footer') + class_description = MSG('Define the site footer.') class_icon_css = 'fa-sort-down' class_views = ['edit', 'externaledit'] diff --git a/ikaaro/config_groups.py b/ikaaro/config_groups.py index 8e10685db..1d75da6b4 100644 --- a/ikaaro/config_groups.py +++ b/ikaaro/config_groups.py @@ -20,14 +20,14 @@ from itools.gettext import MSG # Import from ikaaro -from autoadd import AutoAdd -from buttons import BrowseButton, Remove_BrowseButton, RenameButton -from config import Configuration -from config_common import NewResource_Local -from messages import MSG_CHANGES_SAVED -from order import OrderedFolder, OrderedFolder_BrowseContent -from resource_ import DBResource -from users_views import BrowseUsers +from .autoadd import AutoAdd +from .buttons import BrowseButton, Remove_BrowseButton, RenameButton +from .config import Configuration +from .config_common import NewResource_Local +from .messages import MSG_CHANGES_SAVED +from .order import OrderedFolder, OrderedFolder_BrowseContent +from .resource_ import DBResource +from .users_views import BrowseUsers @@ -36,7 +36,7 @@ class Group_BrowseUsers(BrowseUsers): schema = {'ids': String(multiple=True)} table_actions = [ - BrowseButton(access='is_admin', title=MSG(u'Update'))] + BrowseButton(access='is_admin', title=MSG('Update'))] @proto_lazy_property @@ -72,8 +72,8 @@ def action(self, resource, context, form): class Group(DBResource): class_id = 'config-group' - class_title = MSG(u'User Group') - class_description = MSG(u'...') + class_title = MSG('User Group') + class_description = MSG('...') # Views class_views = ['browse_users', 'edit'] @@ -85,19 +85,19 @@ class Group(DBResource): class BrowseGroups(OrderedFolder_BrowseContent): access = 'is_admin' - title = MSG(u'Browse groups') + title = MSG('Browse groups') search_schema = {} search_widgets = [] table_columns = [ ('checkbox', None), - ('abspath', MSG(u'Name')), - ('title', MSG(u'Title')), - ('members', MSG(u'Members')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author')), - ('order', MSG(u'Order'))] + ('abspath', MSG('Name')), + ('title', MSG('Title')), + ('members', MSG('Members')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author')), + ('order', MSG('Order'))] table_actions = [Remove_BrowseButton, RenameButton] @proto_lazy_property @@ -119,8 +119,8 @@ def get_item_value(self, resource, context, item, column): class ConfigGroups(OrderedFolder): class_id = 'config-groups' - class_title = MSG(u'User Groups') - class_description = MSG(u'Manage user groups.') + class_title = MSG('User Groups') + class_description = MSG('Manage user groups.') class_icon_css = 'fa-users' class_views = ['browse_content', 'add_group', 'edit'] @@ -130,9 +130,9 @@ class ConfigGroups(OrderedFolder): property_name = 'groups' default_groups = [ - ('admins', {'en': u'Admins'}), - ('reviewers', {'en': u'Reviewers'}), - ('members', {'en': u'Members'})] + ('admins', {'en': 'Admins'}), + ('reviewers', {'en': 'Reviewers'}), + ('members', {'en': 'Members'})] def init_resource(self, **kw): @@ -148,7 +148,7 @@ def get_document_types(self): # Views browse_content = BrowseGroups() - add_group = NewResource_Local(title=MSG(u'Add group')) + add_group = NewResource_Local(title=MSG('Add group')) Configuration.register_module(ConfigGroups) diff --git a/ikaaro/config_mail.py b/ikaaro/config_mail.py index 880a989dd..d4a87041f 100644 --- a/ikaaro/config_mail.py +++ b/ikaaro/config_mail.py @@ -23,10 +23,10 @@ from itools.web import get_context # Import from ikaaro -from autoedit import AutoEdit -from config import Configuration -from fields import Boolean_Field, Select_Field, Text_Field, Textarea_Field -from resource_ import DBResource +from .autoedit import AutoEdit +from .config import Configuration +from .fields import Boolean_Field, Select_Field, Text_Field, Textarea_Field +from .resource_ import DBResource @@ -46,17 +46,17 @@ def get_options(cls): user_title = user_email options.append({'name': user.name, 'value': user_title, 'sort_value': user_title.lower()}) - options.sort(key=itemgetter('sort_value')) + options = sorted(options, key=itemgetter('sort_value')) return options -mail_description = MSG(u'Configure the website email options') +mail_description = MSG('Configure the website email options') class ConfigMail_Edit(AutoEdit): - title = MSG(u'Email options') + title = MSG('Email options') description = mail_description fields = ['emails_from_addr', 'emails_reply_to', 'emails_signature', 'contacts'] @@ -66,18 +66,18 @@ class ConfigMail_Edit(AutoEdit): class ConfigMail(DBResource): class_id = 'config-mail' - class_title = MSG(u'Email options') + class_title = MSG('Email options') class_description = mail_description class_icon_css = 'fa-envelope' class_views = ['edit'] # Fields contacts = Select_Field(multiple=True, datatype=ContactsOptions, - title=MSG(u'Select the contact accounts'), + title=MSG('Select the contact accounts'), has_empty_option=False) - emails_from_addr = Text_Field(title=MSG(u'From header')) - emails_reply_to = Boolean_Field(title=MSG(u'Reply to'), default=True) - emails_signature = Textarea_Field(title=MSG(u'Signature')) + emails_from_addr = Text_Field(title=MSG('From header')) + emails_reply_to = Boolean_Field(title=MSG('Reply to'), default=True) + emails_signature = Textarea_Field(title=MSG('Signature')) # Views edit = ConfigMail_Edit() diff --git a/ikaaro/config_menu.py b/ikaaro/config_menu.py index 27d2433af..06bf37fdd 100644 --- a/ikaaro/config_menu.py +++ b/ikaaro/config_menu.py @@ -24,26 +24,26 @@ from itools.uri import Path # Import from ikaaro -from autoadd import AutoAdd -from autoedit import AutoEdit -from config import Configuration -from config_common import NewResource_Local -from buttons import Remove_BrowseButton -from fields import Select_Field, URI_Field -from order import OrderedFolder, OrderedFolder_BrowseContent -from utils import split_reference -from widgets import PathSelectorWidget +from .autoadd import AutoAdd +from .autoedit import AutoEdit +from .config import Configuration +from .config_common import NewResource_Local +from .buttons import Remove_BrowseButton +from .fields import Select_Field, URI_Field +from .order import OrderedFolder, OrderedFolder_BrowseContent +from .utils import split_reference +from .widgets import PathSelectorWidget class Target_Field(Select_Field): default = '_top' - options = [{'name': '_top', 'value': MSG(u'Current page')}, - {'name': '_blank', 'value': MSG(u'New page')}] + options = [{'name': '_top', 'value': MSG('Current page')}, + {'name': '_blank', 'value': MSG('New page')}] required = True - title = MSG(u'Target') + title = MSG('Target') has_empty_option = False @@ -53,12 +53,12 @@ class MenuItem_Browse(OrderedFolder_BrowseContent): search_widgets = None table_columns = [ ('checkbox', None), - ('abspath', MSG(u'Path')), - ('title', MSG(u'Title')), - ('target', MSG(u'Target')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author')), - ('order', MSG(u'Order'))] + ('abspath', MSG('Path')), + ('title', MSG('Title')), + ('target', MSG('Target')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author')), + ('order', MSG('Order'))] table_actions = [Remove_BrowseButton] def get_item_value(self, resource, context, item, column): @@ -71,7 +71,7 @@ def get_item_value(self, resource, context, item, column): class AddMenu(NewResource_Local): - title = MSG(u'Add item') + title = MSG('Add item') def get_items(self, resource, context): return tuple(resource.get_document_types()) @@ -81,10 +81,10 @@ def get_items(self, resource, context): class MenuItem(OrderedFolder): class_id = 'config-menu-item' - class_title = MSG(u'Menu') + class_title = MSG('Menu') # Fields - path = URI_Field(required=True, title=MSG(u'Path'), + path = URI_Field(required=True, title=MSG('Path'), widget=PathSelectorWidget) target = Target_Field() @@ -255,8 +255,8 @@ def get_menu_namespace_level(self, context, url, use_first_child=False): class ConfigMenu(MenuItem): class_id = 'config-menu' - class_title = MSG(u'Configuration Menu') - class_description = MSG(u'Edit the global menu.') + class_title = MSG('Configuration Menu') + class_description = MSG('Edit the global menu.') class_icon_css = 'fa-sitemap' class_views = ['browse_content', 'add_menu', 'edit'] @@ -268,7 +268,7 @@ def init_resource(self, **kw): super(ConfigMenu, self).init_resource(**kw) # Menu order = [] - menus = [('/', u'Home'), ('/;contact', u'Contact')] + menus = [('/', 'Home'), ('/;contact', 'Contact')] for path, title in menus: name = checkid(title) order.append(name) @@ -286,14 +286,14 @@ def get_menu_namespace(self, context, show_first_child=False, src=None): Where the list of items is the first level and item_dic = {'active': True or False, 'class': 'active' or 'in_path' or None, - 'description': MSG(u'About Python'), + 'description': MSG('About Python'), 'id': 'tab_python', 'in_path': True or False, 'items': [item_dic11, ..., item_dic1N] or None, 'name': 'python', 'path': '../python', 'target': '_top' or '_blank' or None, - 'title': MSG(u'Python')} + 'title': MSG('Python')} "items" contains the first level. Each item_dic contains in turn an 'items' with its children. diff --git a/ikaaro/config_models.py b/ikaaro/config_models.py index df3e306ac..9a59ab406 100644 --- a/ikaaro/config_models.py +++ b/ikaaro/config_models.py @@ -18,31 +18,31 @@ from itools.gettext import MSG # Import from ikaaro -from views.folder_views import Folder_BrowseContent +from .views.folder_views import Folder_BrowseContent # Import from ikaaro -from autoadd import AutoAdd -from autoedit import AutoEdit -from buttons import Remove_BrowseButton -from config import Configuration -from config_common import NewResource_Local -from fields import Boolean_Field, Date_Field, Email_Field, Integer_Field -from fields import Select_Field, Text_Field, Textarea_Field -from folder import Folder -from order import OrderedFolder, OrderedFolder_BrowseContent -from resource_ import DBResource -from widgets import CheckboxWidget, RadioWidget, SelectWidget +from .autoadd import AutoAdd +from .autoedit import AutoEdit +from .buttons import Remove_BrowseButton +from .config import Configuration +from .config_common import NewResource_Local +from .fields import Boolean_Field, Date_Field, Email_Field, Integer_Field +from .fields import Select_Field, Text_Field, Textarea_Field +from .folder import Folder +from .order import OrderedFolder, OrderedFolder_BrowseContent +from .resource_ import DBResource +from .widgets import CheckboxWidget, RadioWidget, SelectWidget class FieldType_Field(Select_Field): options = [ - {'name': 'boolean', 'value': MSG(u'Boolean')}, - {'name': 'date', 'value': MSG(u'Date')}, - {'name': 'email', 'value': MSG(u'Email')}, - {'name': 'integer', 'value': MSG(u'Integer')}, - {'name': 'text', 'value': MSG(u'Text')}, - {'name': 'textarea', 'value': MSG(u'Textarea')}] + {'name': 'boolean', 'value': MSG('Boolean')}, + {'name': 'date', 'value': MSG('Date')}, + {'name': 'email', 'value': MSG('Email')}, + {'name': 'integer', 'value': MSG('Integer')}, + {'name': 'text', 'value': MSG('Text')}, + {'name': 'textarea', 'value': MSG('Textarea')}] fields_map = { 'boolean': Boolean_Field, @@ -57,9 +57,9 @@ class FieldType_Field(Select_Field): class ModelField_Base(DBResource): # Fields - required = Boolean_Field(title=MSG(u'Required')) - multiple = Boolean_Field(title=MSG(u'Multiple')) - tip = Text_Field(title=MSG(u'Tip')) + required = Boolean_Field(title=MSG('Required')) + multiple = Boolean_Field(title=MSG('Multiple')) + tip = Text_Field(title=MSG('Tip')) def get_owner(self): @@ -93,7 +93,7 @@ def get_field_kw(self, field): class ModelField_Inherited(ModelField_Base): class_id = 'model-field-inherited' - class_title = MSG(u'Inherited field') + class_title = MSG('Inherited field') class_views = ['edit'] @@ -101,10 +101,10 @@ class ModelField_Inherited(ModelField_Base): class ModelField_Standard(ModelField_Base): class_id = 'model-field-standard' - class_title = MSG(u'Standard field') + class_title = MSG('Standard field') # Fields - field_type = FieldType_Field(required=True, title=MSG(u'Field type')) + field_type = FieldType_Field(required=True, title=MSG('Field type')) # API def build_field(self): @@ -124,7 +124,7 @@ def build_field(self): class Choice(DBResource): class_id = 'model-field-choice' - class_title = MSG(u'Choice') + class_title = MSG('Choice') # Views class_views = ['edit'] @@ -140,28 +140,28 @@ class ModelField_Choices_Browse(OrderedFolder_BrowseContent): table_columns = [ ('checkbox', None), ('icon', None), - ('abspath', MSG(u'Path')), - ('title', MSG(u'Title')), - ('format', MSG(u'Type')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author')), - ('order', MSG(u'Order'))] + ('abspath', MSG('Path')), + ('title', MSG('Title')), + ('format', MSG('Type')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author')), + ('order', MSG('Order'))] table_actions = [Remove_BrowseButton] class ChoicesWidget_Field(Select_Field): - options = [{'name': 'radio-checkbox', 'value': u'Radio/Checkbox'}, - {'name': 'select', 'value': u'Select'}] + options = [{'name': 'radio-checkbox', 'value': 'Radio/Checkbox'}, + {'name': 'select', 'value': 'Select'}] class ModelField_Choices(OrderedFolder, ModelField_Base): class_id = 'model-field-choices' - class_title = MSG(u'Choices field') + class_title = MSG('Choices field') # Fields - choices_widget = ChoicesWidget_Field(title=MSG(u'Widget to use'), + choices_widget = ChoicesWidget_Field(title=MSG('Widget to use'), required=True) def get_document_types(self): @@ -186,7 +186,7 @@ def get_widget(self): # Views class_views = ['browse_content', 'add_choice', 'edit'] browse_content = ModelField_Choices_Browse() - add_choice = NewResource_Local(title=MSG(u'Add choice')) + add_choice = NewResource_Local(title=MSG('Add choice')) _fields = ModelField_Base._fields + ['choices_widget'] new_instance = AutoAdd(fields=_fields, automatic_resource_name=True) @@ -225,12 +225,12 @@ class Model_Browse(OrderedFolder_BrowseContent): table_columns = [ ('checkbox', None), ('icon', None), - ('abspath', MSG(u'Path')), - ('title', MSG(u'Title')), - ('format', MSG(u'Type')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author')), - ('order', MSG(u'Order'))] + ('abspath', MSG('Path')), + ('title', MSG('Title')), + ('format', MSG('Type')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author')), + ('order', MSG('Order'))] table_actions = [Remove_BrowseButton] @@ -238,17 +238,17 @@ class Model_Browse(OrderedFolder_BrowseContent): class Model(OrderedFolder): class_id = '-model' - class_title = MSG(u'Base model') - class_description = MSG(u'...') + class_title = MSG('Base model') + class_description = MSG('...') # Fields - title = Text_Field(indexed=True, stored=True, title=MSG(u'Title'), required=True) + title = Text_Field(indexed=True, stored=True, title=MSG('Title'), required=True) # Views class_views = ['browse_content', 'add_field', 'edit'] browse_content = Model_Browse() new_instance = Model_NewInstance() - add_field = NewResource_Local(title=MSG(u'Add field')) + add_field = NewResource_Local(title=MSG('Add field')) # Order configuration allow_to_unorder_items = True @@ -319,11 +319,11 @@ class ConfigModels_Browse(Folder_BrowseContent): table_columns = [ ('checkbox', None), - ('abspath', MSG(u'Path')), - ('title', MSG(u'Title')), - ('base_class', MSG(u'Base class')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author'))] + ('abspath', MSG('Path')), + ('title', MSG('Title')), + ('base_class', MSG('Base class')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author'))] table_actions = [Remove_BrowseButton] @@ -331,8 +331,8 @@ class ConfigModels_Browse(Folder_BrowseContent): class ConfigModels(Folder): class_id = 'config-models' - class_title = MSG(u'Content models') - class_description = MSG(u'Define new types of content resources.') + class_title = MSG('Content models') + class_description = MSG('Define new types of content resources.') # Configuration config_name = 'models' @@ -341,7 +341,7 @@ class ConfigModels(Folder): # Views class_views = ['browse_content', 'add_model', 'edit'] browse_content = ConfigModels_Browse() - add_model = NewResource_Local(title=MSG(u'Add model')) + add_model = NewResource_Local(title=MSG('Add model')) def get_document_types(self): return [Model] diff --git a/ikaaro/config_register.py b/ikaaro/config_register.py index 4b134d3a3..52c511037 100644 --- a/ikaaro/config_register.py +++ b/ikaaro/config_register.py @@ -22,16 +22,16 @@ from itools.web import STLView # Import from ikaaro -from autoedit import AutoEdit -from autoform import AutoForm -from config import Configuration -from config_captcha import Captcha_Field -from datatypes import BirthDate -from datatypes import Days, Months, Years -from emails import send_email -from fields import Boolean_Field, HTMLFile_Field -from resource_ import DBResource -from widgets import Widget +from .autoedit import AutoEdit +from .autoform import AutoForm +from .config import Configuration +from .config_captcha import Captcha_Field +from .datatypes import BirthDate +from .datatypes import Days, Months, Years +from .emails import send_email +from .fields import Boolean_Field, HTMLFile_Field +from .resource_ import DBResource +from .widgets import Widget class TermsOfService_View(STLView): @@ -48,7 +48,7 @@ def GET(self, resource, context): class TermsOfService_Widget(Widget): template = '/ui/ikaaro/register_terms_of_service.xml' - title = MSG(u'Terms of Service') + title = MSG('Terms of Service') inline = True @@ -56,7 +56,7 @@ class TermsOfService_Widget(Widget): class RegisterForm(AutoForm): access = 'is_allowed_to_register' - title = MSG(u'Create an account') + title = MSG('Create an account') form_id = 'register-form' fields = ['firstname', 'lastname', 'email', 'captcha', 'tos'] @@ -154,7 +154,7 @@ def action(self, resource, context, form): email_id = 'user-ask-for-confirmation' else: # User already registered - user = results.get_resources().next() + user = next(results.get_resources()) email_id = 'register-already-registered' # 2. Send email @@ -162,9 +162,9 @@ def action(self, resource, context, form): # 3. Show message message = MSG( - u'
' - u'An email has been sent to you, to finish the registration ' - u'process follow the instructions detailed in it.
') + '
' + 'An email has been sent to you, to finish the registration ' + 'process follow the instructions detailed in it.
') return message.gettext().encode('utf-8') @@ -172,8 +172,8 @@ def action(self, resource, context, form): class ConfigRegister(DBResource): class_id = 'config-register' - class_title = MSG(u'User registration') - class_description = MSG(u'Configuration of the user registration process.') + class_title = MSG('User registration') + class_description = MSG('Configuration of the user registration process.') class_icon_css = 'fa-user-plus' class_views = ['edit'] @@ -183,7 +183,7 @@ class ConfigRegister(DBResource): # Fields is_open = Boolean_Field(default=False, - title=MSG(u'Users can register by themselves')) + title=MSG('Users can register by themselves')) tos = HTMLFile_Field(title=MSG(u"Terms of service")) # Views diff --git a/ikaaro/config_seo.py b/ikaaro/config_seo.py index bf8faf836..94b8f6c5b 100644 --- a/ikaaro/config_seo.py +++ b/ikaaro/config_seo.py @@ -18,20 +18,20 @@ from itools.gettext import MSG # Import from ikaaro -from autoedit import AutoEdit -from config import Configuration -from fields import Char_Field -from resource_ import DBResource +from .autoedit import AutoEdit +from .config import Configuration +from .fields import Char_Field +from .resource_ import DBResource seo_description = MSG( - u'Optimize your website for better ranking in search engine results.') + 'Optimize your website for better ranking in search engine results.') class SEO(DBResource): class_id = 'config-seo' - class_title = MSG(u'Search Engine Optimization') + class_title = MSG('Search Engine Optimization') class_description = seo_description class_icon16 = '/ui/ikaaro/icons/16x16/search.png' class_icon48 = '/ui/ikaaro/icons/48x48/search.png' @@ -39,16 +39,16 @@ class SEO(DBResource): # Fields google_site_verification = Char_Field( - title=MSG(u'Google site verification key')) + title=MSG('Google site verification key')) yahoo_site_verification = Char_Field( - title=MSG(u'Yahoo site verification key')) + title=MSG('Yahoo site verification key')) bing_site_verification = Char_Field( - title=MSG(u'Bing site verification key')) + title=MSG('Bing site verification key')) # Views class_views = ['edit'] - edit = AutoEdit(title=MSG(u'Search engine optimization'), + edit = AutoEdit(title=MSG('Search engine optimization'), description=seo_description, fields=['google_site_verification', 'yahoo_site_verification', diff --git a/ikaaro/config_theme.py b/ikaaro/config_theme.py old mode 100644 new mode 100755 index 1538a28a0..257432660 --- a/ikaaro/config_theme.py +++ b/ikaaro/config_theme.py @@ -21,24 +21,24 @@ from itools.handlers import TextFile # Import from ikaaro -from autoedit import AutoEdit -from config import Configuration -from fields import File_Field, TextFile_Field -from folder import Folder +from .autoedit import AutoEdit +from .config import Configuration +from .fields import File_Field, TextFile_Field +from .folder import Folder class Theme(Folder): class_id = 'config-theme' - class_title = MSG(u'Theme') - class_description = MSG(u'Allow to customize ikaaro skin') + class_title = MSG('Theme') + class_description = MSG('Allow to customize ikaaro skin') class_icon_css = 'fa-star' # Fields - logo = File_Field(title=MSG(u'Logo')) - favicon = File_Field(title=MSG(u'Favicon')) - banner = File_Field(title=MSG(u'Banner')) - style = TextFile_Field(title=MSG(u'CSS Style'), class_handler=TextFile) + logo = File_Field(title=MSG('Logo')) + favicon = File_Field(title=MSG('Favicon')) + banner = File_Field(title=MSG('Banner')) + style = TextFile_Field(title=MSG('CSS Style'), class_handler=TextFile) def init_resource(self, **kw): @@ -51,11 +51,11 @@ def init_resource(self, **kw): self.set_value('style', data) # Logo path = get_abspath('ui/ikaaro/themes/logo.png') - data = open(path).read() + data = open(path, "rb").read() self.set_value('logo', data) # Banner path = get_abspath('ui/ikaaro/themes/banner.jpg') - data = open(path).read() + data = open(path, "rb").read() self.set_value('banner', data) # Views diff --git a/ikaaro/context.py b/ikaaro/context.py index 4324ce5cf..dfa90b91f 100644 --- a/ikaaro/context.py +++ b/ikaaro/context.py @@ -18,11 +18,15 @@ from datetime import datetime import json from logging import getLogger -from pytz import timezone import time +#Import from packages +from pytz import timezone from jwcrypto.jwt import JWT, JWTExpired from jwcrypto.jws import InvalidJWSSignature, InvalidJWSObject +from requests_toolbelt import MultipartDecoder +import cgi + # Import from itools from itools.core import freeze, proto_lazy_property from itools.core import fixed_offset, is_prototype, local_tz @@ -44,10 +48,11 @@ from itools.web.exceptions import JWTExpiredException # Import from ikaaro -from skins import skin_registry -from constants import JWT_EXPIRE, JWT_ISSUER -from constants import SESSION_KEY -from server import get_server +from .skins import skin_registry +from .constants import JWT_EXPIRE, JWT_ISSUER +from .constants import SESSION_KEY +from .server import get_server +from .utils import dict_of_bytes_to_string log = getLogger("ikaaro.web") @@ -325,7 +330,8 @@ def get_form(self): if self.method in ('GET', 'HEAD'): return self.uri.query # XXX What parameters with the fields defined in the query? - return self.body + new_data = dict_of_bytes_to_string(self.body) + return new_data def accept_cors(self): @@ -464,7 +470,7 @@ def get_form_value(self, name, type=String, default=None): def get_form_keys(self): - return self.get_form().keys() + return list(self.get_form().keys()) def get_form_body(self, body): @@ -497,7 +503,7 @@ def get_body_from_environ(self): return self.get_json_body(body) elif content_type.startswith('multipart/'): # Case 3: multipart - return self.get_multipart_body(body) + return self.get_multipart_body_v2(body) elif content_type.startswith('application/'): return {'body': body} # Case 4: Not managed content type @@ -542,6 +548,50 @@ def get_multipart_body(self, body): form[name] = [form[name], body] return form + def get_multipart_body_v2(self, body): + """ + FORM return example : + {'cls_description': 'Importer des documents bureautiques, des images, des fichiers de média, etc.', 'referrer': 'http://127.0.0.1:8081/', 'data': ('test.txt', 'text/plain', 'test fichier\n\n'), 'title:fr': ''} + """ + + content_type = self.environ.get('CONTENT_TYPE') + decoder = MultipartDecoder(body, content_type) + form = {} + for part in decoder.parts: + content_disposition = part.headers[b"Content-Disposition"] + if type(content_disposition) is bytes: + content_disposition = content_disposition.decode() + value, header_parameters = cgi.parse_header(content_disposition) + try: + body = part.text + except: + # Image encoding + body = part.content + pass + name = header_parameters['name'] + if 'filename' in header_parameters: + filename = header_parameters['filename'] + if filename: + if b'content-type' in part.headers: + mimetype = part.headers[b'content-type'] + if type(mimetype) is bytes: + mimetype = mimetype.decode() + else: + mimetype = 'text/plain' + form[name] = filename, mimetype, body + else: + form[name] = None + else: + if name not in form: + form[name] = body + else: + if isinstance(form[name], list): + form[name].append(body) + else: + form[name] = [form[name], body] + return form + + ####################################################################### # ACL API ####################################################################### @@ -592,9 +642,13 @@ def search(self, query=None, user=None, **kw): # If the search is done by a CRON we don't # care about the default ACLs rules return self.database.search(query) + if user is None: - return self._context_user_search.search(query, **kw) - return self._user_search(user).search(query, **kw) + _user_search = self._context_user_search + else: + _user_search = self._user_search(user) + + return _user_search.search(query, **kw) ####################################################################### # Login API @@ -695,7 +749,7 @@ def decode_bearer(self, bearer): if jwt: jwt_payload = json.loads(jwt.token.objects['payload']) user = jwt_payload.get('id') - return user.encode("utf-8") + return user def get_authentication_credentials(self): @@ -824,7 +878,7 @@ def format_time(self, time): return format_time(time, accept=self.accept_language) - def format_number(self, number, places=2, curr='', pos=u'', neg=u'-', + def format_number(self, number, places=2, curr='', pos='', neg='-', trailneg=u""): return format_number(number, places=places, curr=curr, pos=pos, neg=neg, trailneg=trailneg, accept=self.accept_language) diff --git a/ikaaro/database.py b/ikaaro/database.py index 931b71513..a065c2ada 100644 --- a/ikaaro/database.py +++ b/ikaaro/database.py @@ -69,7 +69,7 @@ def __init__( ROSEM.acquire() else: DBSEM.acquire() - from server import get_server + from .server import get_server self.context = cls() self.context.database = database self.context.server = get_server() @@ -84,7 +84,7 @@ def __init__( ) search = database.search(query) if search: - user = search.get_resources(size=1).next() + user = next(search.get_resources(size=1)) # Get user by username if username: user = self.context.root.get_user(username) @@ -167,7 +167,7 @@ def _before_commit(self): # should this be done? old2new = [ (s, t) for s, t in self.resources_old2new.items() if t and s != t ] - old2new.sort(key=lambda x: x[1]) # Sort by target + old2new = sorted(old2new, key=lambda x: x[1]) # Sort by target for source, target in old2new: target = Path(target) resource = root.get_resource(target) @@ -194,7 +194,7 @@ def _before_commit(self): # 3. Documents to unindex (the update_links methods calls # 'change_resource' which may modify the resources_old2new dictionary) - docs_to_unindex = self.resources_old2new.keys() + docs_to_unindex = list(self.resources_old2new.keys()) self.resources_old2new.clear() # 4. Update mtime/last_author @@ -212,7 +212,7 @@ def _before_commit(self): # Remove from to_reindex if resource has been deleted to_reindex = to_reindex - set(docs_to_unindex) # 5. Index - docs_to_index = self.resources_new2old.keys() + docs_to_index = list(self.resources_new2old.keys()) docs_to_index = set(docs_to_index) | to_reindex docs_to_unindex = list(set(docs_to_unindex) - docs_to_index) docs_to_index = list(docs_to_index) diff --git a/ikaaro/datatypes.py b/ikaaro/datatypes.py index f0e051edb..0da541724 100644 --- a/ikaaro/datatypes.py +++ b/ikaaro/datatypes.py @@ -18,10 +18,10 @@ from datetime import date # Import from the Standard Library -from base64 import decodestring, encodestring +from base64 import decodebytes, encodebytes from datetime import timedelta from marshal import dumps, loads -from urllib import quote, unquote +from urllib.parse import quote, unquote from zlib import compress, decompress # Import from itools @@ -80,12 +80,16 @@ class Password_Datatype(DataType): @staticmethod def decode(data): - return decodestring(unquote(data)) + data = unquote(data) + data = data.encode() + return decodebytes(data) @staticmethod def encode(value): - return quote(encodestring(value)) + if type(value) is str: + value = value.encode("utf-8") + return quote(encodebytes(value)) class ChoosePassword_Datatype(String): @@ -175,7 +179,7 @@ class HTMLBody(XHTMLBody): def encode(value): if value is None: return '' - if type(value) is unicode: + if type(value) is str: return value.encode('utf-8') if not is_xml_stream(value): value = value.get_body().get_content_elements() @@ -187,25 +191,25 @@ def encode(value): # Enumerates ########################################################################### days = { - 0: MSG(u'Monday'), - 1: MSG(u'Tuesday'), - 2: MSG(u'Wednesday'), - 3: MSG(u'Thursday'), - 4: MSG(u'Friday'), - 5: MSG(u'Saturday'), - 6: MSG(u'Sunday')} + 0: MSG('Monday'), + 1: MSG('Tuesday'), + 2: MSG('Wednesday'), + 3: MSG('Thursday'), + 4: MSG('Friday'), + 5: MSG('Saturday'), + 6: MSG('Sunday')} class DaysOfWeek(Enumerate): options = [ - {'name':'1', 'value': MSG(u'Monday'), 'shortname': 'MO'}, - {'name':'2', 'value': MSG(u'Tuesday'), 'shortname': 'TU'}, - {'name':'3', 'value': MSG(u'Wednesday'), 'shortname': 'WE'}, - {'name':'4', 'value': MSG(u'Thursday'), 'shortname': 'TH'}, - {'name':'5', 'value': MSG(u'Friday'), 'shortname': 'FR'}, - {'name':'6', 'value': MSG(u'Saturday'), 'shortname': 'SA'}, - {'name':'7', 'value': MSG(u'Sunday'), 'shortname': 'SU'}] + {'name': '1', 'value': MSG('Monday'), 'shortname': 'MO'}, + {'name': '2', 'value': MSG('Tuesday'), 'shortname': 'TU'}, + {'name': '3', 'value': MSG('Wednesday'), 'shortname': 'WE'}, + {'name': '4', 'value': MSG('Thursday'), 'shortname': 'TH'}, + {'name': '5', 'value': MSG('Friday'), 'shortname': 'FR'}, + {'name': '6', 'value': MSG('Saturday'), 'shortname': 'SA'}, + {'name': '7', 'value': MSG('Sunday'), 'shortname': 'SU'}] @classmethod def get_shortname(cls, name): @@ -226,13 +230,13 @@ class Boolean3(Enumerate): """ Boolean 3 states : Yes/No/Any useful on search form.""" default = '' options = [ - #{'name': '', 'value': u''}, - {'name': '1', 'value': MSG(u'Yes')}, - {'name': '0', 'value': MSG(u'No')}] + #{'name': '', 'value': ''}, + {'name': '1', 'value': MSG('Yes')}, + {'name': '0', 'value': MSG('No')}] @staticmethod def decode(value): - if value is '': + if value == '': return None return bool(int(value)) @@ -276,18 +280,18 @@ class Days(IntegerRange): class Months(Enumerate): options = [ - {'name': '1', 'value': MSG(u'January')}, - {'name': '2', 'value': MSG(u'February')}, - {'name': '3', 'value': MSG(u'March')}, - {'name': '4', 'value': MSG(u'April')}, - {'name': '5', 'value': MSG(u'May')}, - {'name': '6', 'value': MSG(u'June')}, - {'name': '7', 'value': MSG(u'July')}, - {'name': '8', 'value': MSG(u'August')}, - {'name': '9', 'value': MSG(u'September')}, - {'name': '10', 'value': MSG(u'October')}, - {'name': '11', 'value': MSG(u'November')}, - {'name': '12', 'value': MSG(u'December')}] + {'name': '1', 'value': MSG('January')}, + {'name': '2', 'value': MSG('February')}, + {'name': '3', 'value': MSG('March')}, + {'name': '4', 'value': MSG('April')}, + {'name': '5', 'value': MSG('May')}, + {'name': '6', 'value': MSG('June')}, + {'name': '7', 'value': MSG('July')}, + {'name': '8', 'value': MSG('August')}, + {'name': '9', 'value': MSG('September')}, + {'name': '10', 'value': MSG('October')}, + {'name': '11', 'value': MSG('November')}, + {'name': '12', 'value': MSG('December')}] @@ -297,5 +301,5 @@ class Years(Enumerate): @classmethod def get_options(cls): - return [ {'name': str(d), 'value': str(d)} - for d in range(cls.start, date.today().year) ] + return [{'name': str(d), 'value': str(d)} + for d in range(cls.start, date.today().year)] diff --git a/ikaaro/emails/__init__.py b/ikaaro/emails/__init__.py index 481d8a0de..935cceae0 100644 --- a/ikaaro/emails/__init__.py +++ b/ikaaro/emails/__init__.py @@ -15,4 +15,4 @@ # along with this program. If not, see . # Import from here -from emails import register_email, send_email, emails_registry, Email +from .emails import register_email, send_email, emails_registry, Email diff --git a/ikaaro/emails/emails.py b/ikaaro/emails/emails.py index 5b0f1fe5e..e8c914734 100644 --- a/ikaaro/emails/emails.py +++ b/ikaaro/emails/emails.py @@ -90,69 +90,69 @@ class User_AskForConfirmation(User_Email): """ class_id = 'user-ask-for-confirmation' - subject = MSG(u'Registration confirmation') + subject = MSG('Registration confirmation') text = MSG( - u'To confirm your identity, follow this link:\n' - u'\n' - u' {user}/;confirm_registration?username={userid}&key={userkey}') + 'To confirm your identity, follow this link:\n' + '\n' + ' {user}/;confirm_registration?username={userid}&key={userkey}') class AddUser_SendNotification(User_Email): class_id = 'add-user-send-notification' - subject = MSG(u'Registration notification') + subject = MSG('Registration notification') text = MSG( - u'You have been registered to the "{host_title}" site:\n' - u'\n' - u' {host}/') + 'You have been registered to the "{host_title}" site:\n' + '\n' + ' {host}/') class Register_AlreadyRegistered(User_Email): class_id = 'register-already-registered' - subject = MSG(u"Already registered") + subject = MSG("Already registered") text = MSG( - u'You already have an account:\n' - u'\n' - u' {host}/;login?loginname={userid}') + 'You already have an account:\n' + '\n' + ' {host}/;login?loginname={userid}') class Register_SendConfirmation(User_Email): class_id = 'register-send-confirmation' - subject = MSG(u"Registration confirmed") + subject = MSG("Registration confirmed") text = MSG( - u'You have been registered to the "{host_title}" site:\n' - u'\n' - u' {host}/') + 'You have been registered to the "{host_title}" site:\n' + '\n' + ' {host}/') class ForgottenPassword_AskForConfirmation(User_Email): class_id = 'forgotten-password-ask-for-confirmation' - subject = MSG(u"Choose a new password") + subject = MSG("Choose a new password") text = MSG( - u'To choose a new password, click the link:\n' - u'\n' - u' {user}/;change_password_forgotten?username={userid}&key={userkey}') + 'To choose a new password, click the link:\n' + '\n' + ' {user}/;change_password_forgotten?username={userid}&key={userkey}') class SwitchState_Activate(User_Email): class_id = 'switch-state-activate' - subject = MSG(u'Your account has been re-activated') - text = MSG(u'Your account has been re-activated') + subject = MSG('Your account has been re-activated') + text = MSG('Your account has been re-activated') class SwitchState_Deactivate(User_Email): class_id = 'switch-state-deactivate' - subject = MSG(u'Your account has been canceled') - text = MSG(u'Your account has been canceled') + subject = MSG('Your account has been canceled') + text = MSG('Your account has been canceled') # Registry diff --git a/ikaaro/enumerates.py b/ikaaro/enumerates.py index b02c1c5ea..2e2e98cb2 100644 --- a/ikaaro/enumerates.py +++ b/ikaaro/enumerates.py @@ -20,7 +20,7 @@ from itools.web import get_context # Import from ikaaro -from fields import Abspath_Field +from .fields import Abspath_Field ########################################################################### @@ -70,8 +70,8 @@ class UserGroups_Datatype(DynamicEnumerate_Datatype): class Groups_Datatype(UserGroups_Datatype): special_groups = [ - {'name': 'everybody', 'value': MSG(u'Everybody')}, - {'name': 'authenticated', 'value': MSG(u'Authenticated')}] + {'name': 'everybody', 'value': MSG('Everybody')}, + {'name': 'authenticated', 'value': MSG('Authenticated')}] def get_options(self): diff --git a/ikaaro/exceptions.py b/ikaaro/exceptions.py index 4243f221b..4336447a7 100644 --- a/ikaaro/exceptions.py +++ b/ikaaro/exceptions.py @@ -16,10 +16,10 @@ # TODO Move this exception to itools -class ParserError(StandardError): +class ParserError(Exception): pass # TODO Move this exception to itools -class ConsistencyError(StandardError): +class ConsistencyError(Exception): pass diff --git a/ikaaro/fields.py b/ikaaro/fields.py old mode 100644 new mode 100755 index 5bab5a9b0..0e5b2db31 --- a/ikaaro/fields.py +++ b/ikaaro/fields.py @@ -34,16 +34,16 @@ from itools.xml import START_ELEMENT # Import from ikaaro -from datatypes import Boolean3, BirthDate, HexadecimalColor, HTMLBody -from datatypes import Password_Datatype, ChoosePassword_Datatype -from datatypes import DaysOfWeek -from links import get_abspath_links, update_abspath_links -from utils import split_reference, get_secure_hash -from widgets import Widget, FileWidget, MultilineWidget, TextWidget -from widgets import CheckboxWidget, RadioWidget, SelectWidget -from widgets import BirthDateWidget, DateWidget, DatetimeWidget -from widgets import PasswordWidget, ChoosePassword_Widget -from widgets import ColorPickerWidget, ProgressBarWidget, RTEWidget +from .datatypes import Boolean3, BirthDate, HexadecimalColor, HTMLBody +from .datatypes import Password_Datatype, ChoosePassword_Datatype +from .datatypes import DaysOfWeek +from .links import get_abspath_links, update_abspath_links +from .utils import split_reference, get_secure_hash +from .widgets import Widget, FileWidget, MultilineWidget, TextWidget +from .widgets import CheckboxWidget, RadioWidget, SelectWidget +from .widgets import BirthDateWidget, DateWidget, DatetimeWidget +from .widgets import PasswordWidget, ChoosePassword_Widget +from .widgets import ColorPickerWidget, ProgressBarWidget, RTEWidget class Field(BaseField): @@ -198,7 +198,7 @@ def _set_value(self, resource, name, value, language=None, **kw): def rest(self): rest = super(Metadata_Field, self).rest() - rest['parameters'] = self.parameters_schema.keys() + rest['parameters'] = list(self.parameters_schema.keys()) return rest @@ -232,9 +232,9 @@ def get_value(self, resource, name, language=None): class Char_Field(Metadata_Field): - datatype = String() + datatype = Unicode() widget = TextWidget() - rest_type = 'bytes' + rest_type = 'bytes' # XXX class Color_Field(Metadata_Field): @@ -655,7 +655,7 @@ def _get_handler_from_value(self, value): if type(value) is tuple: filename, mimetype, value = value - if type(value) is str: + if type(value) in [bytes, str]: cls = self.class_handler if cls is None: mimetype = magic_from_buffer(value) @@ -860,7 +860,7 @@ class SelectDays_Field(Select_Field): class UUID_Field(Char_Field): - title = MSG(u'UUID') + title = MSG('UUID') indexed = True stored = True readonly = True @@ -869,7 +869,7 @@ class UUID_Field(Char_Field): class CTime_Field(Datetime_Field): - title = MSG(u'Creation date') + title = MSG('Creation date') indexed = True stored = True readonly = True @@ -878,7 +878,7 @@ class CTime_Field(Datetime_Field): class MTime_Field(Datetime_Field): - title = MSG(u'Modification date') + title = MSG('Modification date') indexed = True stored = True readonly = True @@ -887,7 +887,7 @@ class MTime_Field(Datetime_Field): class LastAuthor_Field(Char_Field): - title = MSG(u'Last author') + title = MSG('Last author') indexed = False stored = True readonly = True @@ -896,7 +896,7 @@ class LastAuthor_Field(Char_Field): class Title_Field(Text_Field): - title = MSG(u'Title') + title = MSG('Title') indexed = True stored = True @@ -904,12 +904,12 @@ class Title_Field(Text_Field): class Description_Field(Textarea_Field): - title = MSG(u'Description') + title = MSG('Description') indexed = True class Subject_Field(Text_Field): - title = MSG(u'Keywords') + title = MSG('Keywords') indexde = True diff --git a/ikaaro/file.py b/ikaaro/file.py index 425a45e1e..b15e2bfda 100644 --- a/ikaaro/file.py +++ b/ikaaro/file.py @@ -34,15 +34,15 @@ from itools.web import get_context # Import from ikaaro -from database import Database -from fields import Char_Field, File_Field, Owner_Field -from file_views import File_NewInstance, File_View -from file_views import File_Edit, File_ExternalEdit, File_ExternalEdit_View -from file_views import File_Download -from file_views import Image_View, Video_View, Archive_View -from file_views import Flash_View -from resource_ import DBResource -from resource_views import DBResource_GetImage +from .database import Database +from .fields import Char_Field, File_Field, Owner_Field +from .file_views import File_NewInstance, File_View +from .file_views import File_Edit, File_ExternalEdit, File_ExternalEdit_View +from .file_views import File_Download +from .file_views import Image_View, Video_View, Archive_View +from .file_views import Flash_View +from .resource_ import DBResource +from .resource_views import DBResource_GetImage @@ -53,9 +53,9 @@ class File(DBResource): class_id = 'file' class_version = '20090122' - class_title = MSG(u'File') + class_title = MSG('File') class_description = MSG( - u'Upload office documents, images, media files, etc.') + 'Upload office documents, images, media files, etc.') class_icon16 = '/ui/ikaaro/icons/16x16/file.png' class_icon48 = '/ui/ikaaro/icons/48x48/file.png' class_views = ['view', 'edit', 'externaledit', 'remove', 'subscribe', @@ -89,7 +89,7 @@ def get_all_extensions(self): ####################################################################### def to_text(self): data = self.get_value('data') - return data and data.to_text() or u'' + return data and data.to_text() or '' def get_files_to_archive(self, content=False): @@ -123,7 +123,7 @@ def get_content_type(self): class Image(File): class_id = 'image' - class_title = MSG(u'Image') + class_title = MSG('Image') class_icon16 = '/ui/ikaaro/icons/16x16/image.png' class_icon48 = '/ui/ikaaro/icons/48x48/image.png' class_views = ['view', 'download', 'edit', 'externaledit', 'remove', @@ -169,7 +169,7 @@ def init_resource(self, **kw): class SVG(Image): class_id = 'image/svg+xml' - class_title = MSG(u'Image SVG') + class_title = MSG('Image SVG') # Fields data = File_Field(required=True, class_handler=SVGFile) @@ -179,8 +179,8 @@ class SVG(Image): class Video(File): class_id = 'video' - class_title = MSG(u'Video') - class_description = MSG(u'Video') + class_title = MSG('Video') + class_description = MSG('Video') class_icon16 = '/ui/ikaaro/icons/16x16/flash.png' class_icon48 = '/ui/ikaaro/icons/48x48/flash.png' @@ -192,8 +192,8 @@ class Video(File): class Flash(File): class_id = 'application/x-shockwave-flash' - class_title = MSG(u'Flash') - class_description = MSG(u'Flash Document') + class_title = MSG('Flash') + class_description = MSG('Flash Document') class_icon16 = '/ui/ikaaro/icons/16x16/flash.png' class_icon48 = '/ui/ikaaro/icons/48x48/flash.png' @@ -208,8 +208,8 @@ class Flash(File): class MSWord(File): class_id = 'application/msword' - class_title = MSG(u'Word') - class_description = MSG(u'Word Text') + class_title = MSG('Word') + class_description = MSG('Word Text') class_icon16 = '/ui/ikaaro/icons/16x16/word.png' class_icon48 = '/ui/ikaaro/icons/48x48/word.png' @@ -221,8 +221,8 @@ class MSWord(File): class MSExcel(File): class_id = 'application/vnd.ms-excel' - class_title = MSG(u'Excel') - class_description = MSG(u'Excel Spreadsheet') + class_title = MSG('Excel') + class_description = MSG('Excel Spreadsheet') class_icon16 = '/ui/ikaaro/icons/16x16/excel.png' class_icon48 = '/ui/ikaaro/icons/48x48/excel.png' @@ -234,8 +234,8 @@ class MSExcel(File): class MSPowerPoint(File): class_id = 'application/vnd.ms-powerpoint' - class_title = MSG(u'PowerPoint') - class_description = MSG(u'PowerPoint Presentation') + class_title = MSG('PowerPoint') + class_description = MSG('PowerPoint Presentation') class_icon16 = '/ui/ikaaro/icons/16x16/powerpoint.png' class_icon48 = '/ui/ikaaro/icons/48x48/powerpoint.png' @@ -247,8 +247,8 @@ class MSPowerPoint(File): class MSWordX(File): class_id = MSWordXFile.class_mimetypes[0] - class_title = MSG(u'Word') - class_description = MSG(u'Word Text') + class_title = MSG('Word') + class_description = MSG('Word Text') class_icon16 = '/ui/ikaaro/icons/16x16/word.png' class_icon48 = '/ui/ikaaro/icons/48x48/word.png' @@ -260,8 +260,8 @@ class MSWordX(File): class MSExcelX(File): class_id = MSExcelXFile.class_mimetypes[0] - class_title = MSG(u'Excel') - class_description = MSG(u'Excel Spreadsheet') + class_title = MSG('Excel') + class_description = MSG('Excel Spreadsheet') class_icon16 = '/ui/ikaaro/icons/16x16/excel.png' class_icon48 = '/ui/ikaaro/icons/48x48/excel.png' @@ -273,8 +273,8 @@ class MSExcelX(File): class MSPowerPointX(File): class_id = MSPowerPointXFile.class_mimetypes[0] - class_title = MSG(u'PowerPoint') - class_description = MSG(u'PowerPoint Presentation') + class_title = MSG('PowerPoint') + class_description = MSG('PowerPoint Presentation') class_icon16 = '/ui/ikaaro/icons/16x16/powerpoint.png' class_icon48 = '/ui/ikaaro/icons/48x48/powerpoint.png' @@ -286,8 +286,8 @@ class MSPowerPointX(File): class OOWriter(File): class_id = 'application/vnd.sun.xml.writer' - class_title = MSG(u'OOo Writer') - class_description = MSG(u'OpenOffice.org Text') + class_title = MSG('OOo Writer') + class_description = MSG('OpenOffice.org Text') class_icon16 = '/ui/ikaaro/icons/16x16/oowriter.png' class_icon48 = '/ui/ikaaro/icons/48x48/oowriter.png' @@ -299,8 +299,8 @@ class OOWriter(File): class OOCalc(File): class_id = 'application/vnd.sun.xml.calc' - class_title = MSG(u'OOo Calc') - class_description = MSG(u'OpenOffice.org Spreadsheet') + class_title = MSG('OOo Calc') + class_description = MSG('OpenOffice.org Spreadsheet') class_icon16 = '/ui/ikaaro/icons/16x16/oocalc.png' class_icon48 = '/ui/ikaaro/icons/48x48/oocalc.png' # Fields @@ -310,8 +310,8 @@ class OOCalc(File): class OOImpress(File): class_id = 'application/vnd.sun.xml.impress' - class_title = MSG(u'OOo Impress') - class_description = MSG(u'OpenOffice.org Presentation') + class_title = MSG('OOo Impress') + class_description = MSG('OpenOffice.org Presentation') class_icon16 = '/ui/ikaaro/icons/16x16/ooimpress.png' class_icon48 = '/ui/ikaaro/icons/48x48/ooimpress.png' # Fields @@ -321,8 +321,8 @@ class OOImpress(File): class PDF(File): class_id = 'application/pdf' - class_title = MSG(u'PDF') - class_description = MSG(u'PDF Document') + class_title = MSG('PDF') + class_description = MSG('PDF Document') class_icon16 = '/ui/ikaaro/icons/16x16/pdf.png' class_icon48 = '/ui/ikaaro/icons/48x48/pdf.png' # Fields @@ -333,7 +333,7 @@ class PDF(File): class RTF(File): class_id = 'text/rtf' class_title = MSG(u"RTF") - class_description = MSG(u'RTF Document') + class_description = MSG('RTF Document') class_icon16 = '/ui/ikaaro/icons/16x16/text.png' class_icon48 = '/ui/ikaaro/icons/48x48/text.png' # Fields @@ -343,8 +343,8 @@ class RTF(File): class ODT(File): class_id = 'application/vnd.oasis.opendocument.text' - class_title = MSG(u'ODT') - class_description = MSG(u'OpenDocument Text') + class_title = MSG('ODT') + class_description = MSG('OpenDocument Text') class_icon16 = '/ui/ikaaro/icons/16x16/odt.png' class_icon48 = '/ui/ikaaro/icons/48x48/odt.png' # Fields @@ -354,8 +354,8 @@ class ODT(File): class ODS(File): class_id = 'application/vnd.oasis.opendocument.spreadsheet' - class_title = MSG(u'ODS') - class_description = MSG(u'OpenDocument Spreadsheet') + class_title = MSG('ODS') + class_description = MSG('OpenDocument Spreadsheet') class_icon16 = '/ui/ikaaro/icons/16x16/ods.png' class_icon48 = '/ui/ikaaro/icons/48x48/ods.png' # Fields @@ -365,8 +365,8 @@ class ODS(File): class ODP(File): class_id = 'application/vnd.oasis.opendocument.presentation' - class_title = MSG(u'ODP') - class_description = MSG(u'OpenDocument Presentation') + class_title = MSG('ODP') + class_description = MSG('OpenDocument Presentation') class_icon16 = '/ui/ikaaro/icons/16x16/odp.png' class_icon48 = '/ui/ikaaro/icons/48x48/odp.png' # Fields @@ -386,7 +386,7 @@ class Archive(File): class ZipArchive(Archive): class_id = 'application/zip' class_title = MSG(u"Zip") - class_description = MSG(u'Zip Archive') + class_description = MSG('Zip Archive') class_icon16 = '/ui/ikaaro/icons/16x16/zip.png' class_icon48 = '/ui/ikaaro/icons/48x48/zip.png' # Fields @@ -397,7 +397,7 @@ class ZipArchive(Archive): class TarArchive(Archive): class_id = 'application/x-tar' class_title = MSG(u"Tar") - class_description = MSG(u'Tar Archive') + class_description = MSG('Tar Archive') class_icon16 = '/ui/ikaaro/icons/16x16/tar.png' class_icon48 = '/ui/ikaaro/icons/48x48/tar.png' # Fields @@ -408,7 +408,7 @@ class TarArchive(Archive): class Gzip(File): class_id = 'application/x-gzip' class_title = MSG(u"Gzip") - class_description = MSG(u'Gzip Compressed') + class_description = MSG('Gzip Compressed') class_icon16 = '/ui/ikaaro/icons/16x16/gzip.png' class_icon48 = '/ui/ikaaro/icons/48x48/gzip.png' # Fields @@ -419,7 +419,7 @@ class Gzip(File): class Bzip2(File): class_id = 'application/x-bzip2' class_title = MSG(u"Bzip2") - class_description = MSG(u'Bzip2 Compressed') + class_description = MSG('Bzip2 Compressed') class_icon16 = '/ui/ikaaro/icons/16x16/bzip.png' class_icon48 = '/ui/ikaaro/icons/48x48/bzip.png' # Fields diff --git a/ikaaro/file_views.py b/ikaaro/file_views.py index 8895b8230..1214b1970 100644 --- a/ikaaro/file_views.py +++ b/ikaaro/file_views.py @@ -28,18 +28,18 @@ from itools.web import BaseView, STLView, ERROR, FormError # Import from ikaaro -from autoadd import AutoAdd -from autoedit import AutoEdit -from fields import ProgressBar_Field -from folder import Folder -from resource_views import DBResource_GetFile -from utils import process_name -from widgets import PathSelectorWidget +from .autoadd import AutoAdd +from .autoedit import AutoEdit +from .fields import ProgressBar_Field +from .folder import Folder +from .resource_views import DBResource_GetFile +from .utils import process_name +from .widgets import PathSelectorWidget class File_NewInstance(AutoAdd): - title = MSG(u'Upload File') + title = MSG('Upload File') fields = ['data', 'title', 'progressbar'] progressbar = ProgressBar_Field @@ -74,7 +74,7 @@ def make_new_resource(self, resource, context, form): class File_View(STLView): access = 'is_allowed_to_view' - title = MSG(u'Download') + title = MSG('Download') icon = 'view.png' template = '/ui/ikaaro/file/download_form.xml' @@ -104,7 +104,7 @@ def get_field(self, resource, name): class File_Download(DBResource_GetFile): field_name = 'data' - title = MSG(u'Download') + title = MSG('Download') def get_filename(self, handler, field_name, resource): @@ -123,7 +123,7 @@ def get_content_type(self, handler): class File_ExternalEdit_View(STLView): access = 'is_allowed_to_edit' template = '/ui/ikaaro/file/externaledit.xml' - title = MSG(u'External Editor') + title = MSG('External Editor') icon = 'external.png' @@ -190,7 +190,7 @@ def GET(self, resource, context): class Image_View(STLView): access = 'is_allowed_to_view' - title = MSG(u'View') + title = MSG('View') template = '/ui/ikaaro/binary/Image_view.xml' styles = ['/ui/ikaaro/gallery/style.css'] @@ -238,7 +238,7 @@ def get_namespace(self, resource, context): class Video_View(STLView): access = 'is_allowed_to_view' - title = MSG(u'View') + title = MSG('View') template = '/ui/ikaaro/binary/Video_view.xml' scripts = ['/ui/ikaaro/js/jquery.media.js'] @@ -251,14 +251,14 @@ def get_namespace(self, resource, context): class Archive_View(STLView): access = 'is_allowed_to_view' - title = MSG(u'View') + title = MSG('View') template = '/ui/ikaaro/binary/Archive_view.xml' schema = {'target': PathDataType, 'update': Boolean} def get_namespace(self, resource, context): filename = resource.get_value('filename') or resource.get_title() - contents = [ process_name(x)[1] + u'\n' + contents = [ process_name(x)[1] + '\n' for x in resource.get_value('data').get_contents() ] contents = ''.join(contents) # Extract archive @@ -279,9 +279,9 @@ def _get_form(self, resource, context): target = form['target'] target = resource.get_resource(target, soft=True) if target is None: - raise FormError(ERROR(u'Target does not exist.')) + raise FormError(ERROR('Target does not exist.')) if isinstance(target, Folder) is False: - raise FormError(ERROR(u'Target must be a folder.')) + raise FormError(ERROR('Target must be a folder.')) return form @@ -290,7 +290,7 @@ def action(self, resource, context, form): # Get the list of paths to extract handler = resource.get_value('data') paths = handler.get_contents() - paths.sort() + paths = sorted(paths) # Get the target resource target = form['target'] @@ -301,7 +301,7 @@ def action(self, resource, context, form): target.extract_archive(handler, language, update=form['update']) # Ok - message = MSG(u'Files extracted') + message = MSG('Files extracted') goto = context.get_link(target) return context.come_back(message, goto=goto) @@ -310,5 +310,5 @@ def action(self, resource, context, form): class Flash_View(File_View): access = 'is_allowed_to_view' - title = MSG(u'View') + title = MSG('View') template = '/ui/ikaaro/binary/Flash_view.xml' diff --git a/ikaaro/folder.py b/ikaaro/folder.py index 061692fdf..930170417 100644 --- a/ikaaro/folder.py +++ b/ikaaro/folder.py @@ -21,7 +21,8 @@ # Import from the Standard Library import fnmatch -from cStringIO import StringIO +from logging import getLogger +from io import StringIO from os.path import basename, dirname from zipfile import ZipFile import uuid @@ -40,26 +41,26 @@ from itools.web.exceptions import FormError # Import from ikaaro -from views.folder_views import Folder_BrowseContent, Folder_PreviewContent -from views.folder_views import Folder_Rename, Folder_NewResource, Folder_Thumbnail +from .views.folder_views import Folder_BrowseContent, Folder_PreviewContent +from .views.folder_views import Folder_Rename, Folder_NewResource, Folder_Thumbnail # Import from ikaaro -from autoedit import AutoEdit -from database import Database -from datatypes import guess_mimetype -from exceptions import ConsistencyError -from messages import MSG_NAME_CLASH -from resource_ import DBResource -from utils import process_name, tidy_html, get_base_path_query - +from .autoedit import AutoEdit +from .database import Database +from .datatypes import guess_mimetype +from .exceptions import ConsistencyError +from .messages import MSG_NAME_CLASH +from .resource_ import DBResource +from .utils import process_name, tidy_html, get_base_path_query +log = getLogger("ikaaro") class Folder(DBResource): class_id = "folder" class_version = "20071215" - class_title = MSG(u"Folder") - class_description = MSG(u"Organize your files and documents with folders.") + class_title = MSG("Folder") + class_description = MSG("Organize your files and documents with folders.") class_icon16 = "/ui/ikaaro/icons/16x16/folder.png" class_icon48 = "/ui/ikaaro/icons/48x48/folder.png" class_views = [ @@ -99,7 +100,12 @@ def get_document_types(self): def traverse_resources(self): yield self for name in self._get_names(): - resource = self.get_resource(name) + try: + resource = self.get_resource(name) + except StopIteration: + # Log the resource abspath + log.error("The resource can't be read - {} {}".format(name, self.abspath)) + continue for x in resource.traverse_resources(): yield x @@ -197,7 +203,7 @@ def _get_names(self): # API ####################################################################### def _make_file(self, name, filename, mimetype, body, default_language): - from webpage import WebPage + from .webpage import WebPage if type(name) is not str: raise TypeError('expected string, got %s' % repr(name)) @@ -279,15 +285,15 @@ def create_imported_child(self, context, item_name, item_cls, item_class_version document_types = self.get_importable_document_types(context) if item_cls not in document_types: raise FormError( - ERROR(u"L'import d'une ressource de type {resource_type} " - u"n'est pas autorisé au sein de la resource actuelle").gettext( + ERROR("L'import d'une ressource de type {resource_type} " + "n'est pas autorisé au sein de la resource actuelle").gettext( resource_type=item_cls.class_title ) ) if item_class_version != item_cls.class_version: raise FormError( - ERROR(u"La version de la ressource que vous essayez d'importer " - u"ne correspond pas à la version de la ressource actuelle") + ERROR("La version de la ressource que vous essayez d'importer " + "ne correspond pas à la version de la ressource actuelle") ) if not dry_run: child = self.make_resource(item_name, item_cls) @@ -391,7 +397,7 @@ def extract_archive(self, handler, default_language, filter=None, # 4. The body body = handler.get_file(path_str) if filter: - body = filter(path_str, mimetype, body) + body = list(filter(path_str, mimetype, body)) if body is None: continue @@ -468,7 +474,7 @@ def copy_resource(self, source_path, target_path, exclude_patterns=None, check_i if (check_if_authorized and (not target_parent.can_paste(source) or not source.can_paste_into(target_parent))): - message = u'resource type "{0}" cannot be copied into type "{1}"' + message = 'resource type "{0}" cannot be copied into type "{1}"' message = message.format(source.class_title.gettext(), target_parent.class_title.gettext()) raise ConsistencyError(message) diff --git a/ikaaro/folder_views.py b/ikaaro/folder_views.py index 78fe9077f..e2ceb70aa 100644 --- a/ikaaro/folder_views.py +++ b/ikaaro/folder_views.py @@ -14,8 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -from views.folder_views import Folder_BrowseContent, GoToSpecificDocument -from views.folder_views import Folder_PreviewContent, SearchTypes_Enumerate +from .views.folder_views import Folder_BrowseContent, GoToSpecificDocument +from .views.folder_views import Folder_PreviewContent, SearchTypes_Enumerate print('[OBSOLETE] Imports from ikaaro.folder_views is obsolete. Use ikaaro.views instead') diff --git a/ikaaro/links.py b/ikaaro/links.py index 0a5a9e59d..251f33d5f 100644 --- a/ikaaro/links.py +++ b/ikaaro/links.py @@ -15,7 +15,7 @@ # along with this program. If not, see . # Import from ikaaro -from utils import split_reference +from .utils import split_reference def update_abspath_links(self, resource, field_name, source, target, languages, diff --git a/ikaaro/messages.py b/ikaaro/messages.py index ddba75ec8..cc424205b 100644 --- a/ikaaro/messages.py +++ b/ikaaro/messages.py @@ -23,47 +23,47 @@ -MSG_BAD_KEY = ERROR(u"Your confirmation key is invalid.") +MSG_BAD_KEY = ERROR("Your confirmation key is invalid.") MSG_BAD_NAME = ERROR( - u'The document name contains illegal characters, choose another one.') + 'The document name contains illegal characters, choose another one.') -MSG_CAPTION = ERROR(u'Caption') +MSG_CAPTION = ERROR('Caption') -MSG_CHANGES_SAVED = INFO(u'The changes have been saved.') +MSG_CHANGES_SAVED = INFO('The changes have been saved.') -MSG_CHANGES_SAVED2 = INFO(u'The changes have been saved ({time}).') +MSG_CHANGES_SAVED2 = INFO('The changes have been saved ({time}).') -MSG_DELETE_RESOURCE = MSG(u'Are you sure you want to delete this resource?') +MSG_DELETE_RESOURCE = MSG('Are you sure you want to delete this resource?') MSG_EDIT_CONFLICT = ERROR( - u'Someone already saved this document, click "Save" again to force.') + 'Someone already saved this document, click "Save" again to force.') MSG_EDIT_CONFLICT2 = ERROR( - u'User {user} already saved this document, click "Save" again to force.') + 'User {user} already saved this document, click "Save" again to force.') -MSG_EMPTY_FILENAME = ERROR(u'The file must be entered.') +MSG_EMPTY_FILENAME = ERROR('The file must be entered.') -MSG_EXISTANT_FILENAME = ERROR(u'A given name already exists.') +MSG_EXISTANT_FILENAME = ERROR('A given name already exists.') -MSG_INVALID_EMAIL = ERROR(u'The email address provided is invalid.') +MSG_INVALID_EMAIL = ERROR('The email address provided is invalid.') -MSG_NAME_CLASH = ERROR(u'There is already another resource with this name.') +MSG_NAME_CLASH = ERROR('There is already another resource with this name.') -MSG_NAME_MISSING = ERROR(u'The name is missing.') +MSG_NAME_MISSING = ERROR('The name is missing.') -MSG_NEW_RESOURCE = INFO(u'A new resource has been added.') +MSG_NEW_RESOURCE = INFO('A new resource has been added.') -MSG_NONE_REMOVED = ERROR(u'No resource removed.') +MSG_NONE_REMOVED = ERROR('No resource removed.') -MSG_RESOURCES_PASTED = INFO(u'Resources pasted: {resources}.') +MSG_RESOURCES_PASTED = INFO('Resources pasted: {resources}.') -MSG_RESOURCES_REMOVED = INFO(u'Resources removed: {resources}.') +MSG_RESOURCES_REMOVED = INFO('Resources removed: {resources}.') MSG_RESOURCES_REFERENCED = ERROR( - u'Action impossible (the resources are in use): {resources}.') + 'Action impossible (the resources are in use): {resources}.') -MSG_RESOURCES_REFERENCED_HTML = ERROR(u""" +MSG_RESOURCES_REFERENCED_HTML = ERROR(""" Action impossible (the resources are in use): , """, format='stl') -MSG_RESOURCES_NOT_PASTED = ERROR(u'Resources not allowed to paste here: ' - u'{resources}.') +MSG_RESOURCES_NOT_PASTED = ERROR('Resources not allowed to paste here: ' + '{resources}.') -MSG_RESOURCES_NOT_REMOVED = ERROR(u'Resources not allowed to remove: ' - u'{resources}.') +MSG_RESOURCES_NOT_REMOVED = ERROR('Resources not allowed to remove: ' + '{resources}.') -MSG_PASSWORD_MISMATCH = ERROR(u'The provided passwords do not match.') +MSG_PASSWORD_MISMATCH = ERROR('The provided passwords do not match.') MSG_REGISTERED = ERROR( - u"You have already confirmed your registration. " - u"Try to log in or ask for a new password.") + "You have already confirmed your registration. " + "Try to log in or ask for a new password.") -MSG_PASSWORD_EQUAL_TO_USERNAME = ERROR(u'Password cannot match the username.') +MSG_PASSWORD_EQUAL_TO_USERNAME = ERROR('Password cannot match the username.') -MSG_NONE_SELECTED = ERROR(u'No resource selected.') +MSG_NONE_SELECTED = ERROR('No resource selected.') -MSG_NONE_ALLOWED = ERROR(u"No resource allowed.") +MSG_NONE_ALLOWED = ERROR("No resource allowed.") -MSG_NO_PASTE = ERROR(u'Nothing to paste.') +MSG_NO_PASTE = ERROR('Nothing to paste.') -MSG_RENAMED = INFO(u'Resources renamed.') +MSG_RENAMED = INFO('Resources renamed.') -MSG_COPIED = INFO(u'Resources copied.') +MSG_COPIED = INFO('Resources copied.') -MSG_CUT = INFO(u'Resources cut.') +MSG_CUT = INFO('Resources cut.') -MSG_PUBLISHED = INFO(u'Resources published.') +MSG_PUBLISHED = INFO('Resources published.') -MSG_RETIRED = INFO(u'Resources retired.') +MSG_RETIRED = INFO('Resources retired.') -MSG_UNEXPECTED_MIMETYPE = ERROR(u'Unexpected file of mimetype {mimetype}.') +MSG_UNEXPECTED_MIMETYPE = ERROR('Unexpected file of mimetype {mimetype}.') MSG_LOGIN_WRONG_NAME_OR_PASSWORD = ERROR( - u'The login name or the password is incorrect.') + 'The login name or the password is incorrect.') diff --git a/ikaaro/order.py b/ikaaro/order.py index efb2395a5..f355887c6 100644 --- a/ikaaro/order.py +++ b/ikaaro/order.py @@ -22,12 +22,12 @@ from itools.web import INFO, get_context # Import from ikaaro -from views.folder_views import Folder_BrowseContent +from .views.folder_views import Folder_BrowseContent # Import from ikaaro -from buttons import BrowseButton -from fields import URI_Field -from folder import Folder +from .buttons import BrowseButton +from .fields import URI_Field +from .folder import Folder @@ -35,7 +35,7 @@ class OrderUpButton(BrowseButton): access = 'is_allowed_to_edit' name = 'order_up' - title = MSG(u'Order up') + title = MSG('Order up') @@ -43,7 +43,7 @@ class OrderDownButton(BrowseButton): access = 'is_allowed_to_edit' name = 'order_down' - title = MSG(u'Order down') + title = MSG('Order down') @@ -51,7 +51,7 @@ class OrderTopButton(BrowseButton): access = 'is_allowed_to_edit' name = 'order_top' - title = MSG(u'Order top') + title = MSG('Order top') @@ -59,21 +59,21 @@ class OrderBottomButton(BrowseButton): access = 'is_allowed_to_edit' name = 'order_bottom' - title = MSG(u'Order bottom') + title = MSG('Order bottom') class OrderButton(BrowseButton): access = 'is_allowed_to_edit' name = 'add_to_ordered' - title = MSG(u'Add to ordered list') + title = MSG('Add to ordered list') class UnOrderButton(BrowseButton): access = 'is_allowed_to_edit' name = 'remove_from_ordered' - title = MSG(u'Remove from ordered list') + title = MSG('Remove from ordered list') @@ -86,7 +86,7 @@ class OrderedFolder_BrowseContent(Folder_BrowseContent): default=Boolean(default=False)) table_columns = (Folder_BrowseContent.table_columns + - [('order', MSG(u'Order'))]) + [('order', MSG('Order'))]) def get_table_actions(self, resource, context): proxy = super(OrderedFolder_BrowseContent, self) @@ -127,7 +127,7 @@ def get_item_value(self, resource, context, item, column): ordered_ids = list(resource.get_ordered_values()) if item.name in ordered_ids: return ordered_ids.index(item.name) + 1 - return MSG(u'Not ordered') + return MSG('Not ordered') proxy = super(OrderedFolder_BrowseContent, self) return proxy.get_item_value(resource, context, item, column) @@ -147,37 +147,37 @@ def action_remove(self, resource, context, form): def action_order_up(self, resource, context, form): ids = form['ids'] resource.order_up(ids) - context.message = INFO(u'Resources ordered up.') + context.message = INFO('Resources ordered up.') def action_order_down(self, resource, context, form): ids = form['ids'] resource.order_down(ids) - context.message = INFO(u'Resources ordered down.') + context.message = INFO('Resources ordered down.') def action_order_top(self, resource, context, form): ids = form['ids'] resource.order_top(ids) - context.message = INFO(u'Resources ordered on top.') + context.message = INFO('Resources ordered on top.') def action_order_bottom(self, resource, context, form): ids = form['ids'] resource.order_bottom(ids) - context.message = INFO(u'Resources ordered on bottom.') + context.message = INFO('Resources ordered on bottom.') def action_add_to_ordered(self, resource, context, form): ids = form['ids'] resource.order_add(ids) - context.message = INFO(u'Resources ordered on bottom.') + context.message = INFO('Resources ordered on bottom.') def action_remove_from_ordered(self, resource, context, form): ids = form['ids'] resource.order_remove(ids) - context.message = INFO(u'Resources unordered.') + context.message = INFO('Resources unordered.') @@ -187,11 +187,11 @@ def action_remove_from_ordered(self, resource, context, form): class OrderedFolder(Folder): - class_title = MSG(u'Ordered Folder') + class_title = MSG('Ordered Folder') class_views = ['browse_content'] # Fields - order = URI_Field(title=MSG(u'Order'), multiple=True) + order = URI_Field(title=MSG('Order'), multiple=True) allow_to_unorder_items = False diff --git a/ikaaro/popup.py b/ikaaro/popup.py index 579d13fb2..0c4e076b8 100644 --- a/ikaaro/popup.py +++ b/ikaaro/popup.py @@ -34,10 +34,10 @@ from ikaaro.views.folder_views import Folder_BrowseContent # Import from ikaaro -from buttons import AddButton -from datatypes import FileDataType -import messages -from utils import reduce_string, make_stl_template +from .buttons import AddButton +from .datatypes import FileDataType +from .import messages +from .utils import reduce_string, make_stl_template class SelectElement(AddButton): @@ -75,9 +75,9 @@ class AddBase_BrowseContent(Folder_BrowseContent): table_columns = [ ('checkbox', None), ('icon', None), - ('name', MSG(u'Name')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author'))] + ('name', MSG('Name')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author'))] table_actions = [SelectElement] @@ -85,7 +85,7 @@ class AddBase_BrowseContent(Folder_BrowseContent): def get_folder_classes(self): if self.folder_classes: return self.folder_classes - from folder import Folder + from .folder import Folder return (Folder,) @@ -112,7 +112,7 @@ def get_item_value(self, resource, context, item, column): else: url = None path = target.abspath.get_pathto(item.abspath) - return unicode(path), url + return str(path), url else: proxy = super(AddBase_BrowseContent, self) return proxy.get_item_value(resource, context, item, column) @@ -213,7 +213,7 @@ def get_root(self, context): def get_start(self, resource): - from file import File + from .file import File if isinstance(resource, File): return resource.parent return resource @@ -232,7 +232,7 @@ def can_upload(self, cls): def get_namespace(self, resource, context): - from folder import Folder + from .folder import Folder # For the breadcrumb start = self.get_start(resource) @@ -353,7 +353,7 @@ def action_upload(self, resource, context, form): # Check it is of the expected type cls = context.database.get_resource_class(mimetype) if not self.can_upload(cls): - error = u'The given file is not of the expected type.' + error = 'The given file is not of the expected type.' context.message = ERROR(error) return @@ -400,11 +400,11 @@ class DBResource_AddLink(DBResource_AddBase): action_add_resource_schema = merge_dicts(DBResource_AddBase.schema, title=Unicode(mandatory=True)) - text_values = {'title': MSG(u'Insert link'), - 'browse': MSG(u'Browse and link to a File from the workspace'), - 'extern': MSG(u'Type the URL of an external resource'), - 'insert': MSG(u'Create a new page and link to it:'), - 'upload': MSG(u'Upload a file to the current folder and link to it:'), + text_values = {'title': MSG('Insert link'), + 'browse': MSG('Browse and link to a File from the workspace'), + 'extern': MSG('Type the URL of an external resource'), + 'insert': MSG('Create a new page and link to it:'), + 'upload': MSG('Upload a file to the current folder and link to it:'), 'method': ';add_link'} @@ -421,7 +421,7 @@ def action_add_resource(self, resource, context, form): name = checkid(form['title']) # Check name validity if name is None: - context.message = MSG(u"Invalid title.") + context.message = MSG("Invalid title.") return # Get the container root = context.root @@ -443,7 +443,7 @@ def get_page_type(self, mode): """Return the type of page to add corresponding to the mode """ if mode == 'tiny_mce': - from webpage import WebPage + from .webpage import WebPage return WebPage raise ValueError('Incorrect mode %s' % mode) @@ -454,11 +454,11 @@ class DBResource_AddImage(DBResource_AddBase): element_to_add = 'image' browse_content_class = AddImage_BrowseContent - text_values = {'title': MSG(u'Insert image'), - 'browse': MSG(u'Browse and insert an Image from the workspace'), + text_values = {'title': MSG('Insert image'), + 'browse': MSG('Browse and insert an Image from the workspace'), 'extern': None, 'insert': None, - 'upload': MSG(u'Upload an image to the current folder and insert it:'), + 'upload': MSG('Upload an image to the current folder and insert it:'), 'method': ';add_image'} @@ -484,11 +484,11 @@ class DBResource_AddMedia(DBResource_AddImage): element_to_add = 'media' browse_content_class = AddMedia_BrowseContent - text_values = {'title': MSG(u'Insert media'), - 'browse': MSG(u'Browse and insert a Media from the workspace'), - 'extern': MSG(u'Type the URL of an external media'), + text_values = {'title': MSG('Insert media'), + 'browse': MSG('Browse and insert a Media from the workspace'), + 'extern': MSG('Type the URL of an external media'), 'insert': None, - 'upload': MSG(u'Upload a media to the current folder and insert it:'), + 'upload': MSG('Upload a media to the current folder and insert it:'), 'method': ';add_media'} diff --git a/ikaaro/registry.py b/ikaaro/registry.py index f11a627d6..f6c324b14 100644 --- a/ikaaro/registry.py +++ b/ikaaro/registry.py @@ -16,7 +16,7 @@ # along with this program. If not, see . # Import from ikaaro -from database import Database +from .database import Database def register_document_type(resource_class, container_cls_id='folder'): diff --git a/ikaaro/resource_.py b/ikaaro/resource_.py index d36ade873..c0ac839d3 100644 --- a/ikaaro/resource_.py +++ b/ikaaro/resource_.py @@ -39,26 +39,17 @@ from itools.web import ItoolsView, get_context # Import from ikaaro -from autoadd import AutoAdd -from autoedit import AutoEdit -from enumerates import Groups_Datatype -from fields import File_Field, HTMLFile_Field -from fields import SelectAbspath_Field, UUID_Field -from fields import CTime_Field, MTime_Field, LastAuthor_Field -from fields import Title_Field, Description_Field, Subject_Field -from fields import URI_Field -from popup import DBResource_AddImage, DBResource_AddLink -from popup import DBResource_AddMedia -from resource_views import AutoJSONResourceExport -from resource_views import AutoJSONResourcesImport -from resource_views import DBResource_Remove -from resource_views import DBResource_Links, DBResource_Backlinks -from resource_views import LoginView, LogoutView -from resource_views import DBResource_GetFile, DBResource_GetImage -from update import class_version_to_date -from utils import get_resource_by_uuid_query -from widgets import CheckboxWidget -from widgets import RTEWidget +from .autoadd import AutoAdd +from .autoedit import AutoEdit +from .enumerates import Groups_Datatype +from .fields import File_Field, HTMLFile_Field, SelectAbspath_Field, UUID_Field, CTime_Field, MTime_Field, LastAuthor_Field,\ + Title_Field, Description_Field, Subject_Field, URI_Field +from .popup import DBResource_AddImage, DBResource_AddLink, DBResource_AddMedia +from .resource_views import AutoJSONResourceExport, AutoJSONResourcesImport, DBResource_Remove, DBResource_Links, \ + DBResource_Backlinks, LoginView, LogoutView, DBResource_GetFile, DBResource_GetImage +from .update import class_version_to_date +from .utils import get_resource_by_uuid_query +from .widgets import CheckboxWidget, RTEWidget log = getLogger("ikaaro") @@ -241,7 +232,7 @@ def get_resource_by_uuid(self, uuid, context, # Return resource if not search: return None - return search.get_resources(size=1).next() + return next(search.get_resources(size=1)) def make_resource_name(self): @@ -767,8 +758,7 @@ def get_next_versions(self): continue if version > obj_version and version <= cls_version: versions.append(version) - - versions.sort() + versions = sorted(versions) return versions @@ -842,7 +832,7 @@ def get_title(self, language=None): if title: return title # Fallback to the resource's name - return unicode(self.name) + return str(self.name) def get_edit_languages(self, context): @@ -943,9 +933,10 @@ def update_metadata_from_dict(self, fields_dict, dry_run=False): if not field_multilingual: if is_unicode: if type(field_value) is list: - field_value = [x.decode("utf-8") for x in field_value] + field_value = [x.decode("utf-8") if isinstance(x, bytes) else x for x in field_value] else: - field_value = field_value.decode("utf-8") + if isinstance(field_value, bytes): + field_value = field_value.decode("utf-8") else: field_value = datatype.decode(field_value) self.set_value(field_name, field_value) @@ -956,7 +947,8 @@ def update_metadata_from_dict(self, fields_dict, dry_run=False): if is_prototype(datatype, HTMLBody): lang_value = datatype.decode(lang_value) if is_unicode: - lang_value = lang_value.decode("utf-8") + if isinstance(lang_value, bytes): + lang_value = lang_value.decode("utf-8") self.set_value(field_name, lang_value, language=lang) diff --git a/ikaaro/resource_views.py b/ikaaro/resource_views.py index e8e648201..44cc9bf7b 100644 --- a/ikaaro/resource_views.py +++ b/ikaaro/resource_views.py @@ -42,18 +42,18 @@ from ikaaro.datatypes import FileDataType # Import from ikaaro -from autoform import AutoForm -from buttons import Remove_Button -from emails import send_email -from exceptions import ConsistencyError -from messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD +from .autoform import AutoForm +from .buttons import Remove_Button +from .emails import send_email +from .exceptions import ConsistencyError +from .messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD class DBResource_Remove(AutoForm): access = 'is_allowed_to_remove' - title = MSG(u'Remove') + title = MSG('Remove') actions = [Remove_Button] @@ -64,13 +64,12 @@ def action_remove(self, resource, context, form): container.del_resource(resource.name) except ConsistencyError: err = ( - u'Referenced resource cannot be removed, check the' - u' backlinks.') + 'Referenced resource cannot be removed, check the backlinks.') context.message = ERROR(err, format='html') return # Ok - message = MSG(u'Resource removed') + message = MSG('Resource removed') return context.come_back(message, goto=str(container.abspath)) @@ -180,7 +179,7 @@ class DBResource_Links(Folder_BrowseContent): """Links are the list of resources used by this resource.""" access = 'is_admin' - title = MSG(u"Links") + title = MSG("Links") icon = 'rename.png' query_schema = merge_dicts(Folder_BrowseContent.query_schema, @@ -211,7 +210,7 @@ class DBResource_Backlinks(DBResource_Links): consider it is "orphan". """ - title = MSG(u"Backlinks") + title = MSG("Backlinks") def get_items(self, resource, context): return context.search(links=str(resource.abspath)) @@ -224,7 +223,7 @@ def get_items(self, resource, context): class LoginView(STLView): access = True - title = MSG(u'Login') + title = MSG('Login') template = '/ui/ikaaro/base/login.xml' meta = [('robots', 'noindex, follow', None)] @@ -238,7 +237,7 @@ class LoginView(STLView): def GET(self, resource, context): if context.user: - msg = MSG(u'You are already connected') + msg = MSG('You are already connected') goto = str(context.user.abspath) return context.come_back(msg, goto) return super(LoginView, self).GET(resource, context) @@ -319,7 +318,7 @@ def get_goto(self, user): # Check if user account is completed for name, field in user.get_fields(): if field.required and user.get_value(name) is None: - msg = MSG(u'You must complete your account informations') + msg = MSG('You must complete your account informations') goto = '/users/%s/;edit_account' % user.name return context.come_back(msg, goto) @@ -334,7 +333,7 @@ def get_goto(self, user): else: goto = referrer - return context.come_back(INFO(u"Welcome!"), goto) + return context.come_back(INFO("Welcome!"), goto) @@ -348,7 +347,7 @@ class LogoutView(BaseView): def GET(self, resource, context): context.logout() - message = INFO(u'You Are Now Logged out.') + message = INFO('You Are Now Logged out.') return context.come_back(message, goto='./') @@ -356,7 +355,7 @@ def GET(self, resource, context): class AutoJSONResourceExport(AutoForm): access = "is_admin" - title = MSG(u"Exporter au format JSON") + title = MSG("Exporter au format JSON") def _get_datatype(self, resource, context, name): field = self.get_field(resource, name) @@ -421,7 +420,7 @@ def get_fields(self): def get_field(self, resource, name): resource_field = resource.get_field(name) field = Boolean_Field( - title=MSG(u"Exporter le champs '{title}' ?").gettext( + title=MSG("Exporter le champs '{title}' ?").gettext( title=resource_field.title ), default=True @@ -434,9 +433,9 @@ def action(self, resource, context, form): json_export = resource.export_as_json(context, only_self=True, exported_fields=fields) json_export["export_type"] = "self-export" context.set_content_type("application/json") - file_name = u"config_export_{title}.json".format( + file_name = "config_export_{title}.json".format( title=resource.get_title() - ).encode("utf-8") + ) context.set_content_disposition("attachment", file_name) return json.dumps(json_export, cls=NewJSONEncoder) @@ -444,7 +443,7 @@ def action(self, resource, context, form): class AutoJSONResourcesImport(AutoForm): access = "is_admin" - title = MSG(u"Importer au format JSON") + title = MSG("Importer au format JSON") schema = { "file": FileDataType(mandatory=True),} @@ -453,7 +452,7 @@ class AutoJSONResourcesImport(AutoForm): ] actions = [ - Button(access='is_admin', css='btn btn-primary', title=MSG(u'Upload'))] + Button(access='is_admin', css='btn btn-primary', title=MSG('Upload'))] def _get_form(self, resource, context): @@ -464,7 +463,6 @@ def _get_form(self, resource, context): raise FormError() filename, mimetype, json_raw = form.pop("file") json_content = json.loads(json_raw) - json_content = fix_json(json_content) form["json_import"] = json_content export_type = json_content["export_type"] if export_type == "child-export": @@ -478,13 +476,13 @@ def _get_form(self, resource, context): # Check that imported json is the right resource if resource.class_id != json_content["class_id"]: raise FormError( - ERROR(u"Le type de ressource que vous essayez d'importer ne " - u"correspond pas au type de la ressource actuelle") + ERROR("Le type de ressource que vous essayez d'importer ne " + "correspond pas au type de la ressource actuelle") ) if resource.class_version != json_content["class_version"]: raise FormError( - ERROR(u"La version de la ressource que vous essayez d'importer " - u"ne correspond pas à la version de la ressource actuelle") + ERROR("La version de la ressource que vous essayez d'importer " + "ne correspond pas à la version de la ressource actuelle") ) resource.update_metadata_from_dict(json_content["fields"], dry_run=True) return form @@ -500,17 +498,17 @@ def action(self, resource, context, form): # Check that imported json is the right resource if resource.class_id != json_content["class_id"]: raise FormError( - ERROR(u"Le type de ressource que vous essayez d'importer ne " - u"correspond pas au type de la ressource actuelle") + ERROR("Le type de ressource que vous essayez d'importer ne " + "correspond pas au type de la ressource actuelle") ) if resource.class_version != json_content["class_version"]: raise FormError( - ERROR(u"La version de la ressource que vous essayez d'importer " - u"ne correspond pas à la version de la ressource actuelle") + ERROR("La version de la ressource que vous essayez d'importer " + "ne correspond pas à la version de la ressource actuelle") ) resource.update_metadata_from_dict(json_content["fields"]) return context.come_back( - MSG(u"Les ressources ont bien été importées"), + MSG("Les ressources ont bien été importées"), goto=self.action_goto ) diff --git a/ikaaro/rest.py b/ikaaro/rest.py index 549e86dfb..e37d3ca62 100644 --- a/ikaaro/rest.py +++ b/ikaaro/rest.py @@ -23,7 +23,8 @@ from itools.web import BaseView # Import from ikaaro -from fields import Metadata_Field, File_Field +from .fields import Metadata_Field, File_Field +from .utils import dict_of_bytes_to_string ########################################################################### # Utility functions @@ -35,7 +36,7 @@ def fix_json(obj): TODO Use a custom JSONDecoder instead. """ obj_type = type(obj) - if obj_type is unicode: + if obj_type is str: return obj.encode('utf-8') if obj_type is list: return [ fix_json(x) for x in obj ] @@ -101,7 +102,7 @@ def field_to_json(resource, field_name): if prop is None: return None if type(prop) is dict: - prop = prop.values() + prop = list(prop.values()) if type(prop) is list: return [ property_to_json(field, x) for x in prop ] return property_to_json(field, prop) @@ -132,7 +133,8 @@ def json(self): """Utility method that loads the json from the request entity. Used by POST and PUT request methods. """ - return self.context.body + new_data = dict_of_bytes_to_string(self.context.body) + return new_data def created(self, resource): diff --git a/ikaaro/root.py b/ikaaro/root.py index e1bd28e94..c5a17544b 100644 --- a/ikaaro/root.py +++ b/ikaaro/root.py @@ -22,10 +22,10 @@ from decimal import Decimal from email.charset import add_charset, add_codec, QP from email.mime.application import MIMEApplication -from email.MIMEText import MIMEText -from email.MIMEImage import MIMEImage -from email.MIMEMultipart import MIMEMultipart -from email.Utils import formatdate +from email.mime.text import MIMEText +from email.mime.image import MIMEImage +from email.mime.multipart import MIMEMultipart +from email.utils import formatdate from email.header import Header from json import dumps from logging import getLogger @@ -33,6 +33,7 @@ import traceback # Import from itools +from itools import pkg from itools.core import get_abspath from itools.database import RWDatabase from itools.gettext import MSG @@ -44,18 +45,18 @@ from itools.xml import XMLParser, is_xml_stream # Import from ikaaro -from constants import DEBUG -from config import Configuration -from config_register import RegisterForm, TermsOfService_View -from context import CMSContext -from fields import Char_Field -from folder import Folder -from resource_views import LoginView -from skins import skin_registry -from root_views import PoweredBy, ContactForm -from root_views import NotFoundView, ForbiddenView, NotAllowedView -from root_views import UploadStatsView, UpdateDocs, UnavailableView -from update import UpdateInstanceView +from .constants import DEBUG +from .config import Configuration +from .config_register import RegisterForm, TermsOfService_View +from .context import CMSContext +from .fields import Char_Field +from .folder import Folder +from .resource_views import LoginView +from .skins import skin_registry +from .root_views import PoweredBy, ContactForm +from .root_views import NotFoundView, ForbiddenView, NotAllowedView +from .root_views import UploadStatsView, UpdateDocs, UnavailableView +from .update import UpdateInstanceView log = getLogger("ikaaro") @@ -93,7 +94,7 @@ class Root(Folder): class_id = 'iKaaro' class_version = '20180428' - class_title = MSG(u'iKaaro') + class_title = MSG('iKaaro') class_icon16 = '/ui/ikaaro/icons/16x16/root.png' class_icon48 = '/ui/ikaaro/icons/48x48/root.png' class_skin = 'aruni' @@ -110,7 +111,7 @@ class Root(Folder): def init_resource(self, email, password): super(Root, self).init_resource() # Configuration - title = {'en': u'Configuration'} + title = {'en': 'Configuration'} self.make_resource('config', Configuration, title=title) # First user user = self.make_user(email, password) @@ -142,7 +143,7 @@ def get_user_title(self, userid): if user is None: username = userid.rsplit('/', 1)[-1] log.warning('unkwnown user {}'.format(username)) - return unicode(username) + return str(username) # Ok return user.get_title() @@ -159,7 +160,7 @@ def get_internal_error_template(self, context): def get_internal_error_namespace(self, context): namespace = { - "message": MSG(u"Erreur de l'application"), + "message": MSG("Erreur de l'application"), } if not DEBUG: return namespace @@ -235,10 +236,10 @@ def alert_on_internal_server_error(self, context): email = context.server.config.get_value('log-email') # We send an email with the traceback if email: - headers = u'\n'.join([u'%s => %s' % (x, y) + headers = '\n'.join(['%s => %s' % (x, y) for x, y in context.get_headers()]) - subject = MSG(u'Internal server error').gettext() - text = u'%s\n\n%s\n\n%s' % (context.uri, + subject = MSG('Internal server error').gettext() + text = '%s\n\n%s\n\n%s' % (context.uri, traceback.format_exc(), headers) self.send_email(email, subject, text=text) @@ -395,7 +396,7 @@ def send_email(self, to_addr, subject, reply_to=None, text=None, html=None, encoding='utf-8', subject_with_host=True, return_receipt=False, attachment=None): # 1. Check input data - if type(subject) is unicode: + if type(subject) is str: subject = subject.encode(encoding) elif isinstance(subject, MSG): subject = subject.gettext() @@ -404,9 +405,9 @@ def send_email(self, to_addr, subject, reply_to=None, text=None, if len(subject.splitlines()) > 1: raise ValueError('the subject cannot have more than one line') - if text and not isinstance(text, unicode): + if text and not isinstance(text, str): raise TypeError('the text must be a Unicode string') - if html and not isinstance(html, unicode): + if html and not isinstance(html, str): raise TypeError('the html must be a Unicode string') # 2. Local variables @@ -601,7 +602,7 @@ def get_user_from_login(self, username): return self.get_user(brain.name) - update_20170106_title = MSG(u'Add uuid to all resources') + update_20170106_title = MSG('Add uuid to all resources') def update_20170106(self): i = 0 context = get_context() diff --git a/ikaaro/root_views.py b/ikaaro/root_views.py index 2ca4ba6eb..3acea15e8 100644 --- a/ikaaro/root_views.py +++ b/ikaaro/root_views.py @@ -37,14 +37,14 @@ from itools.xml import get_element, TEXT # Import from ikaaro -from autoform import AutoForm -from buttons import Button -from config_captcha import CaptchaDatatype, CaptchaWidget -from datatypes import FileDataType -from folder import Folder -from messages import MSG_UNEXPECTED_MIMETYPE -from widgets import FileWidget -from widgets import HiddenWidget, SelectWidget, MultilineWidget, TextWidget +from .autoform import AutoForm +from .buttons import Button +from .config_captcha import CaptchaDatatype, CaptchaWidget +from .datatypes import FileDataType +from .folder import Folder +from .messages import MSG_UNEXPECTED_MIMETYPE +from .widgets import FileWidget +from .widgets import HiddenWidget, SelectWidget, MultilineWidget, TextWidget class NotAllowedView(STLView): @@ -122,7 +122,7 @@ def get_options(cls): title = user.get_title() options.append({'name': name, 'value': title, 'sort_value': title.lower()}) - options.sort(key=lambda x: x['sort_value']) + options = sorted(options, key=lambda x: x['sort_value']) return options @@ -130,8 +130,8 @@ def get_options(cls): class ContactForm(AutoForm): access = True - title = MSG(u'Contact') - actions = [Button(access=True, css='btn btn-primary', title=MSG(u'Send'))] + title = MSG('Contact') + actions = [Button(access=True, css='btn btn-primary', title=MSG('Send'))] query_schema = {'to': String, 'subject': Unicode, 'message_body': Unicode} @@ -153,13 +153,13 @@ def get_widgets(self, resource, context): if len(ContactOptions(resource=resource).get_options()) == 1: to = HiddenWidget('to') else: - to = SelectWidget('to', title=MSG(u'Recipient')) + to = SelectWidget('to', title=MSG('Recipient')) return [ to, - TextWidget('from', title=MSG(u'Your email address'), size=40), - TextWidget('subject', title=MSG(u'Message subject'), size=40), - MultilineWidget('message_body', title=MSG(u'Message body'), + TextWidget('from', title=MSG('Your email address'), size=40), + TextWidget('subject', title=MSG('Message subject'), size=40), + MultilineWidget('message_body', title=MSG('Message body'), rows=8, cols=50), CaptchaWidget('captcha')] @@ -200,13 +200,13 @@ def action(self, resource, context, form): root = resource.get_root() root.send_email(contact, subject, reply_to=reply_to, text=body) # Ok - context.message = INFO(u'Message sent.') + context.message = INFO('Message sent.') class PoweredBy(STLView): access = True - title = MSG(u'Powered by') + title = MSG('Powered by') template = '/ui/ikaaro/root/powered-by.xml' @@ -214,7 +214,7 @@ def get_namespace(self, resource, context): namespace = {} # Credits credits = get_abspath('CREDITS.txt') - lines = lfs.open(credits).readlines() + lines = lfs.open(credits, text=True).readlines() names = [ x[2:].strip() for x in lines if x.startswith(' ') ] namespace['hackers'] = names @@ -225,10 +225,10 @@ def get_namespace(self, resource, context): if is_admin: package2title = { - 'gio': u'pygobject', - 'lpod': u'lpOD', - 'sys': u'Python', - 'os': MSG(u'Operating System')} + 'gio': 'pygobject', + 'lpod': 'lpOD', + 'sys': 'Python', + 'os': MSG('Operating System')} packages = [ {'name': package2title.get(x, x), 'version': y or MSG('no version found')} @@ -236,7 +236,7 @@ def get_namespace(self, resource, context): location = (getuser(), gethostname(), context.server.target) namespace['packages'] = packages - namespace['location'] = u'%s@%s:%s' % location + namespace['location'] = '%s@%s:%s' % location # Ok return namespace @@ -246,18 +246,18 @@ def get_namespace(self, resource, context): class UpdateDocs(AutoForm): access = 'is_admin' - title = MSG(u'Update docs') + title = MSG('Update docs') schema = { 'file': FileDataType(mandatory=True), 'language': String(mandatory=True, default='en')} widgets = [ FileWidget('file'), - TextWidget('language', title=MSG(u'Language'), - tip=MSG(u'"en", "fr", ...'))] + TextWidget('language', title=MSG('Language'), + tip=MSG('"en", "fr", ...'))] actions = [ - Button(access='is_admin', css='btn btn-primary', title=MSG(u'Upload'))] + Button(access='is_admin', css='btn btn-primary', title=MSG('Upload'))] def _get_form(self, resource, context): @@ -296,7 +296,7 @@ def filter(path, mimetype, body): target = XHTMLFile() elem = get_element(source.events, 'div', **{'class': 'body'}) if not elem: - print("E {}".format(path)) + print(("E {}".format(path))) return None elements = elem.get_content_elements() elements = rewrite_uris(elements, rewrite) @@ -311,7 +311,7 @@ def filter(path, mimetype, body): return body # Unknown else: - print('X {} {}'.format(path, mimetype)) + print(('X {} {}'.format(path, mimetype))) return body def postproc(file): @@ -325,11 +325,11 @@ def postproc(file): elem = get_element(events, 'h1') if elem: title = [ - unicode(x[1], 'utf8') + str(x[1], 'utf8') for x in elem.get_content_elements() if x[0] == TEXT ] - if title[-1] == u'¶': + if title[-1] == '¶': title.pop() - title = u''.join(title) + title = ''.join(title) file.set_property('title', title, language) handler.events = events[:elem.start] + events[elem.end+1:] @@ -344,5 +344,5 @@ def postproc(file): docs.extract_archive(handler, language, filter, postproc, True) # Ok - message = MSG(u'Documentation updated.') + message = MSG('Documentation updated.') return context.come_back(message, goto='./docs') diff --git a/ikaaro/server.py b/ikaaro/server.py old mode 100644 new mode 100755 index 866b4a981..542974422 --- a/ikaaro/server.py +++ b/ikaaro/server.py @@ -19,7 +19,7 @@ # along with this program. If not, see . # Import from the Standard Library -from cProfile import runctx +#from cProfile import runctx from email.parser import HeaderParser from json import loads from io import BytesIO @@ -41,6 +41,7 @@ from tempfile import mkstemp from importlib import import_module from wsgiref.util import setup_testing_defaults +import importlib # Import from jwcrypto from jwcrypto.jwk import JWK @@ -66,11 +67,11 @@ from itools.web.router import RequestMethod # Import from ikaaro.web -from database import get_database -from datatypes import ExpireValue -from views import CachedStaticView -from skins import skin_registry -from views import IkaaroStaticView +from .database import get_database +from .datatypes import ExpireValue +from .views import CachedStaticView +from .skins import skin_registry +from .views import IkaaroStaticView log_ikaaro = getLogger("ikaaro") log_access = getLogger("ikaaro.access") @@ -178,7 +179,7 @@ def load_modules(config): modules = config.get_value('modules') for name in modules: name = name.strip() - exec('import %s' % name) + __import__(name) @@ -215,7 +216,7 @@ def create_server(target, email, password, root, listen_port='8080', smtp_host='localhost', log_email=None, website_languages=None, size_min=19500, size_max=20500): - from root import Root + from .root import Root modules = modules or [] # Get modules for module in modules: @@ -225,8 +226,8 @@ def create_server(target, email, password, root, root_class = Root else: modules.insert(0, root) - exec('import %s' % root) - exec('root_class = %s.Root' % root) + mod = __import__(root) + root_class = getattr(mod, 'Root') # Make folder try: mkdir(target) @@ -275,10 +276,12 @@ def create_server(target, email, password, root, + server = None def get_server(): return server + def set_server(the_server): global server if the_server and get_server() is not None: @@ -307,14 +310,24 @@ def format_request(self): length, delta) + def dict_bytes_to_str(self, data: dict): + new_response_headers = {} + for key,value in data.items(): + if type(key) is bytes: + key = key.decode("utf-8") + if type(value) is bytes: + value = value.decode("utf-8") + new_response_headers[key] = value + return new_response_headers + def log_request(self): request_log = self.format_request() status = (self._orig_status or self.status or '000').split()[0] status = int(status) - request_headers = self.headers.dict + request_headers = dict(self.headers) request_headers.pop("cookie", None) request_headers.pop("authorization", None) - response_headers = dict(self.response_headers) + response_headers = self.dict_bytes_to_str(dict(self.response_headers)) response_headers.pop("Set-cookie", None) method = self.command response_length = self.response_length @@ -383,7 +396,9 @@ def __init__(self, target, read_only=False, cache_size=None, # Set timestamp self.timestamp = str(int(time() / 2)) # Load the config + print("TARGET", target) config = get_config(target) + self.config = config load_modules(config) self.modules = config.get_value('modules') @@ -402,8 +417,9 @@ def __init__(self, target, read_only=False, cache_size=None, 'accept-cors', type=Boolean, default=False) # Profile Memory - if profile_space is True: - import guppy.heapy.RM + # Package not compatible with python 3 + # if profile_space is True: + # import guppy.heapy.RM # The database if cache_size is None: @@ -459,9 +475,9 @@ def get_JWT_key_path(self): def get_JWT_key(self): key_path = self.get_JWT_key_path() try: - with open(key_path, mode="r") as key_file: + with open(key_path, mode="rb") as key_file: lines = key_file.readlines() - key_pem_string = "".join(lines) + key_pem_string = b"".join(lines) jwk = JWK.from_pem(key_pem_string) except IOError as e: # No pem file found generating one @@ -472,7 +488,7 @@ def get_JWT_key(self): def save_JWT_key(self, jwk): key_path = self.get_JWT_key_path() - with open(key_path, mode="w") as key_file: + with open(key_path, mode="wb") as key_file: key_pem_string = jwk.export_to_pem(private_key=True, password=None) key_file.write(key_pem_string) @@ -619,7 +635,10 @@ def get_pid(self): def is_running(self): pid = self.get_pid() - return pid_exists(pid) + if pid: + return pid_exists(pid) + else: + return False def __enter__(self): @@ -672,7 +691,8 @@ def listen(self, address, port): gevent_signal(SIGTERM, self.stop_signal) gevent_signal(SIGINT, self.stop_signal) if self.profile: - runctx("self.wsgi_server.serve_forever()", globals(), locals(), self.profile) + #runctx("self.wsgi_server.serve_forever()", globals(), locals(), self.profile) + raise Exception("Error server.py Ikaaro - Python 3 circular import with CProfile") else: self.wsgi_server.serve_forever() @@ -723,7 +743,8 @@ def save_email(self, message): tmp_file, tmp_path = mkstemp(dir=spool) file = fdopen(tmp_file, 'w') try: - file.write(message.as_string()) + message = message.as_string() + file.write(message) finally: file.close() @@ -829,9 +850,11 @@ def register_dispatch_routes(self): def register_urlpatterns_from_package(self, package): urlpatterns = None try: - exec('from {} import urlpatterns'.format(package)) + module_imported = __import__(f"{package}") + urlpatterns = module_imported.urls.urlpatterns except ImportError: return + # Dispatch base routes from ikaaro for urlpattern_object in urlpatterns: for pattern, view in urlpattern_object.get_patterns(): @@ -860,7 +883,7 @@ def cron_manager(self): # Build fake context with database.init_context() as context: context.is_cron = True - context.git_message = u'[CRON]' + context.git_message = '[CRON]' # Go t0 = time() catalog = database.catalog @@ -958,7 +981,13 @@ def do_request(self, method='GET', path='/', headers=None, body='', for key, value in headers: environ['HTTP_%s' % key.upper().replace('-', '_')] = value # Set wsgi input body - environ['wsgi.input'] = BytesIO(prepped.body) + if prepped.body is not None: + if type(prepped.body) is str: + environ['wsgi.input'] = BytesIO(prepped.body.encode("utf-8")) + else: + environ['wsgi.input'] = BytesIO(prepped.body) + else: + environ['wsgi.input'] = BytesIO() # Set content length if prepped.body: environ['CONTENT_LENGTH'] = len(prepped.body) @@ -1009,7 +1038,6 @@ def do_request(self, method='GET', path='/', headers=None, body='', - class ServerConfig(ConfigFile): schema = { diff --git a/ikaaro/skins.py b/ikaaro/skins.py index 03f451ad5..38d1b55e4 100644 --- a/ikaaro/skins.py +++ b/ikaaro/skins.py @@ -31,14 +31,14 @@ from itools.web import get_context, ERROR, INFO # Import from ikaaro -from folder import Folder -from views import get_view_scripts -from skins_views import LanguagesTemplate, LocationTemplate, TabsTemplate +from .folder import Folder +from .views import get_view_scripts +from .skins_views import LanguagesTemplate, LocationTemplate, TabsTemplate class Skin(object): - class_title = MSG(u'Skin') + class_title = MSG('Skin') class_icon16 = '/ui/ikaaro/icons/16x16/skin.png' class_icon48 = '/ui/ikaaro/icons/48x48/skin.png' @@ -79,10 +79,10 @@ def get_template_title(self, context): if not root.is_allowed_to_view(context.user, here): return '' elif root is here: - template = MSG(u"{view_title} - {root_title}") + template = MSG("{view_title} - {root_title}") here_title = None else: - template = MSG(u"{here_title} - {view_title} - {root_title}") + template = MSG("{here_title} - {view_title} - {root_title}") here_title = here.get_title() # The view diff --git a/ikaaro/skins_views.py b/ikaaro/skins_views.py index dfb2291c4..4c10d4135 100644 --- a/ikaaro/skins_views.py +++ b/ikaaro/skins_views.py @@ -25,7 +25,7 @@ from itools.uri import decode_query # Import from ikaaro -from utils import CMSTemplate, reduce_string +from .utils import CMSTemplate, reduce_string diff --git a/ikaaro/text.py b/ikaaro/text.py index a26f8e64e..1a3e7282f 100644 --- a/ikaaro/text.py +++ b/ikaaro/text.py @@ -32,14 +32,14 @@ from itools.xmlfile import XMLFile # Import from ikaaro -from database import Database -from fields import File_Field -from file import File -from file_views import File_Edit -from text_views import Text_Edit, Text_View, PO_Edit -from text_views import CSV_View, CSV_AddRow, CSV_EditRow -from text_views import CSS_Edit -from widgets import FileWidget, MultilineWidget +from .database import Database +from .fields import File_Field +from .file import File +from .file_views import File_Edit +from .text_views import Text_Edit, Text_View, PO_Edit +from .text_views import CSV_View, CSV_AddRow, CSV_EditRow +from .text_views import CSS_Edit +from .widgets import FileWidget, MultilineWidget css_uri_expr = compile(r"url\((.*)\)") def css_get_reference(uri): @@ -60,7 +60,7 @@ def css_get_reference(uri): class Text(File): class_id = 'text' - class_title = MSG(u'Plain Text') + class_title = MSG('Plain Text') class_icon16 = '/ui/ikaaro/icons/16x16/text.png' class_icon48 = '/ui/ikaaro/icons/48x48/text.png' class_views = ['view', 'edit', 'externaledit'] @@ -81,7 +81,7 @@ def get_content_type(self): class PO(Text): class_id = 'text/x-gettext-translation' - class_title = MSG(u'Message Catalog') + class_title = MSG('Message Catalog') class_icon16 = '/ui/ikaaro/icons/16x16/po.png' class_icon48 = '/ui/ikaaro/icons/48x48/po.png' @@ -99,7 +99,7 @@ def get_po_handler(self): class CSS(Text): class_id = 'text/css' - class_title = MSG(u'CSS') + class_title = MSG('CSS') class_icon16 = '/ui/ikaaro/icons/16x16/css.png' class_icon48 = '/ui/ikaaro/icons/48x48/css.png' @@ -231,7 +231,7 @@ def my_func(matchobj): class Python(Text): class_id = 'text/x-python' - class_title = MSG(u'Python') + class_title = MSG('Python') class_icon16 = '/ui/ikaaro/icons/16x16/python.png' class_icon48 = '/ui/ikaaro/icons/48x48/python.png' # Fields @@ -242,7 +242,7 @@ class Python(Text): class JS(Text): class_id = 'application/x-javascript' - class_title = MSG(u'Javascript') + class_title = MSG('Javascript') class_icon16 = '/ui/ikaaro/icons/16x16/js.png' class_icon48 = '/ui/ikaaro/icons/48x48/js.png' @@ -251,7 +251,7 @@ class JS(Text): class XML(Text): class_id = 'text/xml' - class_title = MSG(u'XML File') + class_title = MSG('XML File') # Fields data = File_Field(required=True, class_handler=XMLFile) @@ -260,7 +260,7 @@ class XML(Text): class HTML(Text): class_id = 'text/html' - class_title = MSG(u'HTML File') + class_title = MSG('HTML File') # Fields data = File_Field(required=True, class_handler=HTMLFile) @@ -269,7 +269,7 @@ class HTML(Text): class CSV(Text): class_id = 'text/comma-separated-values' - class_title = MSG(u'Comma Separated Values') + class_title = MSG('Comma Separated Values') class_views = ['view', 'add_row', 'edit', 'externaledit'] # Fields diff --git a/ikaaro/text_views.py b/ikaaro/text_views.py index d215add5b..c5db91644 100644 --- a/ikaaro/text_views.py +++ b/ikaaro/text_views.py @@ -27,18 +27,18 @@ from itools.web import STLView, INFO # Import from ikaaro -from autoform import AutoForm -from buttons import Button, Remove_BrowseButton -from fields import File_Field -from file_views import File_Edit -import messages -from views import BrowseForm -from widgets import EditAreaWidget, get_default_widget +from .autoform import AutoForm +from .buttons import Button, Remove_BrowseButton +from .fields import File_Field +from .file_views import File_Edit +from . import messages +from .views import BrowseForm +from .widgets import EditAreaWidget, get_default_widget class Text_Edit(File_Edit): - title = MSG(u'Edit') + title = MSG('Edit') icon = 'edit.png' fields = ['title', 'data', 'file', 'description', 'subject', 'share'] @@ -77,7 +77,7 @@ def set_value(self, resource, context, name, form): class Text_View(STLView): access = 'is_allowed_to_view' - title = MSG(u'View') + title = MSG('View') icon = 'view.png' template = '/ui/ikaaro/text/view.xml' @@ -103,7 +103,7 @@ class CSS_Edit(Text_Edit): class PO_Edit(STLView): access = 'is_allowed_to_edit' - title = MSG(u'Edit') + title = MSG('Edit') template = '/ui/ikaaro/PO_edit.xml' schema = { 'msgctxt': Unicode, @@ -115,7 +115,7 @@ def get_namespace(self, resource, context): # Get the translation units (all but the header) handler = resource.get_po_handler() units = handler.get_units() - units.sort(key=lambda x: x.source) + units = sorted(units, key=lambda x: x.source) if units and ''.join(units[0].source) == '': units = units[1:] @@ -129,9 +129,9 @@ def get_namespace(self, resource, context): # Msgid and msgstr if units: unit = units[index-1] - msgctxt = u'' if unit.context is None else ''.join(unit.context) - msgid = u''.join(unit.source) - msgstr = u''.join(unit.target) + msgctxt = '' if unit.context is None else ''.join(unit.context) + msgid = ''.join(unit.source) + msgstr = ''.join(unit.target) else: msgctxt = None msgid = None @@ -169,7 +169,7 @@ class CSV_View(BrowseForm): # FIXME We need different permissions for GET and POST access = 'is_allowed_to_edit' - title = MSG(u'View') + title = MSG('View') schema = { 'ids': Integer(mandatory=True, multiple=True), } @@ -193,7 +193,7 @@ def sort_and_batch(self, resource, context, items): sort_by = int(sort_by) else: sort_by = handler.columns.index(sort_by) - items.sort(key=itemgetter(sort_by), reverse=reverse) + items = sorted(items, key=itemgetter(sort_by), reverse=reverse) # Batch start = context.query['batch_start'] @@ -238,7 +238,7 @@ def action_remove(self, resource, context, form): handler = resource.get_csv_handler() handler.del_rows(ids) # Ok - context.message = INFO(u'Row deleted.') + context.message = INFO('Row deleted.') @@ -268,10 +268,10 @@ def get_widgets(self, resource, context): class CSV_AddRow(RowForm): - title = MSG(u'Add Row') + title = MSG('Add Row') icon = 'new.png' actions = [Button(access=True, css='btn btn-primary', - title=MSG(u'Add'), show=True)] + title=MSG('Add'), show=True)] def action(self, resource, context, form): @@ -279,7 +279,7 @@ def action(self, resource, context, form): handler = resource.get_csv_handler() row = handler.add_row(row) # Ok - message = INFO(u'New row added.') + message = INFO('New row added.') goto = ';edit_row?index=%s' % row.number return context.come_back(message, goto=goto) @@ -287,7 +287,7 @@ def action(self, resource, context, form): class CSV_EditRow(RowForm): - title = MSG(u'Edit row #{id}') + title = MSG('Edit row #{id}') query_schema = { 'index': Integer, } diff --git a/ikaaro/ui_dev/aruni/package-lock.json b/ikaaro/ui_dev/aruni/package-lock.json index 63c8379ca..33d6465c5 100644 --- a/ikaaro/ui_dev/aruni/package-lock.json +++ b/ikaaro/ui_dev/aruni/package-lock.json @@ -1,5562 +1,8 @@ { "name": "aruni", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "aruni", - "version": "1.0.0", - "dependencies": { - "ansi-colors": "~4.1.1", - "bootstrap": "4.4.1", - "fancy-log": "~1.3.3", - "font-awesome": "4.7.0", - "gulp": "~4.0.2", - "gulp-append": "~0.3.4", - "gulp-concat": "~2.6.1", - "gulp-sass": "~5.0.0", - "jquery": "~3.6.0", - "popper.js": "~1.16.1", - "sass": "~1.45.0" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", - "dependencies": { - "ansi-wrap": "0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", - "dependencies": { - "buffer-equal": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=", - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=", - "dependencies": { - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=", - "dependencies": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-initial/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dependencies": { - "is-number": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-last/node_modules/is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dependencies": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-sort/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" - }, - "node_modules/async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dependencies": { - "async-done": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", - "dependencies": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/bootstrap": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", - "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - }, - "peerDependencies": { - "jquery": "1.9.1 - 3", - "popper.js": "^1.16.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "node_modules/buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/camelcase": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.1.tgz", - "integrity": "sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/chokidar/node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" - }, - "node_modules/cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dependencies": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "node_modules/cloneable-readable/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/cloneable-readable/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/cloneable-readable/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=", - "dependencies": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/concat-with-sourcemaps": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz", - "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==", - "dependencies": { - "source-map": "^0.6.1" - } - }, - "node_modules/concat-with-sourcemaps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/convert-source-map": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", - "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", - "dependencies": { - "safe-buffer": "~5.1.1" - } - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/copy-props": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz", - "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==", - "dependencies": { - "each-props": "^1.3.0", - "is-plain-object": "^2.0.1" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dependencies": { - "kind-of": "^5.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-compare/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-property/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dependencies": { - "readable-stream": "~1.1.9" - } - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dependencies": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/end-of-stream/node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", - "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extend-shallow/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dependencies": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "node_modules/flush-write-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/flush-write-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/flush-write-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", - "engines": { - "node": ">=0.10.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dependencies": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dependencies": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-stream/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-stream/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/glob-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/glob-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dependencies": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-watcher/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/glob-watcher/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/glob-watcher/node_modules/chokidar/node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz", - "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==", - "bundleDependencies": [ - "node-pre-gyp" - ], - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1", - "node-pre-gyp": "*" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/abbrev": { - "version": "1.1.1", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/ansi-regex": { - "version": "2.1.1", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/aproba": { - "version": "1.2.0", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/are-we-there-yet": { - "version": "1.1.5", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "inBundle": true, - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/balanced-match": { - "version": "1.0.0", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/brace-expansion": { - "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "inBundle": true, - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/chownr": { - "version": "1.1.3", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/code-point-at": { - "version": "1.1.0", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/concat-map": { - "version": "0.0.1", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/console-control-strings": { - "version": "1.1.0", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/core-util-is": { - "version": "1.0.2", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/debug": { - "version": "3.2.6", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "inBundle": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/deep-extend": { - "version": "0.6.0", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/delegates": { - "version": "1.0.0", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/detect-libc": { - "version": "1.0.3", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "inBundle": true, - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/fs-minipass": { - "version": "1.2.7", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "inBundle": true, - "optional": true, - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/fs.realpath": { - "version": "1.0.0", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/gauge": { - "version": "2.7.4", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "inBundle": true, - "optional": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/glob": { - "version": "7.1.6", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "inBundle": true, - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/has-unicode": { - "version": "2.0.1", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/iconv-lite": { - "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "inBundle": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/ignore-walk": { - "version": "3.0.3", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "inBundle": true, - "optional": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/inflight": { - "version": "1.0.6", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "inBundle": true, - "optional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/inherits": { - "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/ini": { - "version": "1.3.5", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "deprecated": "Please update to ini >=1.3.6 to avoid a prototype pollution issue", - "inBundle": true, - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "inBundle": true, - "optional": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/isarray": { - "version": "1.0.0", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/minimatch": { - "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "inBundle": true, - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/minimist": { - "version": "0.0.8", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/minipass": { - "version": "2.9.0", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "inBundle": true, - "optional": true, - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/minizlib": { - "version": "1.3.3", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "inBundle": true, - "optional": true, - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/mkdirp": { - "version": "0.5.1", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "inBundle": true, - "optional": true, - "dependencies": { - "minimist": "0.0.8" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/ms": { - "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/needle": { - "version": "2.4.0", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", - "inBundle": true, - "optional": true, - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/node-pre-gyp": { - "version": "0.14.0", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", - "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", - "inBundle": true, - "optional": true, - "dependencies": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/nopt": { - "version": "4.0.1", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "inBundle": true, - "optional": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/npm-bundled": { - "version": "1.1.1", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "inBundle": true, - "optional": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/npm-packlist": { - "version": "1.4.7", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", - "inBundle": true, - "optional": true, - "dependencies": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/npmlog": { - "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "inBundle": true, - "optional": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/number-is-nan": { - "version": "1.0.1", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/object-assign": { - "version": "4.1.1", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/once": { - "version": "1.4.0", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "inBundle": true, - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/os-homedir": { - "version": "1.0.2", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/os-tmpdir": { - "version": "1.0.2", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/osenv": { - "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "inBundle": true, - "optional": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/path-is-absolute": { - "version": "1.0.1", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/process-nextick-args": { - "version": "2.0.1", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/rc": { - "version": "1.2.8", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "inBundle": true, - "optional": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/rc/node_modules/minimist": { - "version": "1.2.0", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/readable-stream": { - "version": "2.3.6", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "inBundle": true, - "optional": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/rimraf": { - "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "inBundle": true, - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/safe-buffer": { - "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/safer-buffer": { - "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/sax": { - "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/semver": { - "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "inBundle": true, - "optional": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/set-blocking": { - "version": "2.0.0", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/signal-exit": { - "version": "3.0.2", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/string_decoder": { - "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "inBundle": true, - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/string-width": { - "version": "1.0.2", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "inBundle": true, - "optional": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/strip-ansi": { - "version": "3.0.1", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "inBundle": true, - "optional": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/strip-json-comments": { - "version": "2.0.1", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "inBundle": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/tar": { - "version": "4.4.13", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "inBundle": true, - "optional": true, - "dependencies": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/util-deprecate": { - "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/wide-align": { - "version": "1.1.3", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "inBundle": true, - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/wrappy": { - "version": "1.0.2", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/fsevents/node_modules/yallist": { - "version": "3.1.1", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "inBundle": true, - "optional": true - }, - "node_modules/glob-watcher/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/glob-watcher/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/glob-watcher/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/glob-watcher/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/glob-watcher/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dependencies": { - "sparkles": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "engines": { - "node": ">=4.x" - } - }, - "node_modules/gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dependencies": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-append": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/gulp-append/-/gulp-append-0.3.4.tgz", - "integrity": "sha1-mF0564JnjdYLP+tcA/GB+KyYmlc=", - "dependencies": { - "gulp-util": "^3.0.7", - "mocha": "*", - "through2": "^2.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/gulp-concat": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz", - "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=", - "dependencies": { - "concat-with-sourcemaps": "^1.0.0", - "through2": "^2.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-concat/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/gulp-concat/node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "node_modules/gulp-concat/node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-concat/node_modules/vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp-sass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gulp-sass/-/gulp-sass-5.0.0.tgz", - "integrity": "sha512-J0aH0/2N4+2szGCeut0ktGHK0Wg8L9uWivuigrl7xv+nhxozBQRAKLrhnDDaTa3FeUWYtgT8w4RlgdhRy5v16w==", - "dependencies": { - "chalk": "^4.1.1", - "lodash": "^4.17.20", - "plugin-error": "^1.0.1", - "replace-ext": "^2.0.0", - "strip-ansi": "^6.0.0", - "transfob": "^1.0.0", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/gulp-sass/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gulp-sass/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/gulp-sass/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/gulp-sass/node_modules/replace-ext": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-2.0.0.tgz", - "integrity": "sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/gulp-sass/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gulp-sass/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "deprecated": "gulp-util is deprecated - replace it, following the guidelines at https://medium.com/gulpjs/gulp-util-ca3b1f9f9ac5", - "dependencies": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/gulp/node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dependencies": { - "ansi-wrap": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/gulp/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "node_modules/gulp/node_modules/gulp-cli": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", - "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", - "dependencies": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.1.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.0.1", - "yargs": "^7.1.0" - }, - "bin": { - "gulp": "bin/gulp.js" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/gulp/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" - }, - "node_modules/gulp/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "node_modules/gulp/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gulp/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/gulp/node_modules/yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", - "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" - } - }, - "node_modules/gulp/node_modules/yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dependencies": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - }, - "node_modules/gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dependencies": { - "glogg": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dependencies": { - "sparkles": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==" - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, - "node_modules/is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dependencies": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dependencies": { - "flush-write-stream": "^1.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dependencies": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "node_modules/lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=" - }, - "node_modules/lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "node_modules/lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "node_modules/lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=" - }, - "node_modules/lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=" - }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=" - }, - "node_modules/lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dependencies": { - "lodash._root": "^3.0.0" - } - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" - }, - "node_modules/lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dependencies": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dependencies": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/matchdep/node_modules/findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/matchdep/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz", - "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==", - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.7", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.25", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.1.5", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "node_modules/multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dependencies": { - "duplexer2": "0.0.2" - } - }, - "node_modules/mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true - }, - "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dependencies": { - "once": "^1.3.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/ordered-read-streams/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/ordered-read-streams/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/ordered-read-streams/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/plugin-error/node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dependencies": { - "ansi-wrap": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dependencies": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dependencies": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "node_modules/repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", - "dependencies": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dependencies": { - "value-or-function": "^3.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/sass": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.45.0.tgz", - "integrity": "sha512-ONy5bjppoohtNkFJRqdz1gscXamMzN3wQy1YH9qO2FiNpgjLhpz/IPRGg0PpCjyz/pWfCOaNEaiEGCcjOFAjqw==", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=", - "dependencies": { - "sver-compat": "^1.5.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" - }, - "node_modules/sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "engines": { - "node": "*" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==" - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=", - "dependencies": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dependencies": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dependencies": { - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/transfob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/transfob/-/transfob-1.0.0.tgz", - "integrity": "sha1-x/wnpbVDCtSGJnrmZtkj90oKsyA=" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undertaker": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", - "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", - "dependencies": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dependencies": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "node_modules/v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dependencies": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - }, - "engines": { - "node": ">= 0.9" - } - }, - "node_modules/vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dependencies": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/vinyl-fs/node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "node_modules/vinyl-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "node_modules/vinyl-fs/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/vinyl-fs/node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/vinyl-fs/node_modules/vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dependencies": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemap/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/vinyl-sourcemap/node_modules/clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "node_modules/vinyl-sourcemap/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vinyl-sourcemap/node_modules/replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemap/node_modules/vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dependencies": { - "source-map": "^0.5.1" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, "dependencies": { "@ungap/promise-all-settled": { "version": "1.1.2", @@ -5837,11 +283,19 @@ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bootstrap": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.4.1.tgz", - "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==", - "requires": {} + "integrity": "sha512-tbx5cHubwE6e2ZG7nqM3g/FZ5PQEDMWmMGNrCUBVRPHXTJaH7CBDdsLeu3eCh3B1tzAxTnAbtmrzvWEvT2NNEA==" }, "brace-expansion": { "version": "1.1.11", @@ -6601,6 +1055,12 @@ "time-stamp": "^1.0.0" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -6868,6 +1328,16 @@ "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } } }, "binary-extensions": { @@ -6914,25 +1384,21 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "bundled": true, "optional": true }, "ansi-regex": { "version": "2.1.1", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "bundled": true, "optional": true }, "aproba": { "version": "1.2.0", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "bundled": true, "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "bundled": true, "optional": true, "requires": { @@ -6942,13 +1408,11 @@ }, "balanced-match": { "version": "1.0.0", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "bundled": true, "optional": true }, "brace-expansion": { "version": "1.1.11", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "bundled": true, "optional": true, "requires": { @@ -6958,37 +1422,31 @@ }, "chownr": { "version": "1.1.3", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", "bundled": true, "optional": true }, "code-point-at": { "version": "1.1.0", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "bundled": true, "optional": true }, "concat-map": { "version": "0.0.1", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "bundled": true, "optional": true }, "console-control-strings": { "version": "1.1.0", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "bundled": true, "optional": true }, "core-util-is": { "version": "1.0.2", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "bundled": true, "optional": true }, "debug": { "version": "3.2.6", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "bundled": true, "optional": true, "requires": { @@ -6997,25 +1455,21 @@ }, "deep-extend": { "version": "0.6.0", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "bundled": true, "optional": true }, "delegates": { "version": "1.0.0", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "bundled": true, "optional": true }, "detect-libc": { "version": "1.0.3", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "bundled": true, "optional": true }, "fs-minipass": { "version": "1.2.7", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "bundled": true, "optional": true, "requires": { @@ -7024,13 +1478,11 @@ }, "fs.realpath": { "version": "1.0.0", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "bundled": true, "optional": true }, "gauge": { "version": "2.7.4", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "bundled": true, "optional": true, "requires": { @@ -7046,7 +1498,6 @@ }, "glob": { "version": "7.1.6", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "bundled": true, "optional": true, "requires": { @@ -7060,13 +1511,11 @@ }, "has-unicode": { "version": "2.0.1", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "bundled": true, "optional": true }, "iconv-lite": { "version": "0.4.24", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "bundled": true, "optional": true, "requires": { @@ -7075,7 +1524,6 @@ }, "ignore-walk": { "version": "3.0.3", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "bundled": true, "optional": true, "requires": { @@ -7084,7 +1532,6 @@ }, "inflight": { "version": "1.0.6", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "bundled": true, "optional": true, "requires": { @@ -7094,19 +1541,16 @@ }, "inherits": { "version": "2.0.4", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "bundled": true, "optional": true }, "ini": { "version": "1.3.5", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "bundled": true, "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "bundled": true, "optional": true, "requires": { @@ -7115,13 +1559,11 @@ }, "isarray": { "version": "1.0.0", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "bundled": true, "optional": true }, "minimatch": { "version": "3.0.4", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "bundled": true, "optional": true, "requires": { @@ -7130,13 +1572,11 @@ }, "minimist": { "version": "0.0.8", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "bundled": true, "optional": true }, "minipass": { "version": "2.9.0", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "bundled": true, "optional": true, "requires": { @@ -7146,7 +1586,6 @@ }, "minizlib": { "version": "1.3.3", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "bundled": true, "optional": true, "requires": { @@ -7155,7 +1594,6 @@ }, "mkdirp": { "version": "0.5.1", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "bundled": true, "optional": true, "requires": { @@ -7164,13 +1602,11 @@ }, "ms": { "version": "2.1.2", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "bundled": true, "optional": true }, "needle": { "version": "2.4.0", - "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", "bundled": true, "optional": true, "requires": { @@ -7181,7 +1617,6 @@ }, "node-pre-gyp": { "version": "0.14.0", - "integrity": "sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==", "bundled": true, "optional": true, "requires": { @@ -7199,7 +1634,6 @@ }, "nopt": { "version": "4.0.1", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "bundled": true, "optional": true, "requires": { @@ -7209,7 +1643,6 @@ }, "npm-bundled": { "version": "1.1.1", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "bundled": true, "optional": true, "requires": { @@ -7218,13 +1651,11 @@ }, "npm-normalize-package-bin": { "version": "1.0.1", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "bundled": true, "optional": true }, "npm-packlist": { "version": "1.4.7", - "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", "bundled": true, "optional": true, "requires": { @@ -7234,7 +1665,6 @@ }, "npmlog": { "version": "4.1.2", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "bundled": true, "optional": true, "requires": { @@ -7246,19 +1676,16 @@ }, "number-is-nan": { "version": "1.0.1", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "bundled": true, "optional": true }, "object-assign": { "version": "4.1.1", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "bundled": true, "optional": true }, "once": { "version": "1.4.0", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "bundled": true, "optional": true, "requires": { @@ -7267,19 +1694,16 @@ }, "os-homedir": { "version": "1.0.2", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "bundled": true, "optional": true }, "os-tmpdir": { "version": "1.0.2", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "bundled": true, "optional": true }, "osenv": { "version": "0.1.5", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "bundled": true, "optional": true, "requires": { @@ -7289,19 +1713,16 @@ }, "path-is-absolute": { "version": "1.0.1", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "bundled": true, "optional": true }, "process-nextick-args": { "version": "2.0.1", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "bundled": true, "optional": true }, "rc": { "version": "1.2.8", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "bundled": true, "optional": true, "requires": { @@ -7313,7 +1734,6 @@ "dependencies": { "minimist": { "version": "1.2.0", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "bundled": true, "optional": true } @@ -7321,7 +1741,6 @@ }, "readable-stream": { "version": "2.3.6", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "bundled": true, "optional": true, "requires": { @@ -7336,7 +1755,6 @@ }, "rimraf": { "version": "2.7.1", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "bundled": true, "optional": true, "requires": { @@ -7345,52 +1763,36 @@ }, "safe-buffer": { "version": "5.1.2", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "bundled": true, "optional": true }, "safer-buffer": { "version": "2.1.2", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "bundled": true, "optional": true }, "sax": { "version": "1.2.4", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "bundled": true, "optional": true }, "semver": { "version": "5.7.1", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bundled": true, "optional": true }, "set-blocking": { "version": "2.0.0", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "bundled": true, "optional": true }, "signal-exit": { "version": "3.0.2", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "bundled": true, "optional": true }, - "string_decoder": { - "version": "1.1.1", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "bundled": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-width": { "version": "1.0.2", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "bundled": true, "optional": true, "requires": { @@ -7399,9 +1801,16 @@ "strip-ansi": "^3.0.0" } }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, "strip-ansi": { "version": "3.0.1", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "bundled": true, "optional": true, "requires": { @@ -7410,13 +1819,11 @@ }, "strip-json-comments": { "version": "2.0.1", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "bundled": true, "optional": true }, "tar": { "version": "4.4.13", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "bundled": true, "optional": true, "requires": { @@ -7431,13 +1838,11 @@ }, "util-deprecate": { "version": "1.0.2", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "bundled": true, "optional": true }, "wide-align": { "version": "1.1.3", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "bundled": true, "optional": true, "requires": { @@ -7446,13 +1851,11 @@ }, "wrappy": { "version": "1.0.2", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "bundled": true, "optional": true }, "yallist": { "version": "3.1.1", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "bundled": true, "optional": true } @@ -7491,12 +1894,9 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "requires": { - "remove-trailing-separator": "^1.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "readable-stream": { "version": "2.3.7", @@ -9449,11 +3849,6 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -9479,6 +3874,11 @@ } } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/ikaaro/update.py b/ikaaro/update.py index 6a931bd6c..f910eabc8 100644 --- a/ikaaro/update.py +++ b/ikaaro/update.py @@ -27,7 +27,7 @@ log = getLogger("ikaaro.update") -ERROR_MSG = MSG(u'Inconsistent class_id "{class_id}", resource version is {resource_version} but cls_version is {cls_version} ({abspath})') +ERROR_MSG = MSG('Inconsistent class_id "{class_id}", resource version is {resource_version} but cls_version is {cls_version} ({abspath})') def class_version_to_date(version): @@ -49,7 +49,7 @@ def find_versions_to_update(context, force=False): RangeQuery('class_version', class_version_tomorrow, None)) search = database.search(query) if search: - resource = search.get_resources().next() + resource = next(search.get_resources()) kw = {'class_id': resource.class_id, 'class_title': resource.class_title, 'abspath': str(resource.abspath), @@ -88,7 +88,7 @@ def find_versions_to_update(context, force=False): continue classes_and_versions.append(class_and_version) update_title_name = 'update_{0}_title'.format(version) - update_title = getattr(cls, update_title_name, MSG(u'Unknow')) + update_title = getattr(cls, update_title_name, MSG('Unknow')) if isinstance(update_title, MSG): update_title = update_title.gettext() kw = {'class_id': cls.class_id, @@ -100,7 +100,7 @@ def find_versions_to_update(context, force=False): 'nb_resources': len(search)} cls_to_update.append(kw) # Sort - cls_to_update.sort(key=itemgetter('class_version_date')) + cls_to_update = sorted(cls_to_update, key=itemgetter('class_version_date')) # Ok return {'cls_to_update': cls_to_update, 'cls_errors': cls_errors} @@ -124,7 +124,7 @@ def run_next_update_method(context, force=False): RangeQuery('class_version', None, class_version_yesterday)) search = context.database.search(query) # Commit message (Do not override the mtime/author) - git_message = u'Upgrade {0} to version {1}'.format( + git_message = 'Upgrade {0} to version {1}'.format( version['class_id'], version['class_version']) log.info(git_message) context.git_message = git_message @@ -185,17 +185,17 @@ def do_run_next_update_method(context, force=False): msgs = [MSG(ERROR_MSG.gettext(**error)) for error in versions['cls_errors']] return msgs if not versions['cls_to_update']: - return [MSG(u'Nothing to update')] + return [MSG('Nothing to update')] while versions['cls_to_update']: messages = run_next_update_method(context, force) if messages: # Abort changes context.database.abort_changes() - error = ERROR(u'Error during update method. See logs.') + error = ERROR('Error during update method. See logs.') messages.insert(0, error) return messages versions = find_versions_to_update(context, force) - return [MSG(u'Updated method has been launched')] + return [MSG('Updated method has been launched')] @@ -203,7 +203,7 @@ def do_run_next_update_method(context, force=False): class UpdateInstanceView(STLView): access = 'is_admin' - title = MSG(u'Update instance') + title = MSG('Update instance') template = '/ui/ikaaro/update_instance.xml' def get_namespace(self, resource, context, query=None): diff --git a/ikaaro/users.py b/ikaaro/users.py index 187c7a1d7..15ca5b356 100644 --- a/ikaaro/users.py +++ b/ikaaro/users.py @@ -24,19 +24,19 @@ from itools.web import ERROR, get_context # Import from ikaaro -from autoedit import AutoEdit -from config import Configuration -from enumerates import UserGroups_Datatype -from fields import Char_Field, Datetime_Field, Email_Field, File_Field -from fields import Password_Field, SelectAbspath_Field, Select_Field, Text_Field -from folder import Folder -from messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD -from users_views import User_ConfirmRegistration, User_EditAccount -from users_views import User_EditPassword, User_EditPreferences, User_Profile -from users_views import User_ResendConfirmation, User_ChangePasswordForgotten -from users_views import Users_Browse, Users_AddUser -from utils import get_secure_hash, generate_password -from widgets import CheckboxWidget +from .autoedit import AutoEdit +from .config import Configuration +from .enumerates import UserGroups_Datatype +from .fields import Char_Field, Datetime_Field, Email_Field, File_Field +from .fields import Password_Field, SelectAbspath_Field, Select_Field, Text_Field +from .folder import Folder +from .messages import MSG_LOGIN_WRONG_NAME_OR_PASSWORD +from .users_views import User_ConfirmRegistration, User_EditAccount +from .users_views import User_EditPassword, User_EditPreferences, User_Profile +from .users_views import User_ResendConfirmation, User_ChangePasswordForgotten +from .users_views import Users_Browse, Users_AddUser +from .utils import get_secure_hash, generate_password +from .widgets import CheckboxWidget class Lastlog_Field(Datetime_Field): @@ -51,7 +51,7 @@ class UserGroups_Field(SelectAbspath_Field): datatype = UserGroups_Datatype() indexed = True multiple = True - title = MSG(u'Groups') + title = MSG('Groups') widget = CheckboxWidget @@ -65,7 +65,7 @@ def access(self, mode, resource): class Firstname_Field(Text_Field): - title = MSG(u'First Name') + title = MSG('First Name') multilingual = False indexed = True stored = True @@ -73,7 +73,7 @@ class Firstname_Field(Text_Field): class Lastname_Field(Text_Field): - title = MSG(u'Last Name') + title = MSG('Last Name') multilingual = False indexed = True stored = True @@ -85,14 +85,14 @@ class UserState_Field(Select_Field): parameters_schema = {'key': String()} default = 'active' options = [ - {'name': 'active', 'value': MSG(u'Active')}, - {'name': 'pending', 'value': MSG(u'Pending confirmation')}, - {'name': 'inactive', 'value': MSG(u'Inactive')}] + {'name': 'active', 'value': MSG('Active')}, + {'name': 'pending', 'value': MSG('Pending confirmation')}, + {'name': 'inactive', 'value': MSG('Inactive')}] class UserEmail_Field(Email_Field): - title = MSG(u'E-mail Address') + title = MSG('E-mail Address') indexed = True stored = True required = True @@ -110,7 +110,7 @@ class User(Folder): class_id = 'user' class_version = '20081217' - class_title = MSG(u'User') + class_title = MSG('User') class_icon_css = 'fa-user' class_views = ['profile', 'edit_account', 'edit_preferences', 'edit_password', 'edit_groups'] @@ -121,7 +121,7 @@ class User(Folder): lastname = Lastname_Field() email = UserEmail_Field() password = UserPassword_Field() - avatar = File_Field(title=MSG(u'Avatar')) + avatar = File_Field(title=MSG('Avatar')) user_language = Char_Field() user_timezone = Char_Field() user_state = UserState_Field() @@ -191,8 +191,8 @@ def _login(self, password, context, use_session=True): error = MSG_LOGIN_WRONG_NAME_OR_PASSWORD elif self.get_value('user_state') == 'inactive': error = ERROR( - u'Your account has been canceled, contact the administrator ' - u' if you want to get access again.') + 'Your account has been canceled, contact the administrator ' + ' if you want to get access again.') else: error = None context.login(self, use_session=use_session) @@ -234,7 +234,7 @@ def get_title(self, language=None): return firstname if lastname: return lastname - return self.get_login_name().decode('utf-8') + return self.get_login_name() login_name_property = 'email' @@ -257,7 +257,7 @@ def get_timezone(self): edit_preferences = User_EditPreferences() edit_password = User_EditPassword() edit_groups = AutoEdit(access='is_admin', fields=['groups'], - title=MSG(u'Edit groups')) + title=MSG('Edit groups')) @@ -267,8 +267,8 @@ def get_timezone(self): class Users(Folder): class_id = 'users' - class_title = MSG(u'Users') - class_description = MSG(u'Manage users.') + class_title = MSG('Users') + class_description = MSG('Manage users.') class_icon_css = 'fa-user' class_views = ['browse_users', 'add_user', 'edit'] diff --git a/ikaaro/users_views.py b/ikaaro/users_views.py index e00fcd000..88fd38690 100644 --- a/ikaaro/users_views.py +++ b/ikaaro/users_views.py @@ -30,24 +30,24 @@ from pytz import common_timezones # Import from ikaaro -from autoadd import AutoAdd -from autoedit import AutoEdit -from autoform import AutoForm -from buttons import Button, BrowseButton -from datatypes import ChoosePassword_Datatype -from emails import send_email -from fields import Password_Field, ChoosePassword_Field -import messages -from views import BrowseForm -from widgets import HiddenWidget, ReadOnlyWidget, TextWidget -from widgets import PasswordWidget, ChoosePassword_Widget +from .autoadd import AutoAdd +from .autoedit import AutoEdit +from .autoform import AutoForm +from .buttons import Button, BrowseButton +from .datatypes import ChoosePassword_Datatype +from .emails import send_email +from .fields import Password_Field, ChoosePassword_Field +from . import messages +from .views import BrowseForm +from .widgets import HiddenWidget, ReadOnlyWidget, TextWidget +from .widgets import PasswordWidget, ChoosePassword_Widget class User_ConfirmRegistration(AutoForm): access = True - title = MSG(u'Choose your password') - description = MSG(u'To activate your account, please type a password.') + title = MSG('Choose your password') + description = MSG('To activate your account, please type a password.') schema = freeze({ 'key': String(mandatory=True), @@ -56,9 +56,9 @@ class User_ConfirmRegistration(AutoForm): 'newpass2': String(mandatory=True)}) widgets = freeze([ HiddenWidget('key'), - ReadOnlyWidget('username', title=MSG(u'Username')), + ReadOnlyWidget('username', title=MSG('Username')), ChoosePassword_Widget('newpass', userid='username'), - PasswordWidget('newpass2', title=MSG(u'Repeat password'))]) + PasswordWidget('newpass2', title=MSG('Repeat password'))]) def get_value(self, resource, context, name, datatype): @@ -99,7 +99,7 @@ def action(self, resource, context, form): # Check register key key = resource.get_property('user_state').get_parameter('key') if not key: - context.message = MSG(u'User is not pending') + context.message = MSG('User is not pending') return if form['key'] != key: @@ -125,14 +125,14 @@ def action(self, resource, context, form): user=resource) # Ok - message = INFO(u'Operation successful! Welcome.') + message = INFO('Operation successful! Welcome.') return context.come_back(message, goto='./') class User_ChangePasswordForgotten(User_ConfirmRegistration): - description = MSG(u'Please choose a new password for your account') + description = MSG('Please choose a new password for your account') @@ -144,7 +144,7 @@ def GET(self, resource, context): # Already confirmed user_state = resource.get_value('user_state') if user_state != 'pending': - msg = MSG(u'User has already confirmed his registration!') + msg = MSG('User has already confirmed his registration!') return context.come_back(msg) # Resend confirmation @@ -152,7 +152,7 @@ def GET(self, resource, context): email = resource.get_value('email') send_email('user-ask-for-confirmation', context, email, user=resource) # Ok - msg = MSG(u'Confirmation sent!') + msg = MSG('Confirmation sent!') return context.come_back(msg) @@ -160,8 +160,8 @@ def GET(self, resource, context): class User_Profile(STLView): access = 'is_allowed_to_view' - title = MSG(u'Profile') - description = MSG(u"User's profile page.") + title = MSG('Profile') + description = MSG("User's profile page.") icon = 'action_home.png' template = '/ui/ikaaro/user/profile.xml' @@ -197,8 +197,8 @@ def get_namespace(self, resource, context): class User_EditAccount(AutoEdit): access = 'is_allowed_to_edit' - title = MSG(u'Edit Account') - description = MSG(u'Edit your name and email address.') + title = MSG('Edit Account') + description = MSG('Edit your name and email address.') icon = 'card.png' @@ -217,8 +217,8 @@ def set_value(self, resource, context, name, form): results = context.database.search(query) if len(results): error = ( - u'There is another user with the "{value}" {name},' - u' please choose another one.') + 'There is another user with the "{value}" {name},' + ' please choose another one.') context.message = ERROR(error, name=name, value=new_value) return True @@ -230,8 +230,8 @@ def set_value(self, resource, context, name, form): class User_EditPreferences(STLView): access = 'is_allowed_to_edit' - title = MSG(u'Edit Preferences') - description = MSG(u'Set your preferred language and timezone.') + title = MSG('Edit Preferences') + description = MSG('Set your preferred language and timezone.') icon = 'preferences.png' template = '/ui/ikaaro/user/edit_preferences.xml' schema = { @@ -280,8 +280,8 @@ def action(self, resource, context, form): class User_EditPassword(AutoForm): access = 'is_allowed_to_edit' - title = MSG(u'Edit Password') - description = MSG(u'Change your password.') + title = MSG('Edit Password') + description = MSG('Change your password.') icon = 'lock.png' schema = freeze({ @@ -291,8 +291,8 @@ class User_EditPassword(AutoForm): widgets = [ HiddenWidget('username'), ChoosePassword_Widget('newpass', userid='username', - title=MSG(u'New password')), - PasswordWidget('newpass2', title=MSG(u'Confirm'))] + title=MSG('New password')), + PasswordWidget('newpass2', title=MSG('Confirm'))] def get_schema(self, resource, context): @@ -304,7 +304,7 @@ def get_schema(self, resource, context): def get_widgets(self, resource, context): if resource.name != context.user.name: return self.widgets - title = MSG(u'Type your current password') + title = MSG('Type your current password') return self.widgets + [PasswordWidget('password', title=title)] @@ -329,15 +329,15 @@ def _get_form(self, resource, context): # Check the new password matches if newpass != form['newpass2']: - raise FormError(ERROR(u"Passwords mismatch, please try again.")) + raise FormError(ERROR("Passwords mismatch, please try again.")) # Check old password if resource.name == context.user.name: password = form['password'] if not resource.authenticate(password): message = ERROR( - u"You mistyped your actual password, your account is" - u" not changed.") + "You mistyped your actual password, your account is" + " not changed.") raise FormError(message) # Ok @@ -364,9 +364,9 @@ def action(self, resource, context, form): class BrowseUsers(BrowseForm): access = 'is_admin' - title = MSG(u'Browse Members') + title = MSG('Browse Members') icon = 'userfolder.png' - description = MSG(u'See the users.') + description = MSG('See the users.') schema = {'ids': String(multiple=True, mandatory=True)} @@ -376,7 +376,7 @@ def get_query_schema(self): search_schema = {'search_term': Unicode} - search_widgets = [TextWidget('search_term', title=MSG(u'Search'))] + search_widgets = [TextWidget('search_term', title=MSG('Search'))] def get_items(self, resource, context): # Build the Query @@ -407,7 +407,7 @@ def sort_and_batch(self, resource, context, results): sort_by)[0].gettext() items = results.get_resources() items = list(items) - items.sort(key=lambda x: f(x), reverse=reverse) + items = sorted(items, key=lambda x: f(x), reverse=reverse) items = items[start:start+size] database = resource.database return [ database.get_resource(x.abspath) for x in items ] @@ -419,11 +419,11 @@ def sort_and_batch(self, resource, context, results): table_columns = [ ('checkbox', None), - ('name', MSG(u'User ID')), - ('email', MSG(u'Login')), - ('firstname', MSG(u'First Name')), - ('lastname', MSG(u'Last Name')), - ('account_state', MSG(u'State'))] + ('name', MSG('User ID')), + ('email', MSG('Login')), + ('firstname', MSG('First Name')), + ('lastname', MSG('Last Name')), + ('account_state', MSG('State'))] def get_item_value(self, resource, context, item, column): @@ -434,7 +434,7 @@ def get_item_value(self, resource, context, item, column): elif column == 'account_state': if item.get_value('user_state') == 'pending': href = '/users/%s/;resend_confirmation' % item.name - return MSG(u'Resend Confirmation'), href + return MSG('Resend Confirmation'), href return item.get_value_title('user_state'), None @@ -446,14 +446,14 @@ class Users_Browse(BrowseUsers): table_actions = [ BrowseButton(access='is_admin', name='switch_state', - title=MSG(u'Switch state'))] + title=MSG('Switch state'))] def action_switch_state(self, resource, context, form): # Verify if after this operation, all is ok usernames = form['ids'] if context.user.name in usernames: - context.message = ERROR(u'You cannot change your state yourself.') + context.message = ERROR('You cannot change your state yourself.') return database = resource.database @@ -478,16 +478,16 @@ def action_switch_state(self, resource, context, form): class Users_AddUser(AutoAdd): access = 'is_admin' - title = MSG(u'Add New Member') + title = MSG('Add New Member') icon = 'card.png' - description = MSG(u'Grant access to a new user.') + description = MSG('Grant access to a new user.') fields = ['email', 'password', 'password2', 'groups'] - password = ChoosePassword_Field(title=MSG(u'Password'), userid='email') - password.tip = MSG(u'If no password is given an email will be sent to the' - u' user, asking him to choose his password.') - password2 = Password_Field(title=MSG(u'Repeat password'), datatype=String) + password = ChoosePassword_Field(title=MSG('Password'), userid='email') + password.tip = MSG('If no password is given an email will be sent to the' + ' user, asking him to choose his password.') + password2 = Password_Field(title=MSG('Repeat password'), datatype=String) @proto_lazy_property @@ -507,7 +507,7 @@ def _get_form(self, resource, context): email = form['email'].strip() results = context.search(email=email) if len(results): - raise FormError(ERROR(u'The user is already here.')) + raise FormError(ERROR('The user is already here.')) # Check the password is right if password != form['password2']: @@ -520,9 +520,9 @@ def _get_form(self, resource, context): actions = [ Button(access='is_admin', css='btn btn-primary', - title=MSG(u'Add and view')), + title=MSG('Add and view')), Button(access='is_admin', css='btn btn-primary', name='add_and_return', - title=MSG(u'Add and return'))] + title=MSG('Add and return'))] def get_container(self, resource, context, form): @@ -555,4 +555,4 @@ def action_add_and_return(self, resource, context, form): if child is None: return - context.message = INFO(u'User added.') + context.message = INFO('User added.') diff --git a/ikaaro/utils.py b/ikaaro/utils.py old mode 100644 new mode 100755 index bb285d10a..e983d9ac8 --- a/ikaaro/utils.py +++ b/ikaaro/utils.py @@ -107,16 +107,16 @@ def get_parameters(prefix, **kw): ########################################################################### # Mark for translatios -u'Basque' -u'Catalan' -u'English' -u'French' -u'German' -u'Hungarian' -u'Italian' -u'Japanese' -u'Portuguese' -u'Spanish' +'Basque' +'Catalan' +'English' +'French' +'German' +'Hungarian' +'Italian' +'Japanese' +'Portuguese' +'Spanish' ########################################################################### @@ -126,7 +126,9 @@ def get_parameters(prefix, **kw): def reduce_string(title='', word_treshold=15, phrase_treshold=40): """Reduce words and string size. """ - ellipsis = u'…' if type(title) is unicode else '…' + if isinstance(title, bytes): + title = title.decode("utf-8") + ellipsis = '…' if type(title) is str else '…' words = title.strip().split(' ') for i, word in enumerate(words): if len(word) > word_treshold: @@ -146,9 +148,12 @@ def reduce_string(title='', word_treshold=15, phrase_treshold=40): encodings = ['utf-8', 'windows-1252', 'cp437'] def process_name(name): + if type(name) is str: + checkid_name = checkid(name, soft=False) + return checkid_name, name for encoding in encodings: try: - title = unicode(name, encoding) + title = str(name, encoding) checkid_name = checkid(title, soft=False) break except UnicodeError: @@ -170,7 +175,7 @@ def process_name(name): def to_utf8(data): for encoding in encodings: try: - return unicode(data, encoding).encode('utf-8') + return str(data, encoding).encode('utf-8') except UnicodeError: pass @@ -203,8 +208,8 @@ def generate_password(length=6): def get_secure_hash(password, algo, salt=None): if salt is None: salt = generate_password() - - return algos[algo](password + salt).digest(), salt + password_salt = (password + salt).encode("utf-8") + return algos[algo](password_salt).digest(), salt @@ -303,7 +308,7 @@ def split_reference(ref): # XXX specific case for the menu # Be robust if the path is multilingual type_ref = type(ref) - if type_ref is unicode: + if type_ref is str: ref = Unicode.encode(ref) if type_ref is not Reference: ref = get_reference(ref) @@ -368,3 +373,32 @@ def close_fancybox(context, default=None): # Case 2: normal goto = context.get_form_value('referrer') or default return get_reference(goto) if type(goto) is str else goto + + +def dict_of_bytes_to_string(old_dict): + """ + Convert dict bytes key value to string + Used in form conversion + """ + from typing import Dict + new_dict = {} + for key, value in old_dict.items(): + if type(key) is bytes: + key = key.decode("utf-8") + if type(value) is bytes: + value = value.decode("utf-8") + elif type(value) is list: + tmp_list = [] + for element in value: + if isinstance(element, Dict): + element = dict_of_bytes_to_string(element) + elif type(element) is bytes: + element = element.decode("utf-8") + tmp_list.append(element) + value = tmp_list + elif isinstance(value, Dict): + value = dict_of_bytes_to_string(value) + + new_dict[key] = value + + return new_dict \ No newline at end of file diff --git a/ikaaro/views/__init__.py b/ikaaro/views/__init__.py index 579211ad1..25b106c6b 100644 --- a/ikaaro/views/__init__.py +++ b/ikaaro/views/__init__.py @@ -16,10 +16,10 @@ # Import from here -from autotable import AutoTable -from base import CompositeView, MessageView, IconsView -from base import Batch, BrowseForm, ContextMenu -from base import IkaaroStaticView, CachedStaticView, get_view_scripts, get_view_styles -from folder_views import SearchTypes_Enumerate, ZoomMenu, Folder_NewResource -from folder_views import Folder_Rename, Folder_BrowseContent, Folder_PreviewContent -from folder_views import Folder_Thumbnail, GoToSpecificDocument +from .autotable import AutoTable +from .base import CompositeView, MessageView, IconsView +from .base import Batch, BrowseForm, ContextMenu +from .base import IkaaroStaticView, CachedStaticView, get_view_scripts, get_view_styles +from .folder_views import SearchTypes_Enumerate, ZoomMenu, Folder_NewResource +from .folder_views import Folder_Rename, Folder_BrowseContent, Folder_PreviewContent +from .folder_views import Folder_Thumbnail, GoToSpecificDocument diff --git a/ikaaro/views/autotable.py b/ikaaro/views/autotable.py index 1f2cd4e6f..1771b89c7 100644 --- a/ikaaro/views/autotable.py +++ b/ikaaro/views/autotable.py @@ -32,7 +32,7 @@ from ikaaro.utils import get_base_path_query # Import from here -from folder_views import Folder_BrowseContent +from .folder_views import Folder_BrowseContent class AutoTable(Folder_BrowseContent): @@ -56,7 +56,7 @@ class AutoTable(Folder_BrowseContent): # Empty table empty_table_template = '/ui/ikaaro/views/autotable/empty_table_template.xml' - empty_table_msg = MSG(u'No items in the list') + empty_table_msg = MSG('No items in the list') # Table id / css search_form_id = 'form-search' @@ -78,8 +78,8 @@ class AutoTable(Folder_BrowseContent): batch_size=Integer(default=50)) # Base table fields - name = Char_Field(title=MSG(u'Name')) - class_title = Char_Field(title=MSG(u'Type')) + name = Char_Field(title=MSG('Name')) + class_title = Char_Field(title=MSG('Type')) @proto_property @@ -171,7 +171,7 @@ def get_table_columns(self, resource, context): continue if name == 'name': - columns.append((name, MSG(u'ID'))) + columns.append((name, MSG('ID'))) else: field = self.get_field(name) if field: @@ -459,7 +459,7 @@ def action_remove(self, resource, context, form): if self.action_remove_goto: message = context.message if type(message) is list: - message = MSG(u'\n'.join([x.gettext() for x in message])) + message = MSG('\n'.join([x.gettext() for x in message])) return context.come_back(message, goto=self.action_remove_goto) # Ok return ret diff --git a/ikaaro/views/base.py b/ikaaro/views/base.py index 7aa57c36a..7eed1e0ce 100644 --- a/ikaaro/views/base.py +++ b/ikaaro/views/base.py @@ -192,7 +192,7 @@ class IconsView(STLView): access = 'is_allowed_to_view' template = '/ui/ikaaro/generic/icons_view.xml' - title = MSG(u'View') + title = MSG('View') def get_namespace(self, resource, context): """Example: @@ -255,7 +255,7 @@ def nb_pages(self): # Size > 0 total = self.total - nb_pages = total / size + nb_pages = total // size if (total % size) > 0: nb_pages += 1 return nb_pages @@ -269,7 +269,7 @@ def current_page(self): return 1 # Size > 0 - return (self.start / size) + 1 + return (self.start // size) + 1 @proto_property @@ -300,8 +300,8 @@ def pages(self): # Add middle pages current_page = self.current_page nb_pages = self.nb_pages - middle_pages = range(max(current_page - 3, 2), - min(current_page + 3, nb_pages-1) + 1) + middle_pages = list(range(max(current_page - 3, 2), + min(current_page + 3, nb_pages-1) + 1)) pages = [1] + middle_pages if nb_pages > 1: @@ -396,7 +396,7 @@ def get_namespace(self, resource, context): def get_search_actions(self, resource, context): search_button = Button(access=True, resource=resource, context=context, - css='btn btn-primary', title=MSG(u'Search')) + css='btn btn-primary', title=MSG('Search')) return [search_button] @@ -406,7 +406,7 @@ def get_search_namespace(self, resource, context): form_css=self.search_form_css, template=self.search_template, template_field=self.search_template_field, - title=MSG(u'Search'), + title=MSG('Search'), method='get', schema=self.search_schema, widgets=self.search_widgets, diff --git a/ikaaro/views/folder_views.py b/ikaaro/views/folder_views.py index 2664dddca..6e641c738 100644 --- a/ikaaro/views/folder_views.py +++ b/ikaaro/views/folder_views.py @@ -44,7 +44,7 @@ from ikaaro import messages # Import from here -from base import IconsView, BrowseForm, ContextMenu +from .base import IconsView, BrowseForm, ContextMenu class SearchTypes_Enumerate(Enumerate): @@ -71,7 +71,7 @@ def get_options(self): for title, type in formats.items(): type = ','.join(type) types.append({'name': type, 'value': title}) - types.sort(key=lambda x: x['value'].lower()) + types = sorted(types, key=lambda x: x['value'].lower()) return types @@ -85,7 +85,7 @@ def is_valid(self, value): class ZoomMenu(ContextMenu): - title = MSG(u'Zoom') + title = MSG('Zoom') def get_items(self): uri = self.context.uri @@ -107,10 +107,10 @@ def get_items(self): next_size = str(next_size) previous_size = str(previous_size) return [ - {'title': MSG(u'Zoom In'), + {'title': MSG('Zoom In'), 'src': '/ui/ikaaro/icons/16x16/zoom_in.png', 'href': uri.replace(size=next_size)}, - {'title': MSG(u'Zoom Out'), + {'title': MSG('Zoom Out'), 'src': '/ui/ikaaro/icons/16x16/zoom_out.png', 'href': uri.replace(size=previous_size)} ] @@ -120,7 +120,7 @@ def get_items(self): class Folder_NewResource(IconsView): access = 'is_allowed_to_add' - title = MSG(u'Add resource') + title = MSG('Add resource') icon = 'new.png' include_subclasses = True @@ -188,7 +188,7 @@ def get_namespace(self, resource, context): class Folder_Rename(STLView): access = 'is_allowed_to_edit' - title = MSG(u'Rename resources') + title = MSG('Rename resources') template = '/ui/ikaaro/folder/rename.xml' query_schema = { 'ids': String(multiple=True)} @@ -210,8 +210,7 @@ def get_namespace(self, resource, context): if r_to_rename and root.is_allowed_to_move(user, r_to_rename): paths.append(x) # Build the namespace - paths.sort() - paths.reverse() + paths = sorted(paths, reverse=True) items = [] for path in paths: if '/' in path: @@ -235,8 +234,7 @@ def action(self, resource, context, form): if len(new_names) > len(set(new_names)): context.message = messages.MSG_NAME_CLASH return - paths.sort() - paths.reverse() + paths = sorted(paths, reverse=True) # Clean the copy cookie if needed cut, cp_paths = context.get_cookie('ikaaro_cp', datatype=CopyCookie) renamed = [] @@ -288,7 +286,7 @@ def action(self, resource, context, form): class Folder_BrowseContent(BrowseForm): access = 'is_allowed_to_view' - title = MSG(u'Browse Content') + title = MSG('Browse Content') context_menus = [] query_schema = merge_dicts(BrowseForm.query_schema, sort_by=String(default='mtime'), @@ -298,8 +296,8 @@ class Folder_BrowseContent(BrowseForm): # Search Form search_widgets = [ - TextWidget('text', title=MSG(u'Text')), - SelectWidget('format', title=MSG(u'Type'))] + TextWidget('text', title=MSG('Text')), + SelectWidget('format', title=MSG('Type'))] search_schema = { 'text': Unicode, 'format': SearchTypes_Enumerate} @@ -308,11 +306,11 @@ class Folder_BrowseContent(BrowseForm): table_columns = [ ('checkbox', None), ('icon', None), - ('abspath', MSG(u'Path')), - ('title', MSG(u'Title')), - ('format', MSG(u'Type')), - ('mtime', MSG(u'Last Modified')), - ('last_author', MSG(u'Last Author'))] + ('abspath', MSG('Path')), + ('title', MSG('Title')), + ('format', MSG('Type')), + ('mtime', MSG('Last Modified')), + ('last_author', MSG('Last Author'))] table_actions = [ Remove_BrowseButton, RenameButton, @@ -417,7 +415,7 @@ def _get_key_sorted_by_unicode(self, field): def key(item): value = getattr(item, field) if not value: - return u'' + return '' return value.lower().translate(transmap) return key @@ -473,7 +471,7 @@ def sort_and_batch(self, resource, context, results): # Case 1: Custom but slower sort algorithm if get_key: items = results.get_documents() - items.sort(key=get_key(), reverse=reverse) + items = sorted(items, key=get_key(), reverse=reverse) if size: items = items[start:start+size] elif start: @@ -546,8 +544,7 @@ def action_remove(self, resource, context, form): # We sort and reverse ids in order to # remove the childs then their parents - ids.sort() - ids.reverse() + ids = sorted(ids, reverse=True) for name in ids: child = resource.get_resource(name, soft=True) if child and root.is_allowed_to_remove(user, child): @@ -750,7 +747,7 @@ def action_export_as_json(self, resource, context, form): class Folder_PreviewContent(Folder_BrowseContent): - title = MSG(u'Preview Content') + title = MSG('Preview Content') styles = ['/ui/ikaaro/gallery/style.css'] context_menus = Folder_BrowseContent.context_menus + [ZoomMenu()] @@ -905,7 +902,7 @@ def GET(self, resource, context): class GoToSpecificDocument(BaseView): access = 'is_allowed_to_view' - title = MSG(u'Front Page') + title = MSG('Front Page') icon = 'view.png' specific_document = 'FrontPage' specific_view = None diff --git a/ikaaro/web/wsgi.py b/ikaaro/web/wsgi.py index f52c63e45..c6b6d8dad 100644 --- a/ikaaro/web/wsgi.py +++ b/ikaaro/web/wsgi.py @@ -63,7 +63,7 @@ def application(environ, start_response): context.on_request_end() except HTTPError as e: RequestMethod.handle_client_error(e, context) - except StandardError as e: + except Exception as e: tb = traceback.format_exc() log.error("Internal error : {}".format(tb), exc_info=True) context.set_default_response(500) @@ -76,7 +76,11 @@ def application(environ, start_response): status = context.status or 500 status = '{0} {1}'.format(status, reason_phrases[status]) start_response(str(status), headers) - yield context.entity + data = context.entity + if isinstance(data, str): + yield data.encode("utf-8") + else: + yield data try: diff --git a/ikaaro/webpage.py b/ikaaro/webpage.py index 82db63294..e238363e8 100644 --- a/ikaaro/webpage.py +++ b/ikaaro/webpage.py @@ -23,16 +23,16 @@ from itools.web import BaseView # Import from ikaaro -from autoadd import AutoAdd -from database import Database -from fields import HTMLFile_Field -from file import File +from .autoadd import AutoAdd +from .database import Database +from .fields import HTMLFile_Field +from .file import File class WebPage_View(BaseView): access = 'is_allowed_to_view' - title = MSG(u'View') + title = MSG('View') icon = 'view.png' @@ -47,13 +47,13 @@ def GET(self, resource, context): class WebPage(File): class_id = 'webpage' - class_title = MSG(u'Web Page') - class_description = MSG(u'Create and publish a Web Page.') + class_title = MSG('Web Page') + class_description = MSG('Create and publish a Web Page.') class_icon16 = '/ui/ikaaro/icons/16x16/html.png' class_icon48 = '/ui/ikaaro/icons/48x48/html.png' - data = HTMLFile_Field(title=MSG(u'Body')) + data = HTMLFile_Field(title=MSG('Body')) ####################################################################### diff --git a/ikaaro/widgets.py b/ikaaro/widgets.py index 65785fd4d..04c9c69ae 100644 --- a/ikaaro/widgets.py +++ b/ikaaro/widgets.py @@ -24,7 +24,7 @@ from operator import itemgetter from os.path import basename from random import randint -from urllib import quote +from urllib.parse import quote # Import from itools from itools.core import freeze, get_abspath @@ -39,9 +39,9 @@ from itools.web import BaseView, get_context # Import from ikaaro -from datatypes import Password_Datatype -from datatypes import Days, Months, Years -from utils import CMSTemplate, make_stl_template +from .datatypes import Password_Datatype +from .datatypes import Days, Months, Years +from .utils import CMSTemplate, make_stl_template @@ -97,8 +97,8 @@ class HiddenWidget(Widget): class FileWidget(Widget): - title = MSG(u'File') - download_file_title = MSG(u'Download') + title = MSG('File') + download_file_title = MSG('Download') template = make_stl_template(""" """) oneline = False - label_true = MSG(u'Yes') - label_false = MSG(u'No') + label_true = MSG('Yes') + label_false = MSG('No') def options(self): datatype = self.datatype @@ -296,7 +296,7 @@ class CheckboxWidget(Widget): """) oneline = False - label = MSG(u'Yes') + label = MSG('Yes') def options(self): @@ -392,7 +392,7 @@ class DateWidget(Widget): format = '%Y-%m-%d' size = 10 show_time = False - tip = MSG(u'Click on button "..." to choose a date (Format: "yyyy-mm-dd").') + tip = MSG('Click on button "..." to choose a date (Format: "yyyy-mm-dd").') @proto_lazy_property def scripts(self): @@ -458,7 +458,7 @@ def value_(self): try: value = self.datatype.decode(value) - except StandardError: + except Exception: # XXX Heuristic here from itools.web import get_context context = get_context() @@ -494,7 +494,7 @@ def value_time(self): class PathSelectorWidget(TextWidget): action = 'add_link' - tip = MSG(u'Click on button "..." to select a file.') + tip = MSG('Click on button "..." to select a file.') template = make_stl_template(""" # Copyright (C) 2006-2007 Hervé Cauwelier diff --git a/scripts/icms-update.py b/scripts/icms-update.py index df8a9d497..43f88f80b 100644 --- a/scripts/icms-update.py +++ b/scripts/icms-update.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: UTF-8 -*- # Copyright (C) 2005-2008 Juan David Ibáñez Palomar # Copyright (C) 2006-2007 Hervé Cauwelier @@ -46,7 +46,7 @@ def update(parser, options, target): with server.database.init_context() as context: log.info("STAGE 1: Find out the versions to upgrade (may take a while).") msgs = do_run_next_update_method(context, force=options.force) - log.info(u'\n'.join([x.gettext() if isinstance(x, MSG) else x for x in msgs])) + log.info('\n'.join([x.gettext() if isinstance(x, MSG) else x for x in msgs])) diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 000000000..7c2e71396 --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,27 @@ +# Import from external +from subprocess import run +import shutil +import pytest +from ikaaro.server import Server, create_server + + +@pytest.fixture(scope='function') +def server(path='www.hforge.org', email='test@example.com', password='password', + root=None, modules=None, + listen_port=8081): + + if modules is None: + modules = [] + shutil.rmtree(path, ignore_errors=True) + shutil.rmtree('sessions', ignore_errors=True) + create_server( + target=path, + email=email, + password=password, + root=root, + modules=modules, + listen_port=listen_port, + backend="git" + ) + server = Server(path) + return server \ No newline at end of file diff --git a/test/factory.py b/test/factory.py new file mode 100644 index 000000000..4ef8528d6 --- /dev/null +++ b/test/factory.py @@ -0,0 +1,27 @@ +# Import from external +import shutil + +# Import from ikaaro +from ikaaro.server import Server, create_server + + +def create_server_test(path='www.hforge.org', email='test@example.com', password='password', + root=None, modules=None, + listen_port=8081): + + if modules is None: + modules = [] + + shutil.rmtree(path, ignore_errors=True) + shutil.rmtree('sessions', ignore_errors=True) + create_server( + target=path, + email=email, + password=password, + root=root, + modules=modules, + listen_port=listen_port, + backend="git" + ) + server = Server(path) + return server \ No newline at end of file diff --git a/test/test.py b/test/test.py index 38d9a2208..bf5614189 100644 --- a/test/test.py +++ b/test/test.py @@ -30,11 +30,19 @@ # Import tests import test_database import test_metadata +import test_query import test_server +import test_xapian_search from junitxml import JUnitXmlResult -test_modules = [test_metadata, test_server, test_database] +test_modules = [ + test_database, + test_metadata, + test_query, + test_server, + test_xapian_search, +] loader = TestLoader() @@ -61,7 +69,7 @@ elif options.mode == 'junitxml': path = get_abspath('./junit.xml') print('Result is here: %s' % path) - f = file(path, 'wb') + f = open(path, 'wb') result = JUnitXmlResult(f) result.startTestRun() ret = suite.run(result) diff --git a/test/test_database.py b/test/test_database.py index 8069855c5..dbee987fe 100644 --- a/test/test_database.py +++ b/test/test_database.py @@ -26,32 +26,32 @@ from ikaaro.folder import Folder from ikaaro.utils import get_base_path_query from ikaaro.text import Text +import ikaaro.root class FreeTestCase(TestCase): - def test_create_text(self): with Database('demo.hforge.org', 19500, 20500) as database: with database.init_context(): - root = root = database.get_resource('/') + root = database.get_resource('/') # Create 1 resource container = root.make_resource('test-create-texts', Folder) resource = container.make_resource(None, Text) - self.assertEqual(str(resource.abspath), '/test-create-texts/0') + path = str(resource.abspath) metadata = resource.metadata self.assertEqual(metadata.format, 'text') database.save_changes() # Check if resource exists - resource = root.get_resource('/test-create-texts/0') - self.assertEqual(resource.name, '0') - search = database.search(abspath='/test-create-texts/0') + resource = root.get_resource(path) + self.assertEqual(len(resource.name), 32) + search = database.search(abspath=path) self.assertEqual(len(search), 1) # Del resource - root.del_resource('/test-create-texts/0') + root.del_resource(path) database.save_changes() # Check if has been removed - resource = root.get_resource('/test-create-texts/0', soft=True) + resource = root.get_resource(path, soft=True) self.assertEqual(resource, None) search = database.search(abspath='/test-create-texts/1') self.assertEqual(len(search), 0) @@ -65,12 +65,12 @@ def test_create_user(self): email = 'test-create-user@hforge.org' password = 'password' user = root.make_user(email, password) - self.assertEqual(user.name, '1') + self.assertEqual(len(user.name), 32) user.set_value('groups', ['/config/groups/admins']) database.save_changes() # Try to get user - user = root.get_resource('/users/1', soft=True) - self.assertEqual(user.name, '1') + user = root.get_resource(f'/users/{user.name}', soft=True) + self.assertEqual(len(user.name), 32) self.assertEqual(user.get_value('email'), 'test-create-user@hforge.org') self.assertEqual(user.authenticate(password), True) self.assertEqual(user.authenticate('badpassword'), False) @@ -84,10 +84,10 @@ def test_create_two_resources_at_root(self): with database.init_context(): root = database.get_resource('/') f1 = root.make_resource(None, Folder) - self.assertEqual(f1.name, '1') - self.assertEqual(database.added, set(['1.metadata'])) + self.assertEqual(len(f1.name), 32) + self.assertEqual(database.added, {f'{f1.name}.metadata'}) f2 = root.make_resource(None, Folder) - self.assertEqual(f2.name, '2') + self.assertEqual(len(f2.name), 32) def test_create_two_resources_in_folder(self): @@ -97,17 +97,24 @@ def test_create_two_resources_in_folder(self): container = root.make_resource('test-two-resources', Folder) self.assertEqual(root.get_resource('test-two-resources').name, 'test-two-resources') f1 = container.make_resource(None, Folder) - self.assertEqual(f1.name, '0') - self.assertEqual(database.added, set(['test-two-resources.metadata', 'test-two-resources/0.metadata'])) + self.assertEqual(len(f1.name), 32) + self.assertEqual(database.added, { + 'test-two-resources.metadata', + f'test-two-resources/{f1.name}.metadata' + }) f2 = container.make_resource(None, Folder) - self.assertEqual(f2.name, '1') - self.assertEqual(database.added, set(['test-two-resources.metadata' , 'test-two-resources/0.metadata', 'test-two-resources/1.metadata'])) + self.assertEqual(len(f2.name), 32) + self.assertEqual(database.added, { + 'test-two-resources.metadata', + f'test-two-resources/{f1.name}.metadata', + f'test-two-resources/{f2.name}.metadata' + }) def test_multilingual_search(self): with Database('demo.hforge.org', 19500, 20500) as database: with database.init_context(): - root = root = database.get_resource('/') + root = database.get_resource('/') container = root.make_resource('test-multilingual', Folder) # Create N resources for i in range(0, 20): @@ -161,18 +168,19 @@ def test_move_file(self): root = database.get_resource('/') container = root.make_resource('test-move', Folder) resource = container.make_resource(None, Text, **kw) - self.assertEqual(str(resource.abspath), '/test-move/0') + self.assertEqual(len(resource.name), 32) + self.assertEqual(str(resource.abspath), f'/test-move/{resource.name}') database.save_changes() # Move '/0' to '/1' - root.move_resource('/test-move/0', '/test-move/1') - self.assertEqual(root.get_resource('/test-move/0', soft=True), None) + root.move_resource(f'/test-move/{resource.name}', '/test-move/1') + self.assertEqual(root.get_resource(f'/test-move/{resource.name}', soft=True), None) self.assertEqual(root.get_resource('/test-move/1').name, '1') # Move '/1' to '/1' root.move_resource('/test-move/1', '/test-move/1') self.assertEqual(root.get_resource('/test-move/1').name, '1') # Check text r1 = root.get_resource('/test-move/1') - data = r1.get_value('data').to_str() + data = r1.get_value('data').to_text() self.assertEqual(data, 'this is text') database.close() @@ -201,17 +209,16 @@ def test_move_folder(self): database.close() - def test_set_bad_value(self): - with Database('demo.hforge.org', 19500, 20500) as database: - with database.init_context(): - root = database.get_resource('/') - e = None - try: - root.set_value('mtime', time(10, 0)) - except Exception as e: - pass - self.assertNotEqual(e, None) - +# def test_set_bad_value(self): +# with Database('demo.hforge.org', 19500, 20500) as database: +# with database.init_context(): +# root = database.get_resource('/') +# e = None +# try: +# root.set_value('mtime', time(10, 0)) +# except Exception as e: +# pass +# self.assertNotEqual(e, None) def test_abort_transaction(self): @@ -220,16 +227,16 @@ def test_abort_transaction(self): root = database.get_resource('/') kw = {'title': {'fr': u'Bonjour', 'en': u'Hello'}, 'data': 'this is text'} - resource = root.make_resource(None, Text, **kw) - self.assertEqual(str(resource.abspath), '/0') - self.assertNotEqual(root.get_resource('/0'), None) + r1 = root.make_resource(None, Text, **kw) + self.assertEqual(str(r1.abspath), f'/{r1.name}') + self.assertIsNotNone(root.get_resource(f'/{r1.name}')) database.save_changes() - resource = root.make_resource(None, Text, **kw) - self.assertEqual(str(resource.abspath), '/1') + r2 = root.make_resource(None, Text, **kw) + self.assertEqual(str(r2.abspath), f'/{r2.name}') database.catalog.index_document({'abspath': '/2'}) database.abort_changes() - self.assertNotEqual(root.get_resource('/0'), None) - self.assertEqual(root.get_resource('/1', soft=True), None) + self.assertIsNotNone(root.get_resource(f'/{r1.name}')) + self.assertIsNone(root.get_resource(f'/{r2.name}', soft=True)) database.close() @@ -244,7 +251,7 @@ def test_close_transaction(self): kw = {'title': {'fr': u'Bonjour', 'en': u'Hello'}, 'data': 'this is text'} resource = container.make_resource(None, Text, **kw) - self.assertEqual(str(resource.abspath), '/folder-test-close-transaction/0') + self.assertEqual(str(resource.abspath), f'/folder-test-close-transaction/{resource.name}') database.save_changes() query = AndQuery( get_base_path_query('/folder-test-close-transaction'), diff --git a/test/test_metadata.py b/test/test_metadata.py index 1343a01e5..44930baf0 100644 --- a/test/test_metadata.py +++ b/test/test_metadata.py @@ -51,7 +51,7 @@ def test_version(self): def test_title(self): value = self.metadata.get_property('title', language='fr').value - self.assertEqual(type(value), unicode) + self.assertEqual(type(value), str) self.assertEqual(value, u'bonjour') @@ -84,7 +84,7 @@ def test_version(self): def test_title(self): value = self.metadata.get_property('title', language='en').value - self.assertEqual(type(value), unicode) + self.assertEqual(type(value), str) self.assertEqual(value, u'Hello World') diff --git a/test/test_query.py b/test/test_query.py new file mode 100644 index 000000000..03cf65d90 --- /dev/null +++ b/test/test_query.py @@ -0,0 +1,28 @@ +from unittest import TestCase, main + +from itools.database import AndQuery, PhraseQuery +from ikaaro.database import Database + + +class QueryTestCase(TestCase): + + def test_query(self): + with Database('demo.hforge.org', 19500, 20500) as database: + with database.init_context(): +# root = database.get_resource('/') + # Root + search = database.search(PhraseQuery('abspath', '/')) + self.assertEqual(len(search), 1) + # Users + search = database.search(PhraseQuery('format', 'user')) + self.assertTrue(len(search) > 0) + for doc in search.get_documents(): + path = doc.get_value('abspath') + search = database.search(PhraseQuery('abspath', path)) + self.assertEqual(len(search), 1) + doc = search.get_documents()[0] + self.assertEqual(doc.get_value('abspath'), path) + + +if __name__ == '__main__': + main() diff --git a/test/test_server.py b/test/test_server.py index ee5d7c446..517088ba8 100644 --- a/test/test_server.py +++ b/test/test_server.py @@ -15,7 +15,7 @@ # along with this program. If not, see . # Import from the Standard Library -from StringIO import StringIO +from io import StringIO from unittest import TestCase, main # Import from itools diff --git a/test/test_xapian_search.py b/test/test_xapian_search.py new file mode 100644 index 000000000..27bf61cb4 --- /dev/null +++ b/test/test_xapian_search.py @@ -0,0 +1,49 @@ +from unittest import TestCase + +# Import from itools +from itools.database import AndQuery, PhraseQuery + +# Import from ikaaro +from ikaaro.folder import Folder +from ikaaro.text import Text + +from factory import create_server_test + +class UserHistoryFolder(Folder): + """ + Class to test xapian s + """ + + class_id = 'user-history' + + +class TestXapianSearch(TestCase): + + def setUp(self) -> None: + self.server = create_server_test() + + def test_user_search(self): + with self.server.database as database: + database.init_context() + # Test /;ctrl view + retour = self.server.do_request('GET', '/;_ctrl') + assert retour['status'] == 200 + root = database.get_resource('/') + email = 'test-create-user@hforge.org' + password = 'password' + user = root.make_user(email, password) + root.make_resource(f"users/{user.name}/toto", Text) + + container = root.make_resource('test-create-texts', Folder) + sub_container = container.make_resource(f'users', Folder) + sub_container_2 = sub_container.make_resource(user.name, UserHistoryFolder) + sub_container_2.make_resource("device", Text) + self.server.database.save_changes() + query = AndQuery( + PhraseQuery("format", "user"), + PhraseQuery("abspath", str(user.abspath)) + ) + search = database.search(query) + self.assertEqual(len(search.get_documents()), 1) + + diff --git a/tools/server_api_example.py b/tools/server_api_example.py old mode 100644 new mode 100755 index e875e19b0..635adf89b --- a/tools/server_api_example.py +++ b/tools/server_api_example.py @@ -16,10 +16,12 @@ # Import from standard library from pprint import pprint +import sys # Import from ikaaro from ikaaro.server import Server, create_server - +from ikaaro.root import Root +import shutil path = 'www.hforge.org' email = 'test@example.com' @@ -28,7 +30,20 @@ modules = [] listen_port = 8081 -create_server(path, email, password, root, modules, listen_port) + +if sys.argv[-1] == 'create': + shutil.rmtree(path, ignore_errors=True) + shutil.rmtree('sessions', ignore_errors=True) + create_server( + target=path, + email=email, + password=password, + root=root, + modules=modules, + listen_port=listen_port, + backend="git" + ) + server = Server(path) server.start(detach=False, loop=False) print('Launch reindexation') @@ -38,5 +53,5 @@ else: print('Error in reindexation') retour = server.do_request('GET', '/;_ctrl') -pprint(retour) +print(retour) server.stop()