(window.webpackJsonp=window.webpackJsonp||[]).push([[569],{999:function(t,n,e){"use strict";e.r(n);var a=e(56),i=Object(a.a)({},(function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"安全数据库模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#安全数据库模式"}},[t._v("#")]),t._v(" 安全数据库模式")]),t._v(" "),e("p",[t._v("给出了 HSQLDB 数据库的 DDL 语句。你可以使用这些作为指导方针来定义你正在使用的数据库的模式。")]),t._v(" "),e("h2",{attrs:{id:"用户模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#用户模式"}},[t._v("#")]),t._v(" 用户模式")]),t._v(" "),e("p",[e("code",[t._v("UserDetailsService")]),t._v("("),e("code",[t._v("JdbcDaoImpl")]),t._v(")的标准 JDBC 实现要求表为用户加载密码、帐户状态(启用或禁用)和权限(角色)列表。你将需要调整此模式以匹配你正在使用的数据库方言。")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("create table users(\n\tusername varchar_ignorecase(50) not null primary key,\n\tpassword varchar_ignorecase(50) not null,\n\tenabled boolean not null\n);\n\ncreate table authorities (\n\tusername varchar_ignorecase(50) not null,\n\tauthority varchar_ignorecase(50) not null,\n\tconstraint fk_authorities_users foreign key(username) references users(username)\n);\ncreate unique index ix_auth_username on authorities (username,authority);\n")])])]),e("h3",{attrs:{id:"用于-oracle-数据库"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#用于-oracle-数据库"}},[t._v("#")]),t._v(" 用于 Oracle 数据库")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("CREATE TABLE USERS (\n USERNAME NVARCHAR2(128) PRIMARY KEY,\n PASSWORD NVARCHAR2(128) NOT NULL,\n ENABLED CHAR(1) CHECK (ENABLED IN ('Y','N') ) NOT NULL\n);\n\nCREATE TABLE AUTHORITIES (\n USERNAME NVARCHAR2(128) NOT NULL,\n AUTHORITY NVARCHAR2(128) NOT NULL\n);\nALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_UNIQUE UNIQUE (USERNAME, AUTHORITY);\nALTER TABLE AUTHORITIES ADD CONSTRAINT AUTHORITIES_FK1 FOREIGN KEY (USERNAME) REFERENCES USERS (USERNAME) ENABLE;\n")])])]),e("h3",{attrs:{id:"集团当局"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#集团当局"}},[t._v("#")]),t._v(" 集团当局")]),t._v(" "),e("p",[t._v("Spring Security2.0 在"),e("code",[t._v("JdbcDaoImpl")]),t._v("中引入了对组权限的支持。如果启用了组,则表结构如下所示。你将需要调整此模式以匹配你正在使用的数据库方言。")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("create table groups (\n\tid bigint generated by default as identity(start with 0) primary key,\n\tgroup_name varchar_ignorecase(50) not null\n);\n\ncreate table group_authorities (\n\tgroup_id bigint not null,\n\tauthority varchar(50) not null,\n\tconstraint fk_group_authorities_group foreign key(group_id) references groups(id)\n);\n\ncreate table group_members (\n\tid bigint generated by default as identity(start with 0) primary key,\n\tusername varchar(50) not null,\n\tgroup_id bigint not null,\n\tconstraint fk_group_members_group foreign key(group_id) references groups(id)\n);\n")])])]),e("p",[t._v("请记住,只有在使用所提供的 JDBC"),e("code",[t._v("UserDetailsService")]),t._v("实现时,这些表才是必需的。如果你自己编写或者选择在没有"),e("code",[t._v("UserDetailsService")]),t._v("的情况下实现"),e("code",[t._v("AuthenticationProvider")]),t._v(",那么你完全可以自由地决定如何存储数据,只要满足接口契约。")]),t._v(" "),e("h2",{attrs:{id:"模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#模式"}},[t._v("#")]),t._v(" 模式")]),t._v(" "),e("p",[t._v("此表用于存储由更安全的"),e("RouterLink",{attrs:{to:"/authentication/rememberme.html#remember-me-persistent-token"}},[t._v("持久令牌")]),t._v("remember-me 实现使用的数据。如果你直接或通过名称空间使用"),e("code",[t._v("JdbcTokenRepositoryImpl")]),t._v(",那么你将需要这个表。请记住调整此模式以匹配你正在使用的数据库方言。")],1),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("create table persistent_logins (\n\tusername varchar(64) not null,\n\tseries varchar(64) primary key,\n\ttoken varchar(64) not null,\n\tlast_used timestamp not null\n);\n")])])]),e("h2",{attrs:{id:"acl-模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#acl-模式"}},[t._v("#")]),t._v(" ACL 模式")]),t._v(" "),e("p",[t._v("Spring Security"),e("RouterLink",{attrs:{to:"/authorization/acls.html#domain-acls"}},[t._v("ACL")]),t._v("实现使用了四个表。")],1),t._v(" "),e("ol",[e("li",[e("p",[e("code",[t._v("acl_sid")]),t._v("存储 ACL 系统识别的安全标识。这些可以是唯一的主体或权威,可以适用于多个主体。")])]),t._v(" "),e("li",[e("p",[e("code",[t._v("acl_class")]),t._v("定义了 ACLS 应用的域对象类型。"),e("code",[t._v("class")]),t._v("列存储对象的 Java 类名。")])]),t._v(" "),e("li",[e("p",[e("code",[t._v("acl_object_identity")]),t._v("存储特定领域对象的对象标识定义。")])]),t._v(" "),e("li",[e("p",[e("code",[t._v("acl_entry")]),t._v("存储应用于特定对象标识和安全标识的 ACL 权限。")])])]),t._v(" "),e("p",[t._v("假定数据库将自动生成每个标识的主键。当"),e("code",[t._v("JdbcMutableAclService")]),t._v("在"),e("code",[t._v("acl_sid")]),t._v("或"),e("code",[t._v("acl_class")]),t._v("表中创建新行时,"),e("code",[t._v("JdbcMutableAclService")]),t._v("必须能够检索这些数据。它有两个属性,它们定义了检索这些值"),e("code",[t._v("classIdentityQuery")]),t._v("和"),e("code",[t._v("sidIdentityQuery")]),t._v("所需的 SQL。这两个都默认为"),e("code",[t._v("call identity()")])]),t._v(" "),e("p",[t._v("ACL 工件 JAR 包含用于在 HypersQL、PostgreSQL、MySQL/MariaDB、Microsoft SQL Server 和 Oracle 数据库中创建 ACL 模式的文件。这些模式还将在下面的小节中进行演示。")]),t._v(" "),e("h3",{attrs:{id:"hypersql"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hypersql"}},[t._v("#")]),t._v(" Hypersql")]),t._v(" "),e("p",[t._v("默认模式与框架内的单元测试中使用的嵌入式 HSQLDB 数据库一起工作。")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("create table acl_sid(\n\tid bigint generated by default as identity(start with 100) not null primary key,\n\tprincipal boolean not null,\n\tsid varchar_ignorecase(100) not null,\n\tconstraint unique_uk_1 unique(sid,principal)\n);\n\ncreate table acl_class(\n\tid bigint generated by default as identity(start with 100) not null primary key,\n\tclass varchar_ignorecase(100) not null,\n\tconstraint unique_uk_2 unique(class)\n);\n\ncreate table acl_object_identity(\n\tid bigint generated by default as identity(start with 100) not null primary key,\n\tobject_id_class bigint not null,\n\tobject_id_identity varchar_ignorecase(36) not null,\n\tparent_object bigint,\n\towner_sid bigint,\n\tentries_inheriting boolean not null,\n\tconstraint unique_uk_3 unique(object_id_class,object_id_identity),\n\tconstraint foreign_fk_1 foreign key(parent_object)references acl_object_identity(id),\n\tconstraint foreign_fk_2 foreign key(object_id_class)references acl_class(id),\n\tconstraint foreign_fk_3 foreign key(owner_sid)references acl_sid(id)\n);\n\ncreate table acl_entry(\n\tid bigint generated by default as identity(start with 100) not null primary key,\n\tacl_object_identity bigint not null,\n\tace_order int not null,\n\tsid bigint not null,\n\tmask integer not null,\n\tgranting boolean not null,\n\taudit_success boolean not null,\n\taudit_failure boolean not null,\n\tconstraint unique_uk_4 unique(acl_object_identity,ace_order),\n\tconstraint foreign_fk_4 foreign key(acl_object_identity) references acl_object_identity(id),\n\tconstraint foreign_fk_5 foreign key(sid) references acl_sid(id)\n);\n")])])]),e("h3",{attrs:{id:"postgresql"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[t._v("#")]),t._v(" PostgreSQL")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("create table acl_sid(\n\tid bigserial not null primary key,\n\tprincipal boolean not null,\n\tsid varchar(100) not null,\n\tconstraint unique_uk_1 unique(sid,principal)\n);\n\ncreate table acl_class(\n\tid bigserial not null primary key,\n\tclass varchar(100) not null,\n\tconstraint unique_uk_2 unique(class)\n);\n\ncreate table acl_object_identity(\n\tid bigserial primary key,\n\tobject_id_class bigint not null,\n\tobject_id_identity varchar(36) not null,\n\tparent_object bigint,\n\towner_sid bigint,\n\tentries_inheriting boolean not null,\n\tconstraint unique_uk_3 unique(object_id_class,object_id_identity),\n\tconstraint foreign_fk_1 foreign key(parent_object)references acl_object_identity(id),\n\tconstraint foreign_fk_2 foreign key(object_id_class)references acl_class(id),\n\tconstraint foreign_fk_3 foreign key(owner_sid)references acl_sid(id)\n);\n\ncreate table acl_entry(\n\tid bigserial primary key,\n\tacl_object_identity bigint not null,\n\tace_order int not null,\n\tsid bigint not null,\n\tmask integer not null,\n\tgranting boolean not null,\n\taudit_success boolean not null,\n\taudit_failure boolean not null,\n\tconstraint unique_uk_4 unique(acl_object_identity,ace_order),\n\tconstraint foreign_fk_4 foreign key(acl_object_identity) references acl_object_identity(id),\n\tconstraint foreign_fk_5 foreign key(sid) references acl_sid(id)\n);\n")])])]),e("p",[t._v("你必须将"),e("code",[t._v("classIdentityQuery")]),t._v("和"),e("code",[t._v("sidIdentityQuery")]),t._v("的属性分别设置为以下值:")]),t._v(" "),e("ul",[e("li",[e("p",[e("code",[t._v("select currval(pg_get_serial_sequence('acl_class', 'id'))")])])]),t._v(" "),e("li",[e("p",[e("code",[t._v("select currval(pg_get_serial_sequence('acl_sid', 'id'))")])])])]),t._v(" "),e("h3",{attrs:{id:"mysql-和-mariadb"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#mysql-和-mariadb"}},[t._v("#")]),t._v(" MySQL 和 MariaDB")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("CREATE TABLE acl_sid (\n\tid BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n\tprincipal BOOLEAN NOT NULL,\n\tsid VARCHAR(100) NOT NULL,\n\tUNIQUE KEY unique_acl_sid (sid, principal)\n) ENGINE=InnoDB;\n\nCREATE TABLE acl_class (\n\tid BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n\tclass VARCHAR(100) NOT NULL,\n\tUNIQUE KEY uk_acl_class (class)\n) ENGINE=InnoDB;\n\nCREATE TABLE acl_object_identity (\n\tid BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n\tobject_id_class BIGINT UNSIGNED NOT NULL,\n\tobject_id_identity VARCHAR(36) NOT NULL,\n\tparent_object BIGINT UNSIGNED,\n\towner_sid BIGINT UNSIGNED,\n\tentries_inheriting BOOLEAN NOT NULL,\n\tUNIQUE KEY uk_acl_object_identity (object_id_class, object_id_identity),\n\tCONSTRAINT fk_acl_object_identity_parent FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id),\n\tCONSTRAINT fk_acl_object_identity_class FOREIGN KEY (object_id_class) REFERENCES acl_class (id),\n\tCONSTRAINT fk_acl_object_identity_owner FOREIGN KEY (owner_sid) REFERENCES acl_sid (id)\n) ENGINE=InnoDB;\n\nCREATE TABLE acl_entry (\n\tid BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,\n\tacl_object_identity BIGINT UNSIGNED NOT NULL,\n\tace_order INTEGER NOT NULL,\n\tsid BIGINT UNSIGNED NOT NULL,\n\tmask INTEGER UNSIGNED NOT NULL,\n\tgranting BOOLEAN NOT NULL,\n\taudit_success BOOLEAN NOT NULL,\n\taudit_failure BOOLEAN NOT NULL,\n\tUNIQUE KEY unique_acl_entry (acl_object_identity, ace_order),\n\tCONSTRAINT fk_acl_entry_object FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity (id),\n\tCONSTRAINT fk_acl_entry_acl FOREIGN KEY (sid) REFERENCES acl_sid (id)\n) ENGINE=InnoDB;\n")])])]),e("h3",{attrs:{id:"microsoft-sql-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#microsoft-sql-server"}},[t._v("#")]),t._v(" Microsoft SQL Server")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("CREATE TABLE acl_sid (\n\tid BIGINT NOT NULL IDENTITY PRIMARY KEY,\n\tprincipal BIT NOT NULL,\n\tsid VARCHAR(100) NOT NULL,\n\tCONSTRAINT unique_acl_sid UNIQUE (sid, principal)\n);\n\nCREATE TABLE acl_class (\n\tid BIGINT NOT NULL IDENTITY PRIMARY KEY,\n\tclass VARCHAR(100) NOT NULL,\n\tCONSTRAINT uk_acl_class UNIQUE (class)\n);\n\nCREATE TABLE acl_object_identity (\n\tid BIGINT NOT NULL IDENTITY PRIMARY KEY,\n\tobject_id_class BIGINT NOT NULL,\n\tobject_id_identity VARCHAR(36) NOT NULL,\n\tparent_object BIGINT,\n\towner_sid BIGINT,\n\tentries_inheriting BIT NOT NULL,\n\tCONSTRAINT uk_acl_object_identity UNIQUE (object_id_class, object_id_identity),\n\tCONSTRAINT fk_acl_object_identity_parent FOREIGN KEY (parent_object) REFERENCES acl_object_identity (id),\n\tCONSTRAINT fk_acl_object_identity_class FOREIGN KEY (object_id_class) REFERENCES acl_class (id),\n\tCONSTRAINT fk_acl_object_identity_owner FOREIGN KEY (owner_sid) REFERENCES acl_sid (id)\n);\n\nCREATE TABLE acl_entry (\n\tid BIGINT NOT NULL IDENTITY PRIMARY KEY,\n\tacl_object_identity BIGINT NOT NULL,\n\tace_order INTEGER NOT NULL,\n\tsid BIGINT NOT NULL,\n\tmask INTEGER NOT NULL,\n\tgranting BIT NOT NULL,\n\taudit_success BIT NOT NULL,\n\taudit_failure BIT NOT NULL,\n\tCONSTRAINT unique_acl_entry UNIQUE (acl_object_identity, ace_order),\n\tCONSTRAINT fk_acl_entry_object FOREIGN KEY (acl_object_identity) REFERENCES acl_object_identity (id),\n\tCONSTRAINT fk_acl_entry_acl FOREIGN KEY (sid) REFERENCES acl_sid (id)\n);\n")])])]),e("h3",{attrs:{id:"oracle-数据库"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#oracle-数据库"}},[t._v("#")]),t._v(" Oracle 数据库")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("CREATE TABLE ACL_SID (\n ID NUMBER(18) PRIMARY KEY,\n PRINCIPAL NUMBER(1) NOT NULL CHECK (PRINCIPAL IN (0, 1 )),\n SID NVARCHAR2(128) NOT NULL,\n CONSTRAINT ACL_SID_UNIQUE UNIQUE (SID, PRINCIPAL)\n);\nCREATE SEQUENCE ACL_SID_SQ START WITH 1 INCREMENT BY 1 NOMAXVALUE;\nCREATE OR REPLACE TRIGGER ACL_SID_SQ_TR BEFORE INSERT ON ACL_SID FOR EACH ROW\nBEGIN\n SELECT ACL_SID_SQ.NEXTVAL INTO :NEW.ID FROM DUAL;\nEND;\n\nCREATE TABLE ACL_CLASS (\n ID NUMBER(18) PRIMARY KEY,\n CLASS NVARCHAR2(128) NOT NULL,\n CONSTRAINT ACL_CLASS_UNIQUE UNIQUE (CLASS)\n);\nCREATE SEQUENCE ACL_CLASS_SQ START WITH 1 INCREMENT BY 1 NOMAXVALUE;\nCREATE OR REPLACE TRIGGER ACL_CLASS_ID_TR BEFORE INSERT ON ACL_CLASS FOR EACH ROW\nBEGIN\n SELECT ACL_CLASS_SQ.NEXTVAL INTO :NEW.ID FROM DUAL;\nEND;\n\nCREATE TABLE ACL_OBJECT_IDENTITY(\n ID NUMBER(18) PRIMARY KEY,\n OBJECT_ID_CLASS NUMBER(18) NOT NULL,\n OBJECT_ID_IDENTITY NVARCHAR2(64) NOT NULL,\n PARENT_OBJECT NUMBER(18),\n OWNER_SID NUMBER(18),\n ENTRIES_INHERITING NUMBER(1) NOT NULL CHECK (ENTRIES_INHERITING IN (0, 1)),\n CONSTRAINT ACL_OBJECT_IDENTITY_UNIQUE UNIQUE (OBJECT_ID_CLASS, OBJECT_ID_IDENTITY),\n CONSTRAINT ACL_OBJECT_IDENTITY_PARENT_FK FOREIGN KEY (PARENT_OBJECT) REFERENCES ACL_OBJECT_IDENTITY(ID),\n CONSTRAINT ACL_OBJECT_IDENTITY_CLASS_FK FOREIGN KEY (OBJECT_ID_CLASS) REFERENCES ACL_CLASS(ID),\n CONSTRAINT ACL_OBJECT_IDENTITY_OWNER_FK FOREIGN KEY (OWNER_SID) REFERENCES ACL_SID(ID)\n);\nCREATE SEQUENCE ACL_OBJECT_IDENTITY_SQ START WITH 1 INCREMENT BY 1 NOMAXVALUE;\nCREATE OR REPLACE TRIGGER ACL_OBJECT_IDENTITY_ID_TR BEFORE INSERT ON ACL_OBJECT_IDENTITY FOR EACH ROW\nBEGIN\n SELECT ACL_OBJECT_IDENTITY_SQ.NEXTVAL INTO :NEW.ID FROM DUAL;\nEND;\n\nCREATE TABLE ACL_ENTRY (\n ID NUMBER(18) NOT NULL PRIMARY KEY,\n ACL_OBJECT_IDENTITY NUMBER(18) NOT NULL,\n ACE_ORDER INTEGER NOT NULL,\n SID NUMBER(18) NOT NULL,\n MASK INTEGER NOT NULL,\n GRANTING NUMBER(1) NOT NULL CHECK (GRANTING IN (0, 1)),\n AUDIT_SUCCESS NUMBER(1) NOT NULL CHECK (AUDIT_SUCCESS IN (0, 1)),\n AUDIT_FAILURE NUMBER(1) NOT NULL CHECK (AUDIT_FAILURE IN (0, 1)),\n CONSTRAINT ACL_ENTRY_UNIQUE UNIQUE (ACL_OBJECT_IDENTITY, ACE_ORDER),\n CONSTRAINT ACL_ENTRY_OBJECT_FK FOREIGN KEY (ACL_OBJECT_IDENTITY) REFERENCES ACL_OBJECT_IDENTITY (ID),\n CONSTRAINT ACL_ENTRY_ACL_FK FOREIGN KEY (SID) REFERENCES ACL_SID(ID)\n);\nCREATE SEQUENCE ACL_ENTRY_SQ START WITH 1 INCREMENT BY 1 NOMAXVALUE;\nCREATE OR REPLACE TRIGGER ACL_ENTRY_ID_TRIGGER BEFORE INSERT ON ACL_ENTRY FOR EACH ROW\nBEGIN\n SELECT ACL_ENTRY_SQ.NEXTVAL INTO :NEW.ID FROM DUAL;\nEND;\n")])])]),e("h2",{attrs:{id:"oauth2-0-客户端模式"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#oauth2-0-客户端模式"}},[t._v("#")]),t._v(" OAuth2.0 客户端模式")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/oauth2/client/core.html#oauth2Client-authorized-repo-service"}},[t._v("OAuth2 授权客户服务")]),t._v("("),e("code",[t._v("JdbcOAuth2AuthorizedClientService")]),t._v(")的 JDBC 实现需要一个表来持久化"),e("code",[t._v("OAuth2AuthorizedClient")]),t._v("(s)。你将需要调整此模式以匹配你正在使用的数据库方言。")],1),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("CREATE TABLE oauth2_authorized_client (\n client_registration_id varchar(100) NOT NULL,\n principal_name varchar(200) NOT NULL,\n access_token_type varchar(100) NOT NULL,\n access_token_value blob NOT NULL,\n access_token_issued_at timestamp NOT NULL,\n access_token_expires_at timestamp NOT NULL,\n access_token_scopes varchar(1000) DEFAULT NULL,\n refresh_token_value blob DEFAULT NULL,\n refresh_token_issued_at timestamp DEFAULT NULL,\n created_at timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL,\n PRIMARY KEY (client_registration_id, principal_name)\n);\n")])])]),e("p",[e("RouterLink",{attrs:{to:"/spring-security/index.html"}},[t._v("Appendix")]),e("RouterLink",{attrs:{to:"/spring-security/namespace/index.html"}},[t._v("XML 命名空间")])],1)])}),[],!1,null,null,null);n.default=i.exports}}]);