home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2012 January / ME_2012_01.iso / Galileo-Video / system / ChromeLinux.swf / scripts / com / generationk / zinc / ChromeLINUX.as < prev    next >
Encoding:
Text File  |  2010-11-16  |  21.9 KB  |  674 lines

  1. package com.generationk.zinc
  2. {
  3.    import controller.VersionController;
  4.    import flash.display.Loader;
  5.    import flash.display.Sprite;
  6.    import flash.display.StageAlign;
  7.    import flash.display.StageScaleMode;
  8.    import flash.events.Event;
  9.    import flash.events.MouseEvent;
  10.    import flash.events.NetStatusEvent;
  11.    import flash.events.TimerEvent;
  12.    import flash.media.SoundTransform;
  13.    import flash.media.Video;
  14.    import flash.net.NetConnection;
  15.    import flash.net.NetStream;
  16.    import flash.net.URLLoader;
  17.    import flash.net.URLRequest;
  18.    import flash.text.AntiAliasType;
  19.    import flash.text.TextField;
  20.    import flash.text.TextFieldAutoSize;
  21.    import flash.text.TextFieldType;
  22.    import flash.text.TextFormat;
  23.    import flash.utils.Timer;
  24.    import mdm.*;
  25.    
  26.    public class ChromeLINUX extends Sprite
  27.    {
  28.       private static var MINI:String = "mini";
  29.       
  30.       private static var STANDARD:String = "standard";
  31.       
  32.       private static var FULLSCREEN:String = "fullscreen";
  33.       
  34.       private var videobg:BackGroundAsset;
  35.       
  36.       private var closeWindow:Window;
  37.       
  38.       private var xmlLoader:URLLoader;
  39.       
  40.       private var closewindowlabel:String;
  41.       
  42.       private var iscontent:Boolean = false;
  43.       
  44.       private var vwidth:Number;
  45.       
  46.       private var oldX:Number;
  47.       
  48.       private var oldY:Number;
  49.       
  50.       private var closewindowtext:String;
  51.       
  52.       private var videosp:Sprite;
  53.       
  54.       private var volume:Number;
  55.       
  56.       private var vheight:Number;
  57.       
  58.       private var maximized:Boolean = false;
  59.       
  60.       private var isoutro:Boolean = false;
  61.       
  62.       private var buttomBar:Sprite;
  63.       
  64.       private var border:Sprite;
  65.       
  66.       private var oldHeight:Number;
  67.       
  68.       private var Application:InternalApplication;
  69.       
  70.       private var bg:BackGroundAsset;
  71.       
  72.       private var loadingscreenversion:String;
  73.       
  74.       private var System:InternalSystem;
  75.       
  76.       private var loadingscreenlabel:String;
  77.       
  78.       private var sp:Sprite;
  79.       
  80.       private var xmlData:XML;
  81.       
  82.       private var miniHeight:Number;
  83.       
  84.       private var introOver:Boolean = false;
  85.       
  86.       private var content:Sprite;
  87.       
  88.       private var video:Video;
  89.       
  90.       private var topBar:Sprite;
  91.       
  92.       private var completeTimer:Timer;
  93.       
  94.       private var duration:Number;
  95.       
  96.       private var progresser:Sprite;
  97.       
  98.       public var lin:Boolean = true;
  99.       
  100.       private var mode:String = "standard";
  101.       
  102.       private var progressBar:Sprite;
  103.       
  104.       private var logo:LogoAsset;
  105.       
  106.       private var holder:Sprite;
  107.       
  108.       private var _metaData:Object;
  109.       
  110.       private var miniWidth:Number;
  111.       
  112.       private var nc:NetConnection;
  113.       
  114.       private var ns:NetStream;
  115.       
  116.       private var closewindowcancellabel:String;
  117.       
  118.       private var progressInit:Boolean = false;
  119.       
  120.       private var oldWidth:Number;
  121.       
  122.       private var miniX:Number;
  123.       
  124.       private var closewindowcloselabel:String;
  125.       
  126.       private var miniY:Number;
  127.       
  128.       private var isMoveTimer:Boolean;
  129.       
  130.       private var Froms:InternalForms;
  131.       
  132.       private var resizeTimer:Timer;
  133.       
  134.       private var moveTimer:Timer;
  135.       
  136.       private var label:TextField;
  137.       
  138.       private var versionLabel:TextField;
  139.       
  140.       private var resizeLayer:Sprite;
  141.       
  142.       public function ChromeLINUX()
  143.       {
  144.          super();
  145.          Application = new InternalApplication();
  146.          System = new InternalSystem();
  147.          Forms = InternalForms.getInstance(stage);
  148.          Application.init(this,initZinc);
  149.          addEventListener(Event.ADDED_TO_STAGE,init1);
  150.          VersionController.getInstance("linux");
  151.       }
  152.       
  153.       private function initApp() : void
  154.       {
  155.          completeTimer = new Timer(10);
  156.          completeTimer.addEventListener(TimerEvent.TIMER,onCompleteCheck);
  157.          stage.align = StageAlign.TOP_LEFT;
  158.          stage.scaleMode = StageScaleMode.NO_SCALE;
  159.          checkMaxScreen();
  160.          holder = new Sprite();
  161.          addChild(holder);
  162.          sp = new Sprite();
  163.          sp.y = 20;
  164.          bg = new BackGroundAsset();
  165.          sp.addChild(bg);
  166.          videosp = new Sprite();
  167.          holder.addChild(sp);
  168.          holder.addChild(videosp);
  169.          videobg = new BackGroundAsset();
  170.          videobg.x = 0;
  171.          videobg.y = 20;
  172.          videobg.height = stage.stageHeight - 30;
  173.          videobg.width = stage.stageWidth;
  174.          addChild(videobg);
  175.          video = new Video();
  176.          video.smoothing = true;
  177.          video.y = 20;
  178.          addChild(video);
  179.          createProgressBar();
  180.          createProgressBarLabels();
  181.          Application.addEventListener(Event.RESIZE,resize);
  182.          loadContent();
  183.       }
  184.       
  185.       private function createProgressBar() : void
  186.       {
  187.          logo = new LogoAsset();
  188.          logo.width = stage.stageWidth - 300;
  189.          logo.scaleY = logo.scaleX;
  190.          logo.x = Math.round((stage.stageWidth - logo.width) / 2 + 60);
  191.          logo.y = Math.round((stage.stageHeight - logo.height) / 2 + 20);
  192.          addChild(logo);
  193.          progressBar = new Sprite();
  194.          border = new Sprite();
  195.          border.graphics.beginFill(16777215,0);
  196.          border.graphics.lineStyle(1,15329769,1,true);
  197.          border.graphics.drawRoundRect(0,0,330,14,10,10);
  198.          border.graphics.endFill();
  199.          progresser = new Sprite();
  200.          progresser.graphics.beginFill(3516897,1);
  201.          progresser.graphics.drawRoundRect(0,0,1,14,10,10);
  202.          progresser.graphics.endFill();
  203.          progresser.y = 0;
  204.          progresser.x = 0;
  205.          progressBar.addChild(progresser);
  206.          progressBar.addChild(border);
  207.          addChild(progressBar);
  208.          progressBar.x = Math.round((stage.stageWidth - progressBar.width) / 2);
  209.          progressBar.y = Math.round((stage.stageHeight - progressBar.height) / 2);
  210.       }
  211.       
  212.       private function onMetaDataHandler(param1:Object) : void
  213.       {
  214.          duration = param1.duration;
  215.          vwidth = param1.width;
  216.          vheight = param1.height;
  217.       }
  218.       
  219.       private function loadIntro() : void
  220.       {
  221.          nc = new NetConnection();
  222.          nc.connect(null);
  223.          nc.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
  224.          _metaData = new Object();
  225.          _metaData.onMetaData = onMetaDataHandler;
  226.          ns = new NetStream(nc);
  227.          ns.client = _metaData;
  228.          ns.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
  229.          video.attachNetStream(ns);
  230.          ns.play(Application.path + "media/intro.mp4");
  231.          var _loc1_:SoundTransform = new SoundTransform(volume);
  232.          ns.soundTransform = _loc1_;
  233.          video.width = Forms.getFormByName("MainForm").width;
  234.          video.height = Forms.getFormByName("MainForm").width / 1280 * 720;
  235.          video.y = (Forms.getFormByName("MainForm").height - video.height) / 2;
  236.          video.x = 0;
  237.          videobg.addEventListener(MouseEvent.MOUSE_DOWN,skipIntro);
  238.          videobg.buttonMode = true;
  239.       }
  240.       
  241.       private function onHideIntro(param1:Event) : void
  242.       {
  243.          trace("CHROME HIDE INTRO");
  244.          content.removeEventListener("loading",onLoading);
  245.          removeChild(progressBar);
  246.          removeChild(label);
  247.          removeChild(versionLabel);
  248.          removeChild(logo);
  249.          loadIntro();
  250.          iscontent = true;
  251.       }
  252.       
  253.       private function skipIntro(param1:MouseEvent) : void
  254.       {
  255.          trace("skipIntro");
  256.          completeTimer.stop();
  257.          ns.pause();
  258.          nc.close();
  259.          introOver = true;
  260.          videobg.removeEventListener(MouseEvent.MOUSE_DOWN,skipIntro);
  261.          removeChild(videobg);
  262.          removeChild(video);
  263.          content["onCompleteIntro"]();
  264.       }
  265.       
  266.       private function activateFullScreen(param1:Event) : void
  267.       {
  268.          Forms.getFormByName("MainForm").showFullScreen(true);
  269.       }
  270.       
  271.       private function LoadXML(param1:Event) : void
  272.       {
  273.          xmlData = new XML(param1.target.data);
  274.          closewindowlabel = xmlData.projectordata.closewindow.label;
  275.          closewindowtext = xmlData.projectordata.closewindow.text;
  276.          closewindowcancellabel = xmlData.projectordata.closewindow.cancelbuttonlabel;
  277.          closewindowcloselabel = xmlData.projectordata.closewindow.closebuttonlabel;
  278.          loadingscreenlabel = xmlData.projectordata.loadingscreen.label;
  279.          loadingscreenversion = xmlData.projectordata.loadingscreen.version;
  280.          initApp();
  281.       }
  282.       
  283.       private function init1(param1:Event) : void
  284.       {
  285.          parseXML();
  286.       }
  287.       
  288.       private function onCancel(param1:Event) : void
  289.       {
  290.          if(iscontent && introOver)
  291.          {
  292.             content["onPlay"]();
  293.          }
  294.       }
  295.       
  296.       private function onCloseApp(param1:Event) : void
  297.       {
  298.          if(iscontent)
  299.          {
  300.             videobg.visible = false;
  301.             video.visible = false;
  302.             ns.pause();
  303.             content["onoutro"]();
  304.          }
  305.          else
  306.          {
  307.             Application.exit();
  308.          }
  309.       }
  310.       
  311.       private function onOut(param1:MouseEvent) : void
  312.       {
  313.          param1.target.gotoAndStop(1);
  314.       }
  315.       
  316.       private function onProgress(param1:Number, param2:Number) : void
  317.       {
  318.          var _loc3_:Number = 0;
  319.          if(progressInit)
  320.          {
  321.             _loc3_ = 330 / param1 * param2 + 5;
  322.             if(_loc3_ > 330)
  323.             {
  324.                _loc3_ = 330;
  325.             }
  326.          }
  327.          if(param1 == param2 * 2 && !progressInit)
  328.          {
  329.             progressInit = true;
  330.          }
  331.          progresser.graphics.clear();
  332.          progresser.graphics.beginFill(2992866,1);
  333.          progresser.graphics.drawRoundRect(0,0,_loc3_,14,10,10);
  334.          progresser.graphics.endFill();
  335.       }
  336.       
  337.       private function initZinc() : void
  338.       {
  339.          Application.enableExitHandler();
  340.          Application.onAppExit = this.onExit;
  341.       }
  342.       
  343.       private function onOver(param1:MouseEvent) : void
  344.       {
  345.          param1.target.gotoAndStop(2);
  346.       }
  347.       
  348.       private function netStatusHandler(param1:NetStatusEvent) : void
  349.       {
  350.          switch(param1.info.code)
  351.          {
  352.             case "NetStream.Play.Start":
  353.                trace("start");
  354.                completeTimer.start();
  355.                break;
  356.             case "NetStream.Buffer.Flush":
  357.          }
  358.       }
  359.       
  360.       private function parseXML() : void
  361.       {
  362.          xmlLoader = new URLLoader();
  363.          xmlData = new XML();
  364.          xmlLoader.addEventListener(Event.COMPLETE,LoadXML);
  365.          xmlLoader.load(new URLRequest(Application.path + "system/data/projector.xml"));
  366.       }
  367.       
  368.       private function onLoading(param1:Event) : void
  369.       {
  370.          onProgress(param1.target.total,param1.target.loaded);
  371.       }
  372.       
  373.       private function toogleSize(param1:MouseEvent = null) : void
  374.       {
  375.          trace("toogleSize");
  376.          isMoveTimer = false;
  377.          if(maximized)
  378.          {
  379.             hideFullScreen();
  380.             if(mode == STANDARD && !maximized)
  381.             {
  382.                Forms.getFormByName("MainForm").x = oldX;
  383.                Forms.getFormByName("MainForm").y = oldY;
  384.             }
  385.             else if(mode == MINI && !maximized)
  386.             {
  387.                Forms.getFormByName("MainForm").x = miniX;
  388.                Forms.getFormByName("MainForm").y = miniY;
  389.             }
  390.          }
  391.          else
  392.          {
  393.             Application.bringToFront(true);
  394.             Application.bringToFront(false);
  395.             Application.sendToBack();
  396.             showFullScreen();
  397.          }
  398.       }
  399.       
  400.       private function onChange(param1:Event) : void
  401.       {
  402.          if(param1.target.modi == 0 && mode != FULLSCREEN)
  403.          {
  404.             stopBringToFront();
  405.             mode = FULLSCREEN;
  406.             toogleSize();
  407.          }
  408.          else if(param1.target.modi == 1 && mode != STANDARD)
  409.          {
  410.             stopBringToFront();
  411.             mode = STANDARD;
  412.             Forms.getFormByName("MainForm").showFullScreen(false);
  413.             Forms.getFormByName("MainForm").x = oldX;
  414.             Forms.getFormByName("MainForm").y = oldY;
  415.             Forms.getFormByName("MainForm").setModiSize(oldWidth,oldHeight);
  416.          }
  417.          else if(param1.target.modi == 2 && mode != MINI)
  418.          {
  419.             mode = MINI;
  420.             Forms.getFormByName("MainForm").showFullScreen(false);
  421.             startBringToFront();
  422.             Forms.getFormByName("MainForm").setModiSize(miniWidth,miniHeight);
  423.             Forms.getFormByName("MainForm").x = miniX;
  424.             Forms.getFormByName("MainForm").y = miniY;
  425.          }
  426.       }
  427.       
  428.       private function setButtonPosition(param1:String) : void
  429.       {
  430.       }
  431.       
  432.       private function deactivateFullScreen(param1:Event) : void
  433.       {
  434.          Forms.getFormByName("MainForm").showFullScreen(false);
  435.       }
  436.       
  437.       private function onFinalExit(param1:MouseEvent) : void
  438.       {
  439.          Application.exit();
  440.       }
  441.       
  442.       private function onExit() : void
  443.       {
  444.          closeWindow.show();
  445.          if(iscontent)
  446.          {
  447.             content["onPause"]();
  448.             content["onexit"]();
  449.          }
  450.       }
  451.       
  452.       private function stopBringToFront() : void
  453.       {
  454.          Application.bringToFront(false);
  455.          Application.sendToBack();
  456.       }
  457.       
  458.       private function createProgressBarLabels() : void
  459.       {
  460.          var _loc1_:TextFormat = new TextFormat();
  461.          _loc1_.color = 16777215;
  462.          _loc1_.font = new REGULAR().fontName;
  463.          _loc1_.size = 18;
  464.          var _loc2_:TextFormat = new TextFormat();
  465.          _loc2_.color = 16777215;
  466.          _loc2_.font = new REGULAR().fontName;
  467.          _loc2_.size = 14;
  468.          label = new TextField();
  469.          label.antiAliasType = AntiAliasType.ADVANCED;
  470.          label.embedFonts = true;
  471.          label.type = TextFieldType.DYNAMIC;
  472.          label.selectable = false;
  473.          label.multiline = true;
  474.          label.wordWrap = true;
  475.          label.autoSize = TextFieldAutoSize.LEFT;
  476.          label.width = 330;
  477.          label.defaultTextFormat = _loc1_;
  478.          label.setTextFormat(_loc1_);
  479.          label.htmlText = loadingscreenlabel;
  480.          addChild(label);
  481.          versionLabel = new TextField();
  482.          versionLabel.antiAliasType = AntiAliasType.ADVANCED;
  483.          versionLabel.embedFonts = true;
  484.          versionLabel.type = TextFieldType.DYNAMIC;
  485.          versionLabel.selectable = false;
  486.          versionLabel.multiline = true;
  487.          versionLabel.wordWrap = true;
  488.          versionLabel.autoSize = TextFieldAutoSize.LEFT;
  489.          versionLabel.defaultTextFormat = _loc2_;
  490.          versionLabel.setTextFormat(_loc2_);
  491.          versionLabel.htmlText = loadingscreenversion;
  492.          addChild(versionLabel);
  493.          label.x = Math.round(progressBar.x);
  494.          label.y = Math.round(progressBar.y - label.height - 8);
  495.          versionLabel.x = Math.round(progressBar.x + progressBar.width - versionLabel.width + 14);
  496.          versionLabel.y = Math.round(progressBar.y + progressBar.height + 8);
  497.       }
  498.       
  499.       private function onCompleteCheck(param1:TimerEvent) : void
  500.       {
  501.          if(Math.round(duration) == Math.round(ns.time) && Math.round(duration) > 0)
  502.          {
  503.             introOver = true;
  504.             completeTimer.stop();
  505.             removeChild(videobg);
  506.             removeChild(video);
  507.             content["onCompleteIntro"]();
  508.          }
  509.       }
  510.       
  511.       private function loadContent() : void
  512.       {
  513.          var _loc1_:Loader = new Loader();
  514.          var _loc2_:URLRequest = new URLRequest(Application.path + "system/player.swf");
  515.          _loc1_.contentLoaderInfo.addEventListener(Event.COMPLETE,loadedContent);
  516.          _loc1_.load(_loc2_);
  517.       }
  518.       
  519.       private function loadedContent(param1:Event) : void
  520.       {
  521.          content = param1.target.content as Sprite;
  522.          content.addEventListener("modichange",onChange);
  523.          content.addEventListener("hideintro",onHideIntro);
  524.          content.addEventListener("loading",onLoading);
  525.          content.addEventListener("openfullscreen",activateFullScreen);
  526.          content.addEventListener("closefullscreen",deactivateFullScreen);
  527.          content.addEventListener("onvolume",onVolume);
  528.          content.addEventListener("packshotcomplete",onPackshotComplete);
  529.          content.addEventListener("hidepackshot",onPackshotComplete);
  530.          content.y = -20;
  531.          sp.addChild(content);
  532.       }
  533.       
  534.       private function showFullScreen(param1:Event = null) : void
  535.       {
  536.          if(mode == FULLSCREEN)
  537.          {
  538.             trace("Fullscreen");
  539.             Forms.getFormByName("MainForm").showFullScreen(true);
  540.          }
  541.          else
  542.          {
  543.             Forms.getFormByName("MainForm").showFullScreen(false);
  544.          }
  545.       }
  546.       
  547.       private function resize(param1:Event = null) : void
  548.       {
  549.          trace("resize ");
  550.          if(!maximized)
  551.          {
  552.             trace("!isMaximized " + mode + " > " + stage.stageWidth + " x " + stage.stageHeight);
  553.             if(mode == STANDARD)
  554.             {
  555.                if(stage.stageWidth < 1024 || stage.stageHeight < 685)
  556.                {
  557.                   Forms.getFormByName("MainForm").setSize(1024,685);
  558.                }
  559.                else if(stage.stageWidth > 1024 || stage.stageHeight > 685)
  560.                {
  561.                   if(stage.stageWidth / 1024 < stage.stageHeight / 685)
  562.                   {
  563.                      Forms.getFormByName("MainForm").setSize((stage.stageHeight - 109) * (1024 / 576),stage.stageHeight - 109);
  564.                   }
  565.                   else
  566.                   {
  567.                      Forms.getFormByName("MainForm").setSize(stage.stageWidth,stage.stageWidth * (576 / 1024) + 109);
  568.                   }
  569.                }
  570.             }
  571.             if(mode == MINI)
  572.             {
  573.                if(stage.stageWidth < 575 && stage.stageHeight < 387)
  574.                {
  575.                   Forms.getFormByName("MainForm").setSize(575,323 + 64);
  576.                }
  577.                else if(stage.stageWidth < 1280)
  578.                {
  579.                   if(stage.stageWidth / 575 < stage.stageHeight / 387)
  580.                   {
  581.                      Forms.getFormByName("MainForm").setSize(stage.stageWidth,stage.stageWidth * (323 / 575) + 64);
  582.                   }
  583.                   else
  584.                   {
  585.                      Forms.getFormByName("MainForm").setSize((stage.stageHeight - 64) * (575 / 323),stage.stageHeight);
  586.                   }
  587.                }
  588.                else
  589.                {
  590.                   Forms.getFormByName("MainForm").setSize(1280,1280 * (323 / 575) + 64);
  591.                }
  592.             }
  593.          }
  594.          if(mode == STANDARD && !maximized)
  595.          {
  596.             oldX = Forms.getFormByName("MainForm").x;
  597.             oldY = Forms.getFormByName("MainForm").y;
  598.             oldWidth = Forms.getFormByName("MainForm").width;
  599.             oldHeight = Forms.getFormByName("MainForm").height;
  600.          }
  601.          else if(mode == MINI && !maximized)
  602.          {
  603.             miniX = Forms.getFormByName("MainForm").x;
  604.             miniY = Forms.getFormByName("MainForm").y;
  605.             miniWidth = Forms.getFormByName("MainForm").width;
  606.             miniHeight = Forms.getFormByName("MainForm").height;
  607.          }
  608.       }
  609.       
  610.       private function hideFullScreen(param1:Event = null) : void
  611.       {
  612.          if(maximized)
  613.          {
  614.             maximized = false;
  615.             Forms.getFormByName("MainForm").showFullScreen(false);
  616.             if(mode == STANDARD && !maximized)
  617.             {
  618.                Forms.getFormByName("MainForm").x = oldX;
  619.                Forms.getFormByName("MainForm").y = oldY;
  620.                Forms.getFormByName("MainForm").width = oldWidth;
  621.                Forms.getFormByName("MainForm").height = oldHeight;
  622.             }
  623.             else if(mode == MINI && !maximized)
  624.             {
  625.                Forms.getFormByName("MainForm").x = miniX;
  626.                Forms.getFormByName("MainForm").y = miniY;
  627.                Forms.getFormByName("MainForm").width = miniWidth;
  628.                Forms.getFormByName("MainForm").height = miniHeight;
  629.             }
  630.          }
  631.       }
  632.       
  633.       private function checkMaxScreen() : void
  634.       {
  635.          if(System.screenWidth >= 1280 && System.screenHeight >= 839)
  636.          {
  637.             Forms.getFormByName("MainForm").width = 1280;
  638.             Forms.getFormByName("MainForm").height = 720 + 109;
  639.          }
  640.          else
  641.          {
  642.             Forms.getFormByName("MainForm").width = 1024;
  643.             Forms.getFormByName("MainForm").height = 576 + 109;
  644.          }
  645.          miniHeight = 387;
  646.          miniWidth = 575;
  647.          miniX = (System.screenWidth - 575) / 2;
  648.          miniY = (System.screenHeight - 387) / 2;
  649.          Forms.getFormByName("MainForm").x = (System.screenWidth - Forms.getFormByName("MainForm").width) / 2;
  650.          Forms.getFormByName("MainForm").y = (System.screenHeight - Forms.getFormByName("MainForm").height) / 2;
  651.          oldX = Forms.getFormByName("MainForm").x;
  652.          oldY = Forms.getFormByName("MainForm").y;
  653.          oldWidth = Forms.getFormByName("MainForm").width;
  654.          oldHeight = Forms.getFormByName("MainForm").height;
  655.       }
  656.       
  657.       private function onVolume(param1:Event) : void
  658.       {
  659.          volume = param1.target.volume;
  660.       }
  661.       
  662.       private function onPackshotComplete(param1:Event) : void
  663.       {
  664.          trace("PACKSHOTCOMPLETE");
  665.       }
  666.       
  667.       private function startBringToFront() : void
  668.       {
  669.          Application.bringToFront(true);
  670.       }
  671.    }
  672. }
  673.  
  674.