protected override void setup_resources()
        {
            base.setup_resources();
            output = ResourceLine.ParseResourcesToList(OutputResources);
            if (output == null)
            {
                this.ConfigurationInvalid("unable to initialize OUTPUT resources");
                return;
            }
            output.ForEach(r => r.InitializePump(part, -RatesMultiplier));
            //mass flow conservation
            var net_mf = mass_flow(input) + mass_flow(output);

            if (net_mf < 0)
            {
                this.ConfigurationInvalid("the mass flow of input resources is less then that of output resources");
                return;
            }
            if (net_mf > 0) //initialize waste resource
            {
                var waste_res = this.GetResourceDef(WasteResource);
                if (waste_res == null)
                {
                    return;
                }
                if (waste_res.density == 0)
                {
                    this.ConfigurationInvalid("WasteResource should have non-zero density");
                    return;
                }
                waste = new ResourceLine(part, waste_res, -net_mf);
            }
        }
 protected virtual void setup_resources()
 {
     //parse input/output resources
     input = ResourceLine.ParseResourcesToList(InputResources);
     if (input == null)
     {
         this.ConfigurationInvalid("unable to initialize INPUT resources");
         return;
     }
     input.ForEach(r => r.InitializePump(part, RatesMultiplier));
 }