123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736 |
- <template src="./viewMask.html">
- </template>
- <script>
- const util = require('@/utils/util.js').default;
- // const config = require('@/services/url$config.js');
- import touchHandle from '@/mixins/touchHandle.js';
- // import requestConfig from '@/static/lib/requestConfig';
- // const app = getApp(); //获取应用实例
- export default {
- mixins: [touchHandle],
- data: function() {
- return {
- currentIndex:0, //当前看到的图片序号
- showAIImage: false,//是否显示当前AI结果集合 默认不显示,因为没有
- aiImagesList:[
- ],//AI生成的图片列表
-
- styleList: [], //风格列表数据
- curStyleIndex: 0, //当前选中的风格序号
- aiFlag:false,
- aiImage: "",
- inputBase64Url: "",
- taskId: "", // 图生图任务ID
- img2imgTimer: null,
- imageWidth: 750,
- imageHeight: 448,
- showAIFlag:false,//继续生成状态切换标志
- checked:false,
- shottingImg:'',
- count:0,
- random:1,
- disableAble:false,
- spaceTypes: [{
- icon: "",
- title: "卧室",
- subtitle: "0个布局",
- englishRemark: "bedroom",
- },
- {
- icon: "",
- title: "客厅",
- subtitle: "0个布局",
- englishRemark: "living room",
- },
- {
- icon: "",
- title: "餐厅",
- subtitle: "0个布局",
- englishRemark: "dinning room",
- },
- {
- icon: "",
- title: "厨房",
- subtitle: "0个个布局",
- englishRemark: "kitchen",
- },
- {
- icon: "",
- title: "玄关",
- subtitle: "0个布局",
- englishRemark: "hallway",
- },
- {
- icon: "",
- title: "卫生间",
- subtitle: "0个布局",
- englishRemark: "bathroom",
- },
- {
- icon: "",
- title: "衣帽间",
- subtitle: "0个布局",
- englishRemark: "walkin closet",
- },
- {
- icon: "",
- title: "收纳",
- subtitle: "0个布局",
- englishRemark: "storage room",
- },
- {
- icon: "",
- title: "阳台",
- subtitle: "0个布局",
- englishRemark: "balcony",
- },
- {
- icon: "",
- title: "飘窗",
- subtitle: "0个布局",
- englishRemark: "bay window",
- },
- {
- icon: "",
- title: "链接空间",
- subtitle: "0个布局",
- englishRemark: "connecting space between two rooms",
- },
- {
- icon: "",
- title: "自定义",
- subtitle: "0个布局",
- englishRemark: "room",
- },
- ],
- myloading:false,
- loadingMsg:'',
- screenWidth:0,
- screenHeight:0,
- }
- },
- props:{
- spaceObj: {
- type: Object,
- default: null,
- },
- },
- watch: {
- spaceObj(newVal, oldVal) {
- if (newVal == null) {
- return;
- }
- console.log("当前空间数据view-mark-watch:", newVal);
- this.getAiBeautyFamily();
- // this.curSpaceArea = parseFloat(
- // (newVal.spaceWidth * newVal.spaceHeight) / 10000
- // ).toFixed(2);
- // this.getOverallArrangementDetailsList();
- },
- },
- mounted() {//组件挂载时事件
- // console.warn("***mounted-nav***",this.seedItem)
- // if(this.seedItem){
- // this.title = this.seedItem.seedText;
- // }
- this.screenWidth = window.screen.width;
- this.screenHeight = window.screen.height;
- if(window.innerWidth && window.screen.width){
- screenWidth = Math.min(window.innerWidth,window.screen.width)
- }
- if(window.innerHeight && window.screen.height){
- screenHeight = Math.min(window.innerHeight,window.screen.height)
- }
- },
- // 页面被展示时执行
- onPageShow: function() {
-
- },
- //页面被隐藏时执行
- onPageHide: function() {
- },
- beforeDestroy:function(){
- console.warn("***beforeDestroy***");//更新到页面上的数据
- this.clearInterval();
- },
- computed: {
- aiData() {
- return this.$store.state.aiData;
- },
- curHouseObj() {
- return this.$store.state.curHouseObj;
- },
- },
- methods:{
- swiperChangeImg(e){
- this.currentIndex = e.detail?e.detail.current:e;
- this.checked = this.aiImagesList[this.currentIndex].checked;
- console.warn("***swiperChangeImg***",this.checked);//更新到页面上的数据
- },
- //视角切换
- switchActor(){
- // this.$parent.clearHandle()
- this.$emit('switchActor');
- this.showAIImage = false;//隐藏AI结果集合-执行切换视角
- let index = this.$parent.currentActor.userIndex;//当前视角的序号
- let nextIndex = (index + 1) % this.$parent.actors.length;
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080417', //点击ID
- clkName: 'changeangle_clk', //点击前往的页面名称
- clkParams: {
- locusName: "视角切换",
- type:this.$parent.actors[nextIndex].actorEum
- }
- };
- util.trackRequest(param);
- },
- showOrHideWebGl(){
- // this.$parent.clearHandle()
- this.showAIImage = !this.showAIImage;
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080415', //点击ID
- clkName: 'contrast_clk', //点击前往的页面名称
- clkParams: {
- locusName: "对比",
- }
- };
- util.trackRequest(param);
- // setTimeout(()=> {
- // if(this.showAIImage==true){
- // this.$parent.clearHandle()
- // }else{
- // this.$parent.attendEvent()
- // }
- // }, 100);
- },
- //保存到相册
- save() {
- //表示canvas正在绘制,不能进行保存
- if (!this.aiImagesList || this.aiImagesList.length==0) {
- return false;
- }
- var _resultImg = this.aiImagesList[this.currentIndex].image;
- //正在选择照片,不能生效
- if (!_resultImg || _resultImg.length==0) {
- this.showToast("请选中图片后再试!");
- return false;
- }
- var para = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_56', //点击ID,固定
- clkName: "share-savepic", //点击名称
- expand: {
- "resultImg": (_resultImg || ""),
- },
- }
- util.trackRequest(para);
- if(navigator.userAgent.toLocaleLowerCase().includes('micromessenger')){
- this.$message("请长按图片保存!");
- }else{
- this.saveImageHandle(_resultImg);
- }
- },
- downloadIamge(imgsrc) { //下载图片地址和图片名
- var fileName = "4DImage" + util.formatDate(new Date(), "yyyyMMddhhmmss") + '.jpg';
- const image = new Image();
- // 解决跨域 Canvas 污染问题
- image.setAttribute("crossOrigin", "anonymous");
- image.onload = ()=> {
- // let canvas = document.createElement("canvas");
- // canvas.width = image.width;
- // canvas.height = image.height;
- // const context = canvas.getContext("2d");
- // context.drawImage(image, 0, 0, image.width, image.height);
- // const url = canvas.toDataURL("image/jpg"); //得到图片的base64编码数据
- const a = document.createElement("a"); // 生成一个a元素
- const event = new MouseEvent("click"); // 创建一个单击事件
- a.download = fileName || "photo"; // 设置图片名称
- a.href = imgsrc; // 将生成的URL设置为a.href属性
- a.dispatchEvent(event); // 触发a的单击事件
- this.showToast("保存成功!");
- };
- image.src = imgsrc;
- },
- saveImageHandle(_resultImg){
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080414', //点击ID
- clkName: 'download_clk', //点击前往的页面名称
- clkParams: {
- locusName: "下载",
- img:_resultImg
- }
- };
- util.trackRequest(param);
- this.downloadIamge(_resultImg);
- },
-
- //选项变更
- changeAIImg() {
- // let lastPage = getCurrentPages()[getCurrentPages().length - 2] ? getCurrentPages()[getCurrentPages().length - 2].$vm : null;
- this.checked = !this.checked;//变更选项
- this.aiImagesList[this.currentIndex].checked = this.checked;
- console.warn("***changeAIImg***",this.checked,this.aiData)
- if(this.aiData){//给上一个页面回传生成的数据
- let space = this.aiData.find(it=>{
- return it.spaceId == this.spaceObj.spaceId
- })
- if(space){
- space.aiImagesList[this.currentIndex].checked = this.checked;
- }
- }
- if(this.checked){
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080418', //点击ID
- clkName: 'chooseprogramme_clk', //点击前往的页面名称
- clkParams: {
- locusName: "选定风格/视角",
- style:this.styleList[this.curStyleIndex].styleName,
- img:this.aiImagesList[this.currentIndex].image,
- }
- };
- util.trackRequest(param);
- }
- },
- rightScroll(){//右滑
- if(this.currentIndex <= (this.aiImagesList.length - 1) && this.currentIndex > 0){
- // this.currentIndex --;
- this.$refs.carousel.prev();
- }
- },
- leftScroll(){//继续生成
- if(this.currentIndex != this.aiImagesList.length - 1){
- if(this.currentIndex<this.aiImagesList.length - 1){
- // this.currentIndex ++;
- this.$refs.carousel.next();
- }
- return false;
- }
- console.log("***leftScroll***",this.currentIndex,this.aiImagesList.length)
- this.aiSubmit(2);//继续生成下一张
- },
- //返回上一页
- goback(){
- this.$router.go(-1);
- },
- mynavigateFuc(e) {
- if (e) {
- // this.$parent.clearHandle();
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080408', //点击ID
- clkName: 'WeCom_clk', //点击前往的页面名称
- clkParams: {
- locusName: "联系定制",
- }
- };
- util.trackRequest(param);
- if(window.__wxjs_environment === 'miniprogram'){
- wx.miniProgram.navigateTo({url: '/pages/transfer/transfer?event=openCustomerServiceChat&houseId='+this.$store.state.houseId})
- }else{
- this.$message.warning("敬请期待");
- }
- // setTimeout(()=> {
- // if(this.showAIImage==true){
- // this.$parent.clearHandle()
- // }else{
- // this.$parent.attendEvent()
- // }
- // }, 100);
- }
- },
- catchTapEvent:function(){
- return false;
- },
- //获取AI风格列表
- async getAiBeautyFamily() {
- // const spaceName = this.spaceTypes[this.spaceObj.spaceType - 1].title;
- let res = await requestConfig("getHardboundEffects", {
- "houseId": this.$route.query.houseId,
- "spaceType": this.spaceObj.spaceType,
- "spaceName": this.spaceObj.spaceName,
- });
- this.styleList = [];
- if (res.success) {
- let list = res.list;
- this.styleList = list;
- }
- if(!this.styleList || this.styleList.length==0){
- this.disableAble = true;//不能点击-没有风格
- let unit = this.screenWidth / 750;//单位rpm 对应 px 的值
- this.$parent.canvasHeight = this.screenHeight - (208 * unit);
- this.$parent.camera.aspect = this.screenWidth / this.$parent.canvasHeight;
- this.$parent.camera.updateProjectionMatrix();
- this.$parent.renderer.setSize(this.screenWidth, this.$parent.canvasHeight);
- }else{
- this.disableAble = false;//可以点击
- }
- },
- clearInterval() {
- if (this.img2imgTimer) {
- clearInterval(this.img2imgTimer);
- this.img2imgTimer = null;
- }
- this.random = 1;
- this.myloading = false;
- },
- //风格选择
- selectStyle(idx){
- if(this.curStyleIndex == idx){
- return false
- }
- this.curStyleIndex = idx;
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080416', //点击ID
- clkName: 'AIstyle_ret_clk', //点击前往的页面名称
- clkParams: {
- locusName: "AI 风格",
- type:this.styleList[this.curStyleIndex].styleName
- }
- };
- util.trackRequest(param);
- },
- // AI渲染
- async aiSubmit(type) {
- if(!this.styleList || this.styleList.length==0 || this.curStyleIndex==-1
- || !this.styleList[this.curStyleIndex].prompt || !this.styleList[this.curStyleIndex].negativePrompt){
- return false;
- }
- // 防止连续点击处理
- if (this.aiFlag) {
- return
- }
- this.aiFlag = true;
- if (this.aiImage == "" || !this.aiImage) {
- this.aiImage = ""; // https://dm.static.elab-plus.com/CE4/backImg.png
- }
- this.aiImage = "";
-
- this.clearInterval();
- if(!this.showAIImage){
- this.myloading = true;
- this.loadingMsg = "设计中...";
- // this.$store.state.loading = true;
- // this.$store.state.loadingMsg="设计中...";
- }
-
- // this.inputBase64Url = await this.shottingAction(2);//开始截图-返回的是base64的数据
- // this.startServer();
- // let base64 = await this.$parent.shottingAction(2);//开始截图-返回的是base64
- let shottingImg = await this.$parent.shottingAction();//开始截图-返回的是图片地址
- if(!shottingImg){
- this.showToast("渲染失败,请重试");
- return false;
- }
- // ?x-oss-process=image/auto-orient,1/quality,Q_46/format,jpg //阿里OSS
- // "?imageMogr2/auto-orient/format/webp/blur/1x0/quality/75";//七牛云压缩图片
- shottingImg += "?x-oss-process=image/auto-orient,1/quality,Q_46/format,jpg";//压缩图片
- this.shottingImg = shottingImg;
- this.changeImg2Base64(this.shottingImg, false);
- console.warn("***shottingImg***",this.shottingImg)
- if(type==1){
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080413', //点击ID
- clkName: 'AIcreate_clk', //点击前往的页面名称
- clkParams: {
- locusName: "AI生成",
- userparamter:{
- shottingImg:this.shottingImg,
- style:this.styleList[this.curStyleIndex].styleName
- }
- }
- };
- util.trackRequest(param);
- }else{
- let param = {
- type: 'CLK', //埋点类型
- clkId: 'clk_2cmina_23080419', //点击ID
- clkName: 'continueAIcreate_clk', //点击前往的页面名称
- clkParams: {
- locusName: "继续生成",
- userparamter:{
- shottingImg:this.shottingImg,
- style:this.styleList[this.curStyleIndex].styleName
- }
- }
- };
- util.trackRequest(param);
- }
- },
- image2Base64(imgUrl) {//导入的图片路径
- var toBase64= new Promise(function(resolve, reject){
- window.URL = window.URL || window.webkitURL;
- var xhr = new XMLHttpRequest();
- xhr.open("get", imgUrl, true);
- // 至关重要
- xhr.responseType = "blob";//文件流
- xhr.onload = function (res) {
- if (res.currentTarget.status == 200) {
- //得到一个blob对象
- var blob = res.currentTarget.response;
- // 至关重要
- let oFileReader = new FileReader();
- oFileReader.onloadend = function (e) {
- let base64 = e.target.result;//base64
- resolve(base64)
- };
- oFileReader.readAsDataURL(blob);
- }
- }
- xhr.send();
- });
- return toBase64;
- },
- changeImg2Base64(url, isRepeat) {
- var self = this;
- if(isRepeat && self.inputBase64Url){//重复使用
- self.startServer();
- }else{
- // self.inputBase64Url = Base64Url;
- // console.log("生成inputBase64Url");
- this.image2Base64(url).then(base64 => {
- self.inputBase64Url = base64;
- self.startServer();
- })
- // uni.request({
- // url: url,
- // method: "GET",
- // responseType: "arraybuffer",
- // success: async (res) => {
- // let base64 = wx.arrayBufferToBase64(res.data);
- // let Base64Url = "data:image/jpeg;base64," + base64;
- // // console.log('base64:', Base64Url);
- // self.inputBase64Url = Base64Url;
- // console.log("生成inputBase64Url");
- // self.startServer();
- // },
- // });
- }
- },
- //开始图生图流程
- async startServer() {
- if(!this.styleList || this.curStyleIndex < 0 || !this.styleList[this.curStyleIndex].imgUrl){
- return false
- }
- let imgUrl = this.styleList[this.curStyleIndex].imgUrl;
- // let base64Url = await this.image2Base64(imgUrl);
- let data = {
- "configType": "AI_Biography",
- "keyvalue": "ControlNet_IpAdapter",
- "model": "ip-adapter_xl [4209e9f7]",
- "cpu": "ip-adapter_clip_sdxl",
- "session_hash": Date.now(),
- "weight": 1.5,
- "number1": -1,
- "number2": -1,
- "number3": 0,
- "number4": 1,
- // "imageBase64": base64Url,
- "imageUrl":imgUrl,
- }
- let res1 = await requestConfig("AIuploadImgControlNet", data);
- if(!res1 || !res1.single){
- this.showToast("渲染失败,请重试");
- this.aiFlag = false;
- this.aiImage = "";
- return false;
- }
- let session_hash = data.session_hash;
- data.model = "sai_xl_canny_256lora [566f20af]";
- data.keyvalue = "ControlNet_Canny";
- data.cpu = "canny";
- data.weight = 0.8;
- data.number1 = 100;
- data.number2 = 200;
- data.number3 = 0;
- data.number4 = 1;
- data.imageBase64 = this.inputBase64Url;
-
- let res2 = await requestConfig("AIuploadImgControlNet", data);
- if(!res2 || !res2.success){
- this.showToast("渲染失败,请重试");
- this.aiFlag = false;
- this.aiImage = "";
- return false;
- }
- data.model = "t2iadapter_seg_sd14v1 [6387afb5]";
- data.keyvalue = "ControlNet_Seg";
- data.cpu = "seg_ofade20k";
- data.weight = 0.8;
- data.number1 = -1;
- data.number2 = -1;
- data.number3 = 0;
- data.number4 = 1;
- data.imageBase64 = this.inputBase64Url;
- let res3 = await requestConfig("AIuploadImgControlNet", data);
- if(!res3 || !res3.success){
- this.showToast("渲染失败,请重试");
- this.aiFlag = false;
- this.aiImage = "";
- return false;
- }
- const prompt = this.styleList[this.curStyleIndex].prompt;
- const noPromot = this.styleList[this.curStyleIndex].negativePrompt;
- let unit = 768 / this.screenWidth;
- this.imageWidth = parseInt((this.screenWidth * unit).toFixed());
- this.imageHeight = parseInt((this.$parent.canvasHeight * unit).toFixed());
- var parmas = {
- negativePrompt: noPromot,
- prompt: prompt,
- "batchSize": 1,
- brandId: $config.brandId,
- height: this.imageHeight,
- width: this.imageWidth,
- "moduleType": "AI_Biography",
- "keyword":"img_2_img",
- "steps":20,
- "sampler":"DDIM",
- "controlNetSessionHash":session_hash,
- "cfgScale":12,
- "denoising":0.9
- };
- let res = await requestConfig("generateTaskImgToImgForAliyun", parmas);
- console.log("图生图结果:", res);
- if(this.$parent.pvCurPageName!="room_show"){//说明用户切换页面了
- console.warn("***用户已经退出页面***")
- return false;
- }
- let that = this;
- if (res.success && res.single) {
- if(typeof(res.single)=="object"){
- // if(true){
- let cot = res.single.queueCount || 1;
- this.showToast("正有"+cot+"人排队,预计等待"+cot*25+"秒",10000);
- this.aiImage = "";
- this.aiFlag = false;
- this.clearInterval();
- return false;
- }
- this.taskId = res.single;
- if (!this.img2imgTimer) {
- this.count = 0;
- this.random = 1;
- this.img2imgTimer = setInterval(() => {
- this.count ++;
- this.getResultForImgToImg();
- }, 1000);
- }
- }else{
- this.aiFlag = false;
- this.aiImage = "";
- this.showToast("渲染失败,请重试")
- }
- },
- // 轮询获取图片结果
- async getResultForImgToImg() {
- var parmas = {
- id: this.taskId,
- };
- let res = await requestConfig("generateProcess", parmas);
- // let lastPage = getCurrentPages()[getCurrentPages().length - 2] ? getCurrentPages()[getCurrentPages().length - 2].$vm : null;
- // console.warn("图生图轮询结果:", res);
- if (res.success && res.single) {
- if (res.single.inQueue == false) {
- if (res.single.urls) {
- // uni.hideLoading();
- this.aiFlag = false;
- this.random = 100;
- console.warn("图生图轮询结束: ", res);
- this.aiImage = res.single.urls[0];
- this.showAIFlag = true;
- let newImage = this.aiImage;
- let aiStyleName = this.styleList[this.curStyleIndex].styleName;
- let _data = {
- image:newImage,
- checked:false,
- list:[newImage],
- }
- this.aiImagesList.push(_data);
- this.showAIImage = true;//显示AI结果集合-因为生成了AI图片
- if(this.$parent && typeof(this.$parent.clearHandle)=="function" ){
- this.$parent.clearHandle();
- }
- let cpAiData = JSON.parse(JSON.stringify(this.aiData)) || []
- if(cpAiData){//给上一个页面回传生成的数据
- let space = cpAiData.find(it=>{
- return it.houseFloor == this.curHouseObj.houseFloor && it.spaceId == this.spaceObj.spaceId
- })
- if(space){
- let data ={
- aiStyleName:aiStyleName,
- image:newImage,
- checked:false,
- }
- space.aiImagesList.push(data);
- }else{//不存在则构建数据
- let data = {
- houseFloor:this.curHouseObj.houseFloor,//当前的楼层
- spaceId:this.spaceObj.spaceId,
- aiImagesList:[
- {
- aiStyleName:aiStyleName,
- image:newImage,
- checked:false,
- }
- ]
- }
- cpAiData.push(data)
- }
- this.$store.dispatch('setAiData', cpAiData)
- }
- this.clearInterval();
- if(this.aiImagesList.length>1){
- setTimeout(()=>{
- // this.$refs.carousel.next();
- this.$refs.carousel.setActiveItem(this.aiImagesList.length-1);//切换到最后一张
- }, 1000);
- }
- } else {
- if (!res.success) {
- this.showToast("渲染失败,请重试")
- this.aiFlag = false;
- this.aiImage = "";
- this.clearInterval();
- }else {
- this.random = parseInt(this.count * 2);
- if(this.random>=100){
- this.random = 99;
- }
- if(!this.showAIImage){
- // this.$store.state.loadingMsg='生成中…' + this.random + '%';
- this.loadingMsg = '生成中…' + this.random + '%';
- }else{
- }
- }
- }
- } else {
- let cot = res.single.queueCount || 1;
- this.showToast("正有"+cot+"人排队,预计等待"+cot*25+"秒",10000);
- this.aiImage = "";
- this.aiFlag = false;
- this.clearInterval();
- }
- }
- },
- showToast(title,time=3000){
- this.$store.state.loading = true;
- this.$store.state.loadingMsg = title || "";
- setTimeout(()=>{
- this.$store.state.loading = false;
- }, time);
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- @import "./viewMask.scss";
- </style>
- <style lang="css" scoped>
- /* @import "@/common/css/common.css"; */
- </style>
|